day14
一、继承
概念
Java中的继承是一个对象获取父对象的所有属性和行为的机制
理解:继承是指一个类(子类)可以继承另一个类(父类)的属性和方法
关键字extends
优点:减少代码的冗余
缺点:继承会增加类与类之间的关系,会增加代码的维护难度
继承的使用
使用场景:多个类似的类,有相同的属性和方法,就可以把相同属性和方法抽取到父类
需求:编写中国人和日本人的类,创建各自的对象
分析:
人类:
属性:姓名、性别、年龄
方法:吃饭饭、睡觉觉
中国人的类 继承 人类 :
属性:身份证
方法:打太极
日本人的类 继承 人类:
属性:年号
方法:拍电影
ps:(省略部分代码)
public class Person {String name;
char sex;
int age;public void eat(){System.out.println(this.name + "吃饭饭");
}public void sleep(){System.out.println(this.name + "睡觉觉");
}}
// 子类 继承 父类
public class Chinese extends Person{String id;public void playTaiJi(){System.out.println("中国人打太极");
}}
//创建对象Chinese c = new Chinese();//操作父类属性c.name = "奇男子";c.sex = '男';c.age = 22;System.out.println(c.name);System.out.println(c.sex);System.out.println(c.age);//操作子类属性c.id = "1234567890";System.out.println(c.id);//调用父类方法c.eat();c.sleep();//调用子类方法c.playTaiJi();
继承内存图
super
理解:
super表示父类
作用:
1.super.属性:在子类中,调用父类的非私有化的成员属性
2.super.方法:在子类中,调用父类的非私有化的成员方法
3.super():在子类构造方法中的第一句调用父类的非私有化的构造方法
案例:
继承的使用的需求案例
封装父类,添加无参构造、有参构造、get、set方法(都由eclipse直接生成),成员方法保留
经验
私有化属性:eclipse工具栏 ------->Source------->Select getters and setters to create—>勾选需要生成属性的get和set方法;
Source中还有一些自动生成,如构造方法等等;
子类继承父类,封装子类,super使用
public class Chinese extends Person{private String id;public Chinese() {
}public Chinese(String name, char sex, int age, String id) {super(name, sex, age);this.id = id;
}public String getId() {return id;
}public void setId(String id) {this.id = id;
}public void playTaiJi(){System.out.println(super.getName() + "打太极");
}}
测试类,有有参构造直接赋值,不用一个个赋值
//创建对象Chinese c = new Chinese("奇男子", '男', 22, "1234567890");//调用父类方法c.eat();c.sleep();//调用子类方法c.playTaiJi();
小结
编写一个类的步骤:
1.属性
2.私有化属性
3.无参构造
4.有参构造
5.get/set方法
6.其他的方法
深入继承:
思考题:
创建子类对象,会不会调用父类构造方法?
会创建子类对象,会不会创建父类对象?
不会创建子类对象,为什么会调用父类构造方法?
目的是将父类的属性存放在子类对象中(因为会在子类对象中开辟空间,用于存储父类的成员属性)创建子类对象,先调用父类构造方法还是子类构造方法?
先调用子类构造方法创建子类对象,先完成父类构造方法还是子类构造方法?
先完成父类构造方法子类可以继承父类私有化的属性和方法吗?
可以,但是只能间接调用
子类对象是否能继承父类所有的属性和方法?
Java官网上,明确表示子类不能继承父类私有化的属性和方法,这是站在使用的角度
实际上,子类能继承父类私有化的属性方法,但是不能直接使用,可以在父类中编写公有方法去调用私有的属性和方法
案例:
public class Father {private String fatherAttr = "父类私有化属性";public Father() {System.out.println("调用父类的构造方法");
}public String getFatherAttr() {return fatherAttr;
}public void setFatherAttr(String fatherAttr) {this.fatherAttr = fatherAttr;
}private void method01(){System.out.println("父类私有化方法");
}public void method02(){method01();
}}
public class Son extends Father{public Son() {//super();//默认实现:调用父类的构造方法System.out.println("调用子类的构造方法");
}}
public class Test01 {public static void main(String[] args) { Son son = new Son();System.out.println(son.getFatherAttr());son.method02();
}}
重写/复写
含义:
重写也叫做复写,将父类中方法在子类中重新编写一遍
应用场景:
父类方法不满足子类需求时,子类就可以重复父类的方法
条件:
1.在子类中重写父类的方法
2.返回值、方法名、参数列表必须跟父类重写的方法一致
3.访问修饰符不能比父类更严格
需求:
编写中国人和日本人的类,创建各自的对象
public class Chinese extends Person{
//省略一部分//@Override -- 重写的注解
//注解:给程序员和系统解释代码信息
@Override
public void eat(){System.out.println(super.getName() + "吃山珍海味");
}
//在测试类new对象调用输出
总结
1.继承的使用
2.继承的深入 — 重要
3.super
4.重写