java小白的学习记录......
1. 继承的作用:
方便修改代码,减少代码量
2. 实例
1)父类、子类框架
父类:Pet
子类:Dog,Penguin
关系如图:
目录树:
2)父类 Pet.java代码:
public class Pet {
//属性
private String name;private int health;
private int love;
//构造方法
public Pet(){System.out.println("这是父类Pet中的无参构造方法");
}
public Pet(String name,int health,int love){ //父类的有参构造方法
this.name=name;
this.health=health;
this.love=love;
}
// name, health, love属性都是private的,参考博客[java][15][抽象和封装],为了对其访问,需调用se/get方法public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
......health和love同上,省略
//print方法public void print(){
System.out.println("name:"+this.name+"\nhealth:"+health
+"\nlove:"+love+"\n");
}
}
3)子类 Dog继承自Pet
public class Dog extends Pet{ //使用extends关键字表示继承关系
private String strain;//子类自己的属性-品种
//构造函数
public Dog(){//super ();//注意:必须是子类构造方法中的第一条语句(此处是无参构造,super()可以注释掉)。
System.out.println("这是子类Dog中的无参构造方法");
}
public Dog(String name,int health,int love,String strain){super (name,health,love);//注意:必须是子类构造方法中的第一条语句,默认调用父类的有参构造
this.strain=strain;
}
//print函数public void print(){
//super调用父类中的方法
//子类不能继承父类中的私有变量和私有方法 (如:System.out.println(super.name);报错 )
System.out.println("name:"+super.getName()+"\nhealth:"+this.getHealth()+
"\nlove:"+this.getLove()+"\nstrain:"+strain+"\n");
}
}
4)子类Penguin与Dog类似
public class Penguin extends Pet{
private String sex;//子类自己的属性-性别
public Penguin(String name,int health,int love,String sex){
super(name,health,love);//默认调用父类的有参构造
this.sex=sex;
}
public void print(){
//重写父类的print
super.print();
System.out.println("\nsex:"+this.sex);
}
}
3. super关键字
super代表父类对象
1)访问父类构造方法
在子类构造方法中调用且必须是第一句
见2 3)
2)访问父类属性
若Pet中name的属性不是private ( 而是public,protected,或默认 ) ,Dog中可用super.name进行访问
3)访问父类方法
如:super.getname(),见 2 3)
4. 子类不能继承父类的哪些资源
1)private成员
如3 2)
2)子类与父类异包,不可访问父类的默认成员
若同包,就可访问默认成员了,如3 2)
3)构造方法
5. 继承关系的初始化顺序
父类属性-》父类构造方法-》子类属性-》子类构造方法
如:Test1.java
public class Test {
public static void main(String[] args){
Dog dog1=new Dog();//1)实例化子类对象,默认会先执行父类的无参数构造,再执行子类的无参数构造
dog1.print();
/*2)实例化子类的有参数构造时,使用super(参数)重复调用父类中的有参数构造;
默认直接调用父类中的有参数构造,不会调用父类中的无参数构造。*/
Dog dog2=new Dog("lucky",100,99,"萨摩耶");
dog2.print();
}}
输出结果为:
由dog1的结果可见:先调用父类构造方法,后调用子类构造方法。
6. 方法重写
Pet的print()只能打印公共信息,所以需在子类中进行修改,
由2 4)-- Penguin的print()重写Pet的print(),较之 2 3)--Dog的print()更为简洁
与重载比较: