今日内容:
1.继承的注意事项:
1)子类继承父类,继承的是非私有成员变量/方法,私有成员变量/方法只能通过间接方法访问
例如:创建一个父类一个子类,父类有私有和共有成员变量,私有和共有成员方法,代码如下
分别访问父类的成员变量:
分别访问父类的成员方法:
若要强行访问则可以通过间接的方式:
私有成员变量通过公用方法访问
public void show (){
System.out.println(b);
System.out.println(show fu);
}
私有成员方法通过公用方法访问:
public void showMsg(){
method();
}
结果如下:
2)子类继承父类,构造方法不能继承,只能通过super()(每个子类构造方法都默认第一句有super();)访问
面试题:继承关系中, 父类中如果没有无参构造方法,子类会出现什么情况?如何解决呢?
子类全部报错,子类的所有构造方法都默认访问父类的无参构造方法(子类的所有构造方法的第一句话super();,可以省略不写)
1)解决方案1:永远给出父类的无参构造方法
2)如果现在不给出父类无参构造方法,如何解决呢?
让子类的所有构造方法显示的访问父类的有参构造方法!(只要父类出现初始化 :执行构造方法就是初始化)
super();强行访问父类有参构造方法
代码如下:
结果:
3)子类的所有构造方法中的某一个只要能够让父类初始化即可!
创建Zi zi = new Zi() ; 在执行Zi类的无参构造方法的时候
让它先执行子类的有参构造方法 this(xx) ;
让后在子的有参构造方法中,让它先让父类初始化 super(xx) ; 访问父类的有参构造方法
使用继承关系 编码的时候:----idea生成 alt+ins---->constructor--->
子类的无参构造方法 访问父类的无参构造方法
子类的有参构造方法 直接访问父类的有参构造方法
继承的成员变量访问问题
1)子类变量和父类变量名称不一样,分别访问即可
代码如下:
运行结果:
2)子类成员变量名称和父类一致采用就近原则访问
:
结果:
就近原则:
1)先是子类的成员位置成员变量,如果有就访问
2)再是父类成员位置找,如果有就访问
3)如果还是没有就继续往上(父类的父类)找
如果局部位置也有同名变量
则看输出位置在哪,子类方法中输出则访问局部变量,在主类中输出则先按就近原则访问
二.super和this区别
1)概念的区别
this:代表的当前类对象的地址值引用
super:代表的父类的空间表示(父类对象的地址值引用)
2)使用不同
2.1)针对成员变量访问
this.变量名 ; 访问的本类的成员变量
super.变量名; 访问的父类成员变量
2.1)访问构造方法
this() ; 访问本类的无参构造方法
this(xx); 访问本类的有参构造方法
super() ;访问父类的无参构造方法
super(xx);访问父类的有参构造方法
2.2)访问成员方法
this.方法名() ;访问本类的成员方法
super.方法名() ;访问父类的成员方法
三.方法重写
定义:子类方法名和父类方法名相同,目的就是子类的方法覆盖/复写父类的方法
注意:重写时子类方法权限不能低于父类
实例:
结果:
四.final关键字
特点:
1)final修饰类,该类不能被继承
2)final修饰成员变量,该成员变量不能重新赋值(即常量)
static和final在一起出现
面试题:
public static final int a=20;//称为编译时期常量:(jvm不需要加载) public static final 基本数据类型 变量名 = 值;
public static final Integer i= new Integer(20)//称为运行时期常量:(jvm需要加载) 指的是修饰的引用类型地址值不变(无法开辟新的堆内存空间) public static final 引用数据类型 变量名 = new xxx();
3)final修饰成员方法,该成员方法不能被重写
五.多态
多态的前提条件
1)必须有继承关系
2)存在方法重写
3)必须父类引用指向子类对象
父类名 对象名 = new 子类名();
class Fu{
//属性私有化
//无参/有参构造方法
}
class Zi extends Fu{
//无参访问父类无参
//有参访问父类有参
}
成员访问特点:
父类名 对象名 = new 子类名();
1)成员变量(非静态):编译看左,运行看左!
2)成员方法(非静态):编译看左,运行看右(因为子类存在重写)
静态的成员方法:算不上方法重写,跟类相关,类名.静态方法名() ; 编译看左,运行看左!
3)构造方法: 由于存在继承关系,分层初始化(先让父类初始化,然后再是子类初始化!)
六.多态的弊端
多态的好处:
1)提高代码扩展性(父类引用指向子类对象),多态保证
2)提高代码的维护性以及复用性(由继承保证)
多态的弊端:
无法访问子类的特有功能!
解决方案:
1)直接创建具体的子类对象
子类名 对象名 = new 子类名() ; (不推荐),从内存角度考虑,又需要开辟堆内存空间
2)推荐向下转型---前提条件:必须存在向上转型((父类引用指向子类对象))
父类名 对象名 = new 子类名();
子类名 子类引用 = (子类名)对象名; 强转类型转换的格式