继承的概念:
多个类中相同的属性和方法抽取出来放入到一个新的类中(父类)
多个类中就不需要再重复定义这些属性和方法,只需要写自己类中独有的属性和方法,使用 extends关键字继承父类就可以使用父类中的属性和方法
继承是Java中实现代码重用的重要手段之一。Java中只支持单根继承,即一个类只能有一个直接父类
如何使用继承:
语法:(父类)
[访问修饰符] class Pet {
//公共的属性和方法
}
编写子类,继承父类
[访问修饰符] class Dog extends Pet {
//子类特有的属性和方法
}
子类访问父类成员
访问父类构造方法:
super();
super(name);
访问父类属性:
super.name;
访问父类方法
super.print();
(1)使用super关键字,super代表父类对象
(2)在子类构造方法中调用且必须是第一句
(3)不可以访问父类中定义为private的属性和方法
super关键字
super关键字来访问父类的成员:
1)super只能出现在子类的方法和构造方法中
2)super调用构造方法时,只能是第一句
3) super不能访问父类的private成员
继承条件下构造方法的调用
◆继承条件下构造方法的调用规则:
■子类构造方法没有通过super显式调用父类的有参构造
方法,也没通过this显式调用自身其他构造方法
●系统默认调用父类的无参构造方法
■子类构造方法通过super显式调用父类的有参构造方法。
●执行父类相应构造方法,而不执行父类无参构造方法
■子类构造方法通过this显式调用自身的其他构造方法,
在相应构造方法中应用以上两条规则
子类可以继承父类的哪些资源:
1)pubic修饰的资源、
2)可以继承与子类在同一个包中的默认修饰符修饰的资源
3)可以继承protected修饰的资源,不管父类与子类在不在同一个包中
4)不能继承父类里使用private修饰的资源
5)不能继承父类的构造方法
何时使用继承?
■继承与真实世界类似
●只要说“猫是哺乳动物”,猫的很多属性、行为就
不言自明了
●藏獒是一种狗
(符合is-a关系的设计使用继承)
■继承是代码重用的一种方式
(将子类共有的属性和行为放到父类中)
继承有何好处:
方便修改代码,减少代码量
代码:
父类
package Exercises;
public class Pet {
//定义属性,使用private修饰符进行封装
private String name;//名字
private int health;//健康值
private int love;//亲密度
//无参构造方法
public Pet() {
}
//有参构造方法
public Pet(String name, int health, int love) {
super();
this.name = name;
this.health = health;
this.love = love;
}
//get、set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
//定义方法输出对象信息
public void printInfo(){
System.out.println("宠物昵称:"+this.getName()+" "+"健康值:"+this.getHealth()+" "+"亲密度:"+this.getLove());
}
}
Cat子类 1
package Exercises;
public class Cat extends Pet {
//定义Cat类独有属性
private String color;
public Cat() {
super();//调用父类Pet类里的无参构造方法
}
public Cat(String name, int health, int love, String color) {
super(name, health, love);
this.color = color;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
Dog子类 2
package Exercises;
public class Dog extends Pet{
//strain为Dog类独有属性,其余类没有,所以在Dog类里定义
private String strain;
//无参构造方法
public Dog() {
}
//有参构造方法
public Dog(String name, int health, int love, String strain) {
super(name, health, love);
this.strain = strain;
}
//get、set方法
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
}
Penguin子类 3
package Exercises;
public class Penguin extends Pet {
//定义Penguin类里独有的属性
private String sex;//性别
public Penguin() {
super();//super表示父类Pet对象,所以这个地方表示调用父类的无参构造方法
}
//有参构造方法
public Penguin(String name, int health, int love, String sex) {
super(name, health, love);//表示调用父类Pet类的有参构造方法
this.sex = sex;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void aa(){
System.out.println("宠物昵称:"+getName()+" "+" 健康值:"+getHealth()+" "+" 亲密度:"+getLove()+" 性别:"+getSex());
}
}
对象
package Exercises;
public class Test {
public static void main(String[] args) {
// 创建Dog类对象
Dog dog1=new Dog("小黑", 89, 78, "哈士奇");
//在Dog类中没有setName( )方法,但是DOg类对象dog1是可以调用,因为Dog类继承了Pet类,所以dog1可以调用父类Pet类里的setName( )方法
dog1.setName("二傻");
dog1.printInfo();
//创建Penguin类对象
Penguin Pen1=new Penguin("Q宠",78,98,"雄");
Pen1.setHealth(100);
Pen1.setName("企鹅");
Pen1.aa();
//创建Cat类对象
Cat cat1=new Cat("汤姆", 99, 97, "白色");
cat1.printInfo();
}
}