Day10
继承的注意事项
1.子类的构造方法(有参/无参)都要默认的访问父类的无参构造方法;
2.A 如果父类中没有提供无参构造方法,会出现什么现象?
编译不通过,父类中没有无参(父类提供有参,系统给父类不会提供无参)
B如何解决呢?(面试过程中,前两个即可!)
1)给出父类的无参构造方法…
2)在子类的构造方法中通过super(…)间接的访问父类的有参构造方法…
3)在子类中的有参构造方法中,可以通过this()访问当前子类中的无参构造方法,在通过无参构造方法间接访问父类的有参构造方法
//父类
class Father{
//不提供父类的无参构造方法
/*
public Father(){
System.out.println("Father的无参构造方法...") ;
}
*/
public Father(String name){
System.out.println("Father的有参构造方法...") ;
}
}
//子类
class Son extends Father{
public Son(){
//super() ;//默认第一句(隐藏的)
//在子类中通过super(...),间接访问父类的有参构造方法
//super ("随便给");
super("hello...") ;
System.out.println("Son的无参构造方法...") ;
}
public Son(String name){
//super();
//super("随便给");
this() ;
System.out.println("Son的有参构造方法...") ;
}
}
//测试类
class ExtendsDemo{
public static void main(String[] args){
//创建子类对象
Son s = new Son() ;
System.out.println("-----------------");
Son s2 = new Son("高圆圆") ;
}
}
面试题
1.继承关系中,成员变量名称和局部变量名称一致的情况:
a)在子类的局部位置中,有就使用
b)如果没有,在子类的成员位置中找,有就使用
c)如果还没有,在父类中的成员位置中找…
2.继承中的数据的初始化过程:
a)父类进行数据初始化
成员变量
默认初始化
显示初始化
构造方法初始化
3.this.成员变量; 访问本类中的成员变量
super.成员变量;访问父类中的成员变量
class Father{
public int num = 10 ;//0 10
}
class Son extends Father{
public int num = 20 ;
public void method(){
int num = 30 ;
System.out.println(num) ; //30
System.out.println(this.num) ;//20
System.out.println(super.num) ;//10
}
}
class ExtendsDemo2{
public static void main(String[] args){
Son s = new Son () ;
s.method() ;
}
}
1)继承中初始化问题:
需要先让父类进行初始化,因为子类可能要用到父类的数据
2)代码块的执行顺序
静态代码块 > 构造代码块 >构造方法代码块…
3)静态随着类的加载而加载
静态相关的代码块/变量/成员方法,先随着类的加载进行初始化!
案例:
看程序,写结果
//Fu.class
class Fu{
static{
System.out.println("静态代码块Fu") ;
}
public Fu(){
System.out.println("构造方法Fu") ;
}
{
System.out.println("构造代码块Fu") ;
}
}
//Zi.class
class Zi extends Fu{
static{
System.out.println("静态代码块Zi") ;
}
public Zi(){
System.out.println("构造方法Zi") ;
}
{
System.out.println("构造代码块Zi") ;
}
}
//测试类
class ExtendsDemo3{
public static void main(String[] args){
Zi zi = new Zi() ;
}
}
结果:
静态代码块Fu
静态代码块Zi
构造代码块Fu
构造方法Fu
构造代码块Zi
构造方法Zi
有了继承,标准类的写法
class Student{
private String name ;
private int age ;
public Student(){
}
public Student(String name,int age){
this.name = name ;
this.age = age ;
}
public void setName(String name){
this.name = name ;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return name ;
}
public int getAge(){
return age ;
}
public void study(){
System.out.println("学生主要任务学习,Java") ;
}
}
//定义老师类
class Teacher{
private String name ;
private int age ;
public Teacher(){
}
public Teacher(String name,int age){
this.name = name ;
this.age = age ;
}
public void setName(String name){
this.name = name ;
}
public void setAge(int age){
this.age = age ;