Final关键字的详细学习(有代码讲解)

本文详细介绍了Java中final关键字在修饰属性、类、方法以及局部变量时的用法,包括禁止继承、防止方法重写、以及final修饰静态属性的区别。此外,还探讨了final与构造器、代码块的关系以及final类的实例化特性。
摘要由CSDN通过智能技术生成

final的基本用法:用来修饰属性,类,方法,局部变量

  • 使用final 代表该内容固定不懂 不能修改

当希望子类不要被继承时候 可以使用final

class A{}
class B extends A{}
//这里B 可以继承 A
final class A{}
class B extends A{}
//有final关键字  B 不能继承 A 

当不希望方法被重写时 使用final

  • 访问修饰符 final 返回类型 方法名
class A{
public void k1(){}
public void k1(String n){}
//这里没问题
public final void k1(){}
public void k1(String n){}
//不能进行方法重写
}

当你不希望类中的属性或者是主方法中的局部变量被修改的时候 使用final

public class run{
	public static void main(String args[ ]){
	     A aaa=new A();
	     aaa.a=1000; // 可修改  但如果A  中是 public final int a =100;  就不能修改
	  			}
	}
class A{
public int a=100;//属性
public void nums(){
		int final b = 30; // final 要注意是不能修改的
		b = 1000; //报错  这里是不能修改的;
}


}

final使用细节:

  • final修饰的属性在定义时候只有3种方式:

初始化
构造器定义
代码块

class A{
    public final int a1=10;//初始化
    
    public final int a2;//构造器初始化
    public A(int a2){
        this.a2 = 10;
    }

    public final int a3;//代码块初始化

    /**
     * 复习*代码块*知识:
     * 创建对象就会调用代码块
     * 静态的代码块static只能调用一次  且在类被加载的时候就调用
     * 类的加载:对象的创建  子类被调用 父类就被加载   类的static变量被调用
     */
    {
        a3=10;
    }


}
  • final修饰static属性在定义时候只有2种方式:

初始化
加static的代码块

class A{
    /**
     *  final修饰的属性是静态时,定义方式两种
     *  初始化
     *  加static的代码块
     */
   
    public final static int a1=10;//初始化

    public final static int a2;//static的代码块初始化
    static{
        a2 = 10;
    }

    public final static int a3;//不能通过构造器初始化
    public A(int a3){
        this.a3 = 10;//报错  static类变量不能接触 this 或者 super
    }
}

  • final类不能继承但可以实例化对象
  • 如果类不是final类 但含有final方法 可以继承该类 同时可以在子类调用 但无法修改该方法
public class finalMethod {
    public static void main(String[] args) {
        A a = new A();
        System.out.println(A.a1);
        C c = new C();//继承B 后的C 对象  调用B 的printB方法
        c.printB();

    }

}
final class A{
    /**
     * final不能继承但可以实例化对象
     * 如果类不是final类  但含有final方法 可以继承该类  同时可以在子类调用  但无法修改该方法
     */


    public final static int a1=10;//初始化


}
class B{
    public int c1 = 0;
    public final void printB(){  //final关键字  所以方法不能修改
        System.out.println(c1);
    }
}
class C extends  B{

}
  • 如果是final类 就没有必要把属性和方法加final

  • final不能修饰构造器方法

  • final与static 配合不会导致类的加载(demo演示)

public class finalMethod {
    public static void main(String[] args) {
        System.out.println(A.a);
    }
}

class A{
    public static int a = 10;
    static{
        System.out.println("类被加载");
    }
}
//输出打印结果是:
//类被加载
//10
public class finalMethod {
    public static void main(String[] args) {
        System.out.println(A.a);
    }
}

class A{
    public final static int a = 10;
    static{
        System.out.println("类被加载");
    }
}
//输出打印结果是:
//10

*包装类 Double和String 是final类 不能再被继承

看到这里恭喜你final基本掌握了哈哈哈哈哈哈~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值