专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

关键字(this、super、final、static)

1、this关键字:

(1)用于区分局部变量与成员变量重名问题,this代表成员变量。

package Circle;

public class Circle {
public double  Pi=3.1415926;
public double radius;
public Circle(double radius){
    this.radius=radius;
}
public double getRadius(){
   return radius; 
}

public void updateRadius(double radius){
   this.radius=radius;
}

public void getArea(){
    System.out.println("圆的面积:"+radius*radius*Pi);
}
}

其中,带this的是实例变量,不带this关键字的是局部变量。

(2)一个构造方法调用本类的其它构造方法:

class Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Person(String name) {
        this.name = name;
    }

    public Person(String name, int age) {
        this(name);
        this.age = age;
    }

    public String toString() {
        return "Tom [name=" + name + ", age=" + age + "]";
    }
}

public class ThisDemo {
    public static void main(String[] args) {
        Person per = new Person("Tom", 12);
        System.out.println(per.toString());

    }
}

注意:this()调用构造方法的语句必须放在构造方法的首行。

35_1.png

如图:调换位置后报错。

2、super关键字

(1)子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法。在子类的构造方法中可使用语句 super(参数列表) 调用父类的构造方法。

创建Person类:

public class Person {
    protected String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void sleep() {
        System.out.println("睡觉");
    }

    public void eat() {
        System.out.println("吃饭");
    }
    public Person(String name,int age){//父类的构造方法
        this.name=name;
        this.age=age;
    }
}

创建Student类:

public class Student extends Person {
    public Student(String name, int age) {//子类的构造方法,调用父类的构造方法
        super(name, age);//super()语句必须在第一句
    }

    public void study() {
        System.out.println(name + "在学习,他" + super.getAge() + "岁了");
    }

}

测试类:

public class Test {
    public static void main(String[] args) {
        Student s = new Student("Tom",12);
        s.study();
    }
}

35_2.png

(2)如果子类的构造方法中没有调用父类构造方法,则在产生子类的实例对象时,系统默认调用父类无参数的构造方法:

创建父类Person类:

public class Person {
    protected String name;
    protected int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void sleep() {
        System.out.println("睡觉");
    }

    public void eat() {
        System.out.println("吃饭");
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
        System.out.println("父类无参的构造方法被调用了");
    }
}

创建Student类,继承Person类:

public class Student extends Person {
    // public Student(String name,int age){//子类没有调用父类的构造方法
    // super(name,age);
    // }

    public void study() {
        System.out.println(name + "在学习,他" + super.getAge() + "岁了");
    }

}

子类的构造方法未调用父类的构造方法,要保证父类中有无参的构造方法。

测试类:

public class Test {
    public static void main(String[] args) {
        Student s = new Student();
        s.study();
    }
}

35_3.png

注意:如果将父类无参的构造方法去掉,程序将报错。

35_4.png

所以:如果子类构造方法,未调用父类的构造方法,需要在父类中定义一个“不做事的”构造方法。

此例中可在父类中定义空参的构造方法:

public Person(){

}

(3)super(子类)调用父类的成员变量和成员方法(处理子类与父类的成员变量或成员方法同名问题):

子类中的成员变量或方法名优先级高,所以子类中的同名成员变量或方法就隐藏了父类的成员变量或方法,但是我们如果想要使用父类中的成员变量或方法,就需要用到super关键字。

创建动物类:

package super调用父类变量;

public class Animal {
    protected String name;

    public Animal(String name) {
        this.name = name;
    }

    public Animal() { } }

创建Cat类:

package super调用父类变量;

public class Cat extends Animal {
    protected String name;

    public Cat(String Animalname, String Catname) {
        super.name = Animalname;
        name = Catname; } public String toString() { return "我是" + super.name + ",我叫" + name; } }

测试类:

package super调用父类变量;

public class Test {
    public static void main(String[] args) {
        Cat cat = new Cat("猫科动物", "Tom猫");
        System.out.println(cat.toString());
    }
}

在同名的问题上:this关键字用于处理本类的属性和方法同名,而super关键字用于解决子类和父类的同名问题。

3、final关键字

  • final意思是,最终,如果一个类不想被子类继承,或者不想被子类的方法重写,可以用final修饰此类,final类中的方法默认也会是final类型的。final关键字可以修饰类、类的成员变量、类的成员方法、局部变量。
  • 将变量或方法声明为final,可以保证它们在使用中不被改变。如:String类就是final的,当然它声明为final类型的类有一部分因素是不想被重写,提高安全性,但是还有其他的因素:https://tech.souyunku.com/zhai1997/p/12354769.html

(1)被final关键字修饰后的变量(成员变量、局部变量)只能赋值一次,final修饰后的变量只能在这个类的内部使用,不能在类的外部直接使用:

35_5.png

运行结果为:90

再向a赋值时出现错误:

35_6.png

(2)引用类型的变量值为对象地址值,赋值之后,地址不能再更改,但是地址内的对象属性值可以修改。

35_7.png

如图:再次向Cat对象赋值时,报错。

(3)final 标记的成员变量必须在声明的同时或在该类的构造方法中显式赋值,这两种赋值方式只能任选其一,赋值成功后该变量就不能再修改了,被final修饰的方法野之能使用,不能重写

35_8.png

赋值之后错误消失:

35_9.png

4、static关键字

static关键字可以修饰成员变量、成员方法、代码块。它们都被称为静态成员,归整个类所有,不依赖于类的特定实例,为类的所有实例所共享。

(1) 静态变量和实例变量:

静态变量:在加载类的时候为静态变量分配一次内存(java虚拟机只为静态变量分配一次内存)。在类外,可以通过类名直接调用。

实例变量:每创建一个实例java虚拟机就为实例变量就分配一次空间。

(2)被static关键字修饰后的成员变量属于整个类,不属于类的某个对象。

例如:

在StaticDemo类中定义一个static类型的成员变量:

public class StaticDemo {
public static int a=1;
}

创建测试类:

public class Test {
    public static void main(String[] args) {
        StaticDemo ad1 = new StaticDemo();
        ad1.a = 100;
        System.out.println(ad1.a);
        StaticDemo ad2 = new StaticDemo();
        System.out.println(ad2.a);

    }

}

两次输出的值都为100.

改变一个对象的值,另外一个对象的值也跟着改变。

2、被static修饰的成员方法:

(1)静态方法不依赖于任何人对象,没有this关键字(不需要实例化)。

(2)静态不能访问非静态变量和方法(需要具体的对象)。

3、static关键字的好处:

(1)不用创建对象,也能使用类中的属性和方法;

(2)效率高;不用多次占用内存。

文章永久链接:https://tech.souyunku.com/22672

未经允许不得转载:搜云库技术团队 » 关键字(this、super、final、static)

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们