this,super,static,final
this
1.this调用本类中的属性,也就是类中的成员变量;
2.this调用本类中的其他方法;
3.this调用本类中的其他构造方法初始化对象,调用时要放在构造方法的首行。
输出
可以看出,我们的无参调用有参,通过this把值赋给了本类的成员变量,接下来我们再看
输出
由此更加明显的可以看出,this是调用类中的成员变量。
super
1.在子类构造方法中要调用父类的构造方法
2.super指向父类,只有继承的时候才可以使用
3.可以用super调用父类的成员变量,或者成员方法
4.super调用父类的构造方法必须在第一行
5.super和this不能同时调用构造方法
我们主要对比以下,this和super的区别
输出
我们可以看出,this指向本类,super指向父类
我们把父类和子类的构造都写出来
输出
发现父类的构造也调用了,这是为什么呢?我们只实例了子类
接下来我们快捷生成有参构造(快捷键 Alt+Ins)
原来是子类的构造用super()调用了父类的构造,这也就解释了为什么父类的构造也调用了
接下来我们把super和this都放在一个构造中看一下
发现,不管谁在第二行都会报错,必须放在第一行。
this和super为什么不能放在一起,为什么都必须放在第一行
这是因为,编译器检测子类构造函数第一行没有显示调用父类构造函数时,默认加上一句super(),而如果此时你恰好在第二行(只要不是第一行)调用了super,此时你对父类进行了两次初始化。this也是同理,所以必须放在第一行。
this构造函数中,无论显示隐示,肯定会调用父类的构造方法,当super与this同时存在时父类构造方法就必定被调用了至少两次,所以this和super不能放在一起。
final
1.被final修饰的类不能被继承
2.被final修饰的方法不能被重写
3.被final修饰的成员变量不能被重新赋值或修改,只能赋值一次。此时变量就变成了常量
static
1.static修饰的变量为静态变量
2.static修饰的方法为静态方法
3.在类中,用static声明的成员变量为静态变量,也成为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效
注意:
-
static修饰的成员变量和方法,从属于类
-
普通变量和方法从属于对象
-
静态方法不能调用非静态成员,编译会报错
接下来举例演示
我们分别写父类的静态和子类的静态方法,然后调用
发现
然后我们把static去掉
我们发现输出立马就不一样了
这就能看出来
static修饰的成员变量和方法,从属于类
普通变量和方法从属于对象