Final 简介,权限、内部类

final

final表示最终的,不可变的。

final可以修饰变量以及方法,还有类等。

final修饰的类(无法被继承)

final class A{
    //A 是没有子孙的
}
class B extends A{
    //错误的, 无法从最终类A进行继承
    //B类继承A类 相当于对A类功能进行扩展
    //如果不希望别人对A类进行扩展,可以给A类加final关键字,如String类
}


final修饰的方法(无法被覆盖,重写)

class C{
    public final void doSome(){
       System.out.println("C's doSome...")
    } 
}
class D extends C{
 //错误,无法覆盖
 /*   public  void doSome(){
     System.out.println("D's doSome...")
    } */
}


final修饰的局部变量(只能赋一次值)

public class FinalTest01{
    public static void main(String[]args){
        //局部变量
        int i=100;
        //重新赋值, 没问题
        i=200;
        
        // 再定义一个局部变量 
        final int k=100;
        //重新赋值
        //错误: 无法为最终变量k分配值
       // k=300;
    }
}



final修饰的实例变量(必须手动赋值)

/*
一般情况下
实例变量如果还没有赋值的话,系统会赋默认值

final 修饰实例变量:
系统不负责赋默认值,要求程序员必须手动赋值,只能赋一次,
这个手动赋值,在变量后面赋值可以,在构造方法中赋值也可以

*/
public class FinalTest02(){
    public static void main(String[]args){
        
    }
}


class User{
    //实例变量
    
    //错误: 变量age未在默认构造器中初始化
    //final int age;
    final int age=10;
    
    //在构造方法中赋值 weight只赋一次值
    final double weight;
    //构造方法
    public User(){   
        this.weight=80;
        //系统赋默认值在这个时候,final修饰后,系统不会赋值
        //this.weight=0;
     
    }
    
    
}


常量
   final修饰的实例变量。必须手动赋值
   final修饰的变量,只能赋一次值

final修饰的实例变量一般添加static修饰 变成静态的,存储在方法区,节省空间。

结论:static final联合修饰的变量成为“常量”
     常量名要全部大写,每个单词之间采用下划线衔接
     
常量:实际上和静态变量一样 区别在于:常量的值不能变。
     
     常量和静态变量,都是存储在方法区,并且都是在类加载时初始化
     
     常量一般都是公开的:public的。

权限、内部类

   在Java中,可以将一个类定义在另一个类里面或者一个方法里边,这样的类称为内部类,广泛意义上的内部类一般包括四种:成员内部类,局部内部类,匿名内部类,静态内部类 。

1.成员内部类

    (1)该类像是外部类的一个成员,可以无条件的访问外部类的所有成员属性和成员方法(包括private成员和静态成员);

    (2)成员内部类拥有与外部类同名的成员变量时,会发生隐藏现象,即默认情况下访问的是成员内部类中的成员。如果要访问外部类中的成员,需要以下形式访问:【外部类.this.成员变量  或  外部类.this.成员方法】;

    (3)在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问;

    (4)成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象;

    (5)内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。如果成员内部类用private修饰,则只能在外部类的内部访问;如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。外部类只能被public和包访问两种权限修饰。

2.局部内部类

    (1)局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内;

    (2)局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的;

    (3)对于局部内部类,只有在方法的局部变量被标记为final或局部变量是effctively final的,内部类才能使用它们。

3.匿名内部类

    (1)一般使用匿名内部类来编写事件监听代码;

    (2)匿名内部类是不能有访问修饰符和static修饰符的;

    (3)匿名内部类是唯一一种没有构造器的类;

    (4)匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。

4.内部静态类

    (1)静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似;

    (2)不能使用外部类的非static成员变量或者方法。

猜你喜欢

转载自blog.csdn.net/m0_70051776/article/details/128075388
今日推荐