java学习笔记--基础知识--final

可拜读 https://www.jianshu.com/p/f68d6ef2dcf0

 

final 可以用来修饰类 方法 和 变量(变量包括类变量,实例变量,局部变量,方法的参数)

修饰类时

当final修饰类时,表示该类不可被继承。 java中String类就是final类。 final类的方法也将成为final方法。

什么时候用final修饰类呢?  该类完美实现了所有功能,不需要任何扩展(不太可能)

 

修饰方法时

方法被final修饰后,子类不能对其进行重写

什么时候用final修饰类呢? 为了提高性能(实现内联来实现性能,未必能够提高性能)

 

修饰变量时

final修饰的变量,可以在定义时出示话,使用初始化块初始化,也可以在构造函数中初始化

修饰基本类型的变量

  1. 程序编译期间的常量,它永远不会变。
  2. 在运行期间为一个final修饰的域初始化一个值,不希望它会发生变化(构造器初始化,属于这种)。
package others;

public class finalkeyword {
	
	//定义时初始化
	static final int NUM1 = 1;
	
	//使用初始化块初始化
	static final int NUM2;
	static {
		NUM2 = 10;
	}
	
	//定义时初始化
	final int NUM3 = 1;
	
	//使用初始化块初始化
	final int NUM4;
	{
		NUM4 = 10;
	}
	
	
	//构造器中初始化,只适用于实例变量
	final int NUM5;
	public finalkeyword(){
		
		NUM5 = 1;
		
	}
	

}

 

修饰引用类型的变量

与基本类型不同,final修饰的引用类型,不可改变的只是变量中的对象的句柄,也就是说不能执行其他对象,但是对象中的数据还是可以修改的。

这里final涉及到一个闭包实现的问题。  闭包的实现方式可以参考这里


interface ILog{
	
	void Write(String msg);
}



public class DemoClass4 {

    public ILog logger(int level) {//要么把level设置final的,要么声明个final loglevel
        //final
        final int logLevel = level+1;

        return new ILog() {
            @Override
            public void Write(String message) {
                System.out.println("DemoClass4.AnonymousClass:InfoLog " + logLevel);
                System.out.println(message);
            }
        };    
      
    }
    

    public static void main(String[] args){
        DemoClass4 demoClass4 = new DemoClass4();
        demoClass4.logger(1).Write("abcefghi");
        
        ILog log1 = demoClass4.logger(1);
        ILog log2 = demoClass4.logger(2);
        
        log1.Write("abc");
        log2.Write("def");
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值