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.重写