原创

Java中的final、static、this、super



final

意思是最终的、不可修改的,用来修饰类、方法和变量,具有以下特点:

1)修饰类时,类不能被继承,类中的所有成员方法都会隐式的指定为final方法;

2)修饰方法时,方法不能被子类重写,但会被子类继承;

3)修饰变量时,如果变量是基本数据类型,则该变量为常量,数值一旦在初始化之后便不能更改;如果变量为引用类型,则在对其初始化之后便不能再让其指向另一个对象,但引用的对象本身可以修改。


static

意思是静态的、静止的,主要有以下四种使用场景:

1)修饰成员变量和成员方法时,被 static 修饰的成员属于类,不单属类的某个实例对象,被类中所有对象共享,可以并且建议通过类名调用。被static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区。调用格式:类名.静态变量名类名.静态方法名

2)修饰代码块时,static修饰的代码块为静态代码块,静态代码块只会在类被加载时执行一次;

3)修饰内部类时,静态内部类与非静态内部类之间存在一个最大的区别: 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着:1. 它的创建是不需要依赖外围类的创建。2. 它不能使用任何外围类的非static成员变量和方法。

4)静态导包,格式为:import static 这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法。


this

一般用来代指当前对象,通过this可以调用本对象的所有方和和属性,主要有以下几种使用场景:

1)当局部变量形参)和成员变量命名相同时,使用this修饰的为成员变量;

class Person{
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public boolean compare(String name){
        return this.name.equals(name);
    }
}

2)在内部类中使用外部类.this来指向外部类

class Person{
    private String name;
    //内部类
    class Inner{
        private String name;
        void test(){
            this.name = Person.this.name;
        }
    }
}

3)将类本身当作参数传递时。

class Person{
    private String name;

    public Person getPerson(){
        return this;
    }
}


super

用于在子类中代指父类对象,可以访问父类的方法和变量,主要使用场景:

1)访问父类变量:

class Father{
    int age = 30;
}

class Son extends Father{
    int age = 5;
    void getAge(){
        System.out.println(age);    //输出5
        System.out.println(super.age); //输出30
    }
}

2)调用父类构造方法:

class Father{
    int age = 30;
    public Father(){
        System.out.println(age);
    }
    public Father(int age){
        System.out.println(age);
    }
}

class Son extends Father{
    int age = 5;
    public Son(){
        //这里不调用则系统会自动隐式调用父类无参构造,如果显示调用,必须在函数第一行
        super(); 
        System.out.println(age);
    }
    public Son(int age){
        //显示调用父类有参构造
        super(age+25);
        System.out.println(age);
    }

    public static void main(String[] args) {
        Son son = new Son(); //输出 30 5
        son = new Son(5); //输出30 5
    }
}

这里注意,子类的构造过程中必须调用父类构造方法,如果在子类的构造方法中没有显示的调用父类构造方法,系统会默认调用父类的无参构造方法;如果显示调用父类构造方法,则必须在函数的第一行调用;如果子类构造方法中没有显示调用父类构造方法,而父类也没有无参的构造函数,则编译错误。

3)访问父类方法:

class Father{
    public void speak(String word){
        System.out.println("爸爸说:"+word);
    }
}

class Son extends Father{
    @Override
    public void speak(String word) {
        //调用父类方法
        super.speak(word);
        System.out.println("儿子说:"+word);
    }

    public static void main(String[] args) {
        Son son = new Son();
        son.speak("上山打老虎!");  //爸爸说:上山打老虎!  儿子说:上山打老虎!
    }
}
正文到此结束