关键字-this、static、super、final

本文深入解析Java中this与static关键字的使用场景与规则,包括this调用本类属性与方法、表示当前对象,static定义类属性与方法,以及super和final关键字的特性与应用。通过具体代码示例,帮助读者理解这些关键字在实际编程中的作用。

1 this关键字

1.1 this调用本类属性

class Person{
    private String name;
    private int age;

    public Person(String name,int age) {
        this.name = name;
        this.age=age;
    }
    public String getInfo(){
        return "姓名"+name+"年龄"+age;
    }
}
public class Test{
    public static void main(String[] args) {
        Person per = new Person("张三",20);
        System.out.println(per.getInfo());
    }
}

通过以上代码我们发现,当参数与类中属性同名时,类中的属性无法被正确赋值,此时我们加上this关键字就可以正确赋值。

只要在类中方法访问类中属性,一定要加this关键字。

1.2 this调用本类方法

1.2.1 调用普通方法

this.方法名称(参数)

class Person{
    private String name;
    private int age;

    public Person(String name,int age) {
        this.name = name;
        this.age=age;
        this.print();
    }
    public String getInfo(){
        return "姓名:"+name+",年龄:"+age;
    }
    public void print(){
        System.out.println("-------------");
    }
}
public class Test{
    public static void main(String[] args) {
        Person per = new Person("张三",20);
        System.out.println(per.getInfo());
    }
}

1.2.2 调用构造方法

this(参数)

class Person{
    private String name;
    private int age;
    public Person(){
        System.out.println("----产生一个新的Person对象");
    }
    public Person(String name){
        System.out.println("----产生一个新的Person对象");
        this.name=name;
    }

    public Person(String name,int age) {
        System.out.println("----产生一个新的Person对象");
        this.name = name;
        this.age=age;
    }
    public String getInfo(){
        return "姓名:"+name+",年龄:"+age;
    }

}
public class Test{
    public static void main(String[] args) {
        Person per1 = new Person();
        Person per2 = new Person("李四");
        Person per3 = new Person("张三",20);
        System.out.println(per1.getInfo());
        System.out.println(per2.getInfo());
        System.out.println(per3.getInfo());
    }
}

在java中,支持代码的互相调用。

修改代码如下:

public Person(){
     System.out.println("----产生一个新的Person对象");
}
public Person(String name){
     this();
     this.name=name;
}

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

使用this调用构造方法时应注意:

  • this调用构造方法的语句必须在构造方法首行
  • 使用this调用构造方法时,请留有出口(不能成“环”)

1.3 this表示当前对象

class Person{
    public void print(){
        System.out.println("print方法"+this);
    }
}
public class Test{
    public static void main(String[] args) {
        Person per1 = new Person();
        System.out.println("main方法"+per1);
        per1.print();
        System.out.println("-------------------");
        Person per2 = new Person();
        System.out.println("main方法"+per2);
        per2.print();
    }
}

上述代码的执行结果是:

main方法com.bittech.Person@1540e19d
print方法com.bittech.Person@1540e19d
-------------------
main方法com.bittech.Person@677327b6
print方法com.bittech.Person@677327b6

只要对象调用了本类中的方法,这个this就表示当前执行的对象。

2 static关键字(与对象无关!!!)

2.1 static类属性

class Person{
    String Country = "中国";
    String name;
    int age;
    public void getInfo(){
        System.out.println("姓名:"+this.name+",年龄:"+this.age+",国家:"+this.Country);
    }
}
public class Test{
    public static void main(String[] args) {
        Person per1 = new Person();
        per1.name="张三";
        per1.age=20;
        Person per2 = new Person();
        per2.name="李四";
        per2.age=18;
        per1.getInfo();
        per2.getInfo();
    }
}

内存分析图如下:

传统属性所具备的特征:保存在堆内存中,且每个对象独享属性。

static属性:共享属性,保存在全局数据区的内存中,所有对象都可以进行该数据区的访问。

修改上述代码:

static Country =  "中国";

此时内存分析图如下:

结论:

  • 访问static属性(类属性)应使用类名称.属性名
  • 所有非static属性(实例变量)必须在对象实例化后使用,而static属性(类属性)不受对象实例化控制

若我们修改Country属性,所有的对象都同步共享此属性值。

Person country = "中华人民共和国";

如何选择实例变量和类属性呢?

非static属性称为成员变量或对象属性,每个对象都有此属性且值不一样。
要描述类似国家这种共享属性,可使用static修饰属性。

2.2 static类方法


直接使用static修饰方法,称为类方法,直接通过类名称调用,与对象实例化无关。

class Person{
    private static String country = "中国";
    private String name;
    private int age;

    public Person(String name,int age) {
        this.name = name;
        this.age = age;
    }
    public static void setCountry(String c){
        country = c;
    }

    public void getInfo(){
        System.out.println("姓名:"+this.name+",年龄:"+this.age+",国家:"+this.country);
    }
}
public class Test{
    public static void main(String[] args) {
        Person.setCountry("中国");
        Person per = new Person("张三",20);
        per.getInfo();
    }
}
  • 静态方法不能访问类中普通属性(静态方法与对象无关,普通属性必须要有对象)
  • 静态方法可以访问类中静态属性
  • 普通方法可以访问类中静态属性(所有对象共享静态属性)

使用static定义方法只有一个目的:某些方法不希望受对象的控制。

3 super关键字

子类调用父类构造方法时才使用。

例:使用super调用父类的同名方法。

class Father{
    public void print(){
        System.out.println("I am a father");
    }
}
class Child extends Father{
    public void print(){
        super.print();
        System.out.println("I am child");
    }
}
public class Test{
    public static void main(String[] args) {
        new Child().print();
    }
}

例:使用super调用父类属性

class Father{
    public String msg = "father!";
}
class Child extends Father{
    public String msg = "son!";
    public void print(){
        //不找本类的属性
        System.out.println(super.msg);
        System.out.println(this.msg);
    }
}
public class Test{
    public static void main(String[] args) {
        new Child().print();
    }
}

super和this的区别

方法覆写时使用的就是public权限。

4 final关键字

在java中final被称为终结器。

  • 使用final修饰类、方法、属性
  • final成员变量必须在声明的时候初始化,否则就会报编译错误
  • 使用final定义的类不能有子类(String类便是final定义)
  • final一旦修饰一个类之后,该类的所有方法默认都会加上final修饰。(不包含成员变量)
  • 使用final定义的方法不能被子类所覆写。
  • 使用final定义的变量就成为了常量,常量必须在声明时赋值,并且不能被修改。

public final int a=10;

数据类型转换

当使用+、-、*、/、%等数学运算时,遵循以下原则:
1.只要两个操作数中有一个是double/float/long类型,另外一个自动转为double/float/long类型,
结果也是double/float/long
2.操作数为byte、short、int、char时,两个操作数均会转为int类型,结果也是int
3.但是被final修饰的变量,数据类型不会发生上述变化!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值