一、this关键字:
在类的内部表示当前这个对象的引用
1.作用
- 调用本类属性
- 调用本类方法
- 表示当前对象
解析:调用本类属性
只要在类中⽅法访问类中属性,⼀定要加this关键字。
当参数与类中属性同名时,类中属性⽆法被正确赋值。此时我们加上this关键字便可以正确给对象属性赋值。
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name = name ;
this.age = age ;
}
解析:调用本类方法
调用普通方法:this.方法名称(参数)
调用构造方法:this(参数)
eg:this.print();//调⽤普通⽅法
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表示当前对象
只要对象调用了本类中的方法,这个this就表示当前执行的对象
class Person{
public void print(){
//此时哪个对象调用print方法,this就代表那个对象。
System.out.println("[PRINT]⽅法: "+this);
}
}
public class Test{
public static void main(String[] args) {
Person p1 = new Person();
System.out.println("[MAIN]⽅法: "+p1);
p1.print();
System.out.println("=================");
Person p2 = new Person();
System.out.println("[MAIN]⽅法: "+p2);
p2.print();
}
}
输出结果:
[MAIN]Demo.Person@1540e19d
[PRINT]方法Demo.Person@1540e19d
======
[MAIN]Demo.Person@677327b6
[PRINT]方法Demo.Person@677327b6
二、static关键字:
1.static类属性
- 传统属性特性:保存在堆内存中,且每个对象独享属性。
- 描述共享属性,只需要在属性前添加static关键字即可。
- static属性⼜称为类属性,保存在全局数据区的内存之中,所有对象都可以进⾏该数据区的访问
注意:
访问static属性(类属性)应使⽤类名称.属性名
所有的⾮static属性(实例变量)必须在对象实例化后使⽤,⽽static属性(类属性)不受对象实例化控制
2.static类方法
- 所有的static⽅法不允许调⽤⾮static定义的属性或⽅法
-
所有的⾮static⽅法允许访问static⽅法或属性
使⽤static定义⽅法只有⼀个⽬的:某些⽅法不希望受到对象的控制,即可以在没有实例化对象的时候执⾏(⼴泛存在于⼯具类中)
注意事项:
- 静态方法中不能使用this和super关键字
- 静态方法中不能访问非静态成员变量、非静态成员方法
- 非静态方法可以访问静态
3.【静态成员变量和非静态成员变量的区别】
静态成员变量 | 非静态成员变量 | |
---|---|---|
语法 | static修饰 | 无static修饰 |
数量 | 内存中只有一份,被类的所有对象共享 | 每创建一个对象都会为该成员变量分配内存空间,独享属性、互不干扰 |
访问方式 | 可通过对象名访问、也可通过类名访问 | 只能通过对象名访问 |
生命周期 | 跟随类的加载而创建并初始化,跟随类的销毁而销毁 | 跟随对象的创建而创建并初始化,跟随对象的销毁而销毁 |
三、super关键字:
1.三个作用:
- 在子类的成员方法中,访问父类的成员变量
- 在子类的成员方法中,访问父类的成员方法
- 在子类的构造方法中,访问父类的构造方法(必须位于第一行,且只能执行一次)
⼦类对象实例化操作时,super()的主要作⽤是⼦类调⽤⽗类构造⽅法时才使⽤的。
在进⾏覆写的操作过程之中,⼦类也可以使⽤super.⽅法()/super.属性明确调⽤⽗类中的⽅法或属性
2.【this与super的区别】
区别 | this | super |
---|---|---|
概念 | 访问本类中的属性和方法 | 由子类访问父类中的属性、方法 |
查找范围 | 先查找本类、如果本类没有就调用父类 | 不查找本类,直接调用父类定义 |
特殊 | 表示当前对象 | 无 |
ps:this、super只能在有对象的前提下使用,不能在静态上下文中使用
能使⽤super.⽅法()⼀定要明确标记出是⽗类的操作。
- ⼦类覆写⽗类的⽅法是因为⽗类的⽅法功能不⾜才需要覆写。
- ⽅法覆写的时候使⽤的就是public权限
四、final关键字:
使⽤final修饰类、⽅法、属性
1.final修饰类
- final⼀旦修饰⼀个类之后,该类的所有⽅法默认都会加上final修饰。 (不包含成员变量)
- 使⽤final定义的类不能有⼦类(String类便是使⽤final定义)
2.final修饰方法
- 使⽤final定义的⽅法不能被⼦类所覆写
class A{
public final void fun(){}
}
3.final修饰变量
- 使⽤final定义的变量就成为了常量, 常量必须在声明时赋值,并且不能再次赋值。
- final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误
- 定义常量(public static final ),常量全⽤⼤写字⺟,多个单词间以_分隔。