1.继承(extends): 子类继承父类
是⼦类继承⽗类的属性和⾏为,使得⼦类对象具有与⽗类相同的属性、相同的⾏ 为。⼦类可以直接访问⽗类中的⾮私有的属性和⾏为。
好处 :1. 提⾼代码的复⽤性。 2. 类与类之间产⽣了关系,是多态的前提。
1).语法结构:
子类(衍生类/扩展类) extends 父类(基类)
2).继承的特征:
a.子类继承父类,就继承父类中所有的成员变量和成员方法
b.所有类都有默认继承的父类:Object
c.一个类只能有一个父类,但是一个父类可以有多个子类(多重继承)
d.子类中还可以定义自己独特的成员变量和成员方法,子类的功能一定比父类的强大
class Fu {
// Fu中的成员变量。
int num = 5;
}
class Zi extends Fu {
// Zi中的成员变量
int num2 = 6;
// Zi中的成员⽅法
public void show() {
// 访问⽗类中的num
System.out.println("Fu num = " + num); // 继承⽽来,所以直接访问。
// 访问⼦类中的num2
System.out.println("Zi num2 = " + num2);
}
}
class ExtendDemo02 {
public static void main(String[] args) {
// 创建⼦类对象
Zi z = new Zi();
// 调⽤⼦类中的show⽅法
z.show();
}
}
演示结果:
Fu num = 5
Zi num2 = 6
3).特殊情况:
a.子类中的成员变量名和父类中的同名时
ps: name
Dog d = new Dog()
d.name -> 显示子类中自己的成员变量,获取不到父类的成员变量
建议: 有父子类关系的类中,尽量不要出现相同的成员变量名
b.子类中可以引用父类对象
c.创建子类对象之前,会先创建父类对象,子类加载前,会先加载父类
e.通过子类对象调用方法是:先看子类中有没有重写父类中的方法.如果重写了,则显示子类中的方法,如果没有则显示从父类中继承过来的方法
2.super关键词
super:父类对象
1).在子类构造方法中一定都会先默认调用父类的无参构造方法,默认添加super()
2).如果父类中没有无参构造方法,就要在子类中手动调用父类的有参构造方法
3).super()只能出现在构造方法的第一行
4).建议:所有存在父子类关系的类中,建议先添加无参构造方法,方便子类使用
class Fu {
// Fu中的成员变量。
int num = 5;
}
class Zi extends Fu {
// Zi中的成员变量
int num = 6;
public void show() {
// 访问⽗类中的num
System.out.println("Fu num = " + super.num);
// 访问⼦类中的num
System.out.println("Zi num = " + this.num);
}
}
演示结果:
Fu num = 5
Zi num = 6
3.方法的重写
⼦类中出现与⽗类⼀模⼀样的⽅法时(返回值类型,⽅法名和参数列表都相 同),会出现覆盖效果,也称为重写或者复写。声明不变,重新实现。
前提: 必须存在父子类关系
子类中重写父类定义的方法,方法的方法名/方法的返回值/方法的修饰符/方法的参数,必须完全一致才能实现方法的重写.
class Phone {
public void sendMessage() {
System.out.println("发短信");
}
public void call() {
System.out.println("打电话");
}
public void showNum() {
System.out.println("来电显示号码");
}
}
// 智能⼿机类
class NewPhone extends Phone {
// 重写⽗类的来电显示号码功能,并增加⾃⼰的显示姓名和图⽚功能
public void showNum() {
// 调⽤⽗类已经存在的功能使⽤super
super.showNum();
// 增加⾃⼰特有显示姓名和图⽚功能
System.out.println("显示来电姓名");
System.out.println("显示头像");
}
}
public class ExtendsDemo06 {
public static void main(String[] args) {
// 创建⼦类对象
NewPhone np = new NewPhone();
// 调⽤⽗类继承⽽来的⽅法
np.call();
// 调⽤⼦类重写的⽅法
np.showNum();
}
}
//打电话
//来电显示号码
//显示来电姓名
//显示头像
4.抽象类: abstract
1)抽象类:
a.使用abstract修饰的类,叫做抽象类
b.一个类中可以存在多个抽象方法
c.抽象类是不可以new对象的,也就是不能实例化
只能通过子类实现
d.抽象类也有构造方法,为了方便子类使用
2)抽象方法
a.使用abstract修饰的方法,抽象方法
b.抽象方法是没有方法体的
c.如果子类不重写父类中的抽象方法,就必须将自己变成抽象类
3)成员变量是不可能是抽象的,因为都是具体的类型,具体的值.
public abstract class Animal {
public abstract void run();
}
public class Cat extends Animal {
public void run () {
System.out.println("⼩猫在墙头⾛~~~");
}
}
public class CatTest {
public static void main(String[] args) {
// 创建⼦类对象
Cat c = new Cat();
// 调⽤run⽅法
c.run();
}
}
输出结果:
⼩猫在墙头⾛~~~
1. 抽象类不能创建对象,如果创建,编译⽆法通过⽽报错。只能创建其⾮抽象⼦类的对象。
2. 抽象类中,可以有构造⽅法,是供⼦类创建对象时,初始化⽗类成员使⽤的。
3. 抽象类中,不⼀定包含抽象⽅法,但是有抽象⽅法的类必定是抽象类。
4. 抽象类的⼦类,必须重写抽象⽗类中所有的抽象⽅法,否则,编译⽆法通过⽽报错。除⾮该 ⼦类也是抽象类。