Java学习笔记59——继承super关键字
继承与成员的关系
class Demo {
int a=10;
public void fun1(){
int a=100;
System.out.println(a);
}
}
class DemoZi extends Demo{
int b=20;
int a=40;
public void fun2(){
int a=30;
System.out.println(b);//20
System.out.println(a);//30
//通过this关键字去访问成员变量
this.a=a;
System.out.println(this.a);//40
}
}
public class ExtendsDemo1 {
public static void main(String[] args) {
//调用fun2,创建对象
DemoZi demoZi = new DemoZi();
demoZi.fun2();
}
}
方法访问的顺序是:当前方法里的局部变量→当前类的成员变量→当前子类所继承的父类的成员变量
注意:方法与方法之间是相互隔绝的,里面的局部变量相互之间是访问不到的 。所以子类方法访问不到父类方法里的局部变量
思考:现在我们清楚了继承去访问成员的顺序,但是我们想不仅要输出本类范围中的成员,我还想输出父类中有同名的成员,该怎么办呢?
如果有一样东西,和this相似,可以直接访问父类的数据就好了
通过学习后发现,java给我们提供了这样的一个关键字实现这一功能:super
面试题:this关键字与super关键字的区别
this代表的是当前对象的引用
super代表的是当前对象的类继承的父类的引用(可以直接操作父类中的成员)
super与this的使用格式:
1、访问成员变量:
super.成员变量(访问的是父类中的成员变量)
this.成员变量(访问的是本类中的成员变量)
class Demo {
int a=10;
public void fun1(){
int a=100;
System.out.println(a);
}
}
class DemoZi extends Demo{
int b=20;
int a=40;
public void fun2(){
int a=30;
System.out.println(b);//20
System.out.println(a);//30
//通过this关键字去访问成员变量
System.out.println(this.a);//40
//通过super关键字访问成员变量
System.out.println(super.a);//10
}
}
class Demo {
int a=10;
public void fun1(){
int a=100;
System.out.println(a);
}
}
class DemoZi extends Demo{
int b=20;
int a=40;
public void fun2(){
int a=30;
System.out.println(b);//20
System.out.println(a);//30
//通过this关键字去访问成员变量
System.out.println(this.a);//40
//通过super关键字访问成员变量
System.out.println(super.a);//10
}
}
class DemoSun extends DemoZi{
//int a=50;
//如果本类找不到变量去直接继承父类中查找
public void fun3(){
System.out.println(a);//40
//super关键字只能代表直接父类的引用,不能跨层引用
System.out.println(super.a);//40
//在fun3里定义一个的Demo类型的demo局部变量,这时候就可以访问Demo类中的a
Demo demo = new Demo();
System.out.println(demo.a);//10
}
}
2、访问成员方法:
super.成员方法(访问的是父类的成员方法)
this.成员方法(访问的是本类中的成员方法,可以访问的是继承自父类中的成员方法)
子类不能调用父类的私有成员(被private修饰的成员)
class Demo {
int a=10;
public void fun1(){
int a=100;
System.out.println(a);
}
}
class DemoZi extends Demo{
int b=20;
int a=40;
public void fun2(){
int a=30;
System.out.println(b);//20
System.out.println(a);//30
//通过this关键字去访问成员变量
System.out.println(this.a);//40
//通过super关键字访问成员变量
System.out.println(super.a);//10
}
}
class DemoSun extends DemoZi{
//int a=50;
//如果本类找不到变量去直接继承父类中查找
public void fun3(){
System.out.println(a);//40
//super关键字只能代表直接父类的引用,不能跨层引用
System.out.println(super.a);//40
//在fun3里定义一个的Demo类型的demo局部变量,这时候就可以访问Demo类中的a
// Demo demo = new Demo();
// System.out.println(demo.a);//10
super.fun2();//20 30 40 10
}
public void fun4(){
this.fun3();
this.fun2();
}
}
3、访问构造方法:
super(...)(访问父类构造方法中的方式)
this(...)(访问笨了中的构造方法)

浙公网安备 33010602011771号