我们纵横交错,最后回到原点
—— 24.4.23
综合案例
流程思维图
代码实现
方式1 利用set方法为属性赋值
父类:
public abstract class Development extends Employee{}
子类1:
public class JavaEE extends Development{@Overridepublic void work() {System.out.println("员工号为"+this.getId()+"的"+this.getName()+"正在开发网站");} }
子类2:
public class Android extends Development{@Overridepublic void work() {System.out.println("员工号为"+this.getId()+"的"+this.getName()+"正在开发APP");} }
子类的子类:
public abstract class Employee {private int id;private String name;public Employee() {}public Employee(int id, String name) {this.id = id;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public abstract void work(); }
测试类:
public class Demo117Test {public static void main(String[] args) {JavaEE javaEE = new JavaEE();javaEE.setId(1);javaEE.setName("大壮");javaEE.work();System.out.println("————————————————————");Android android = new Android();android.setId(2);android.setName("图图");android.work();} }
运行结果:
方式2 利用构造赋值
父类:
public abstract class Development extends Employee{public Development() {}public Development(int id, String name) {super(id, name);} }
子类1:
public class JavaEE extends Development{public JavaEE() {}public JavaEE(int id, String name) {super(id, name);}@Overridepublic void work() {System.out.println("员工号为"+this.getId()+"的"+this.getName()+"正在开发网站");} }
子类2:
public class Android extends Development{public Android() {}public Android(int id, String name) {super(id, name);}@Overridepublic void work() {System.out.println("员工号为"+this.getId()+"的"+this.getName()+"正在开发APP");} }
子类的子类:
public abstract class Employee {private int id;private String name;public Employee() {}public Employee(int id, String name) {this.id = id;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public abstract void work(); }
测试类:
public class Demo118Test2 {public static void main(String[] args) {JavaEE javaEE = new JavaEE(1,"张三");javaEE.work();System.out.println("——————————————————————");Android android = new Android(2,"李四");android.work();} }
运行结果:
总结
1.继承
①概述:子类继承父类,可以直接使用父类中的非私有成员,子类不要写重复代码,提高了代码的复用率
②关键字:extends
③成员访问特点:a、成员变量:看符号左边是谁先调用谁中的成员变量,子类没有找父类
b、成员方法:看new的是谁先调用谁中的成员方法,子类没有找父类
④方法的重写:a、概述:子类中有一个和父类从方法名以及参数列表上一样的方法
b、验证:@Override
c、使用场景:功能的升级改造
⑤继承中的构造的特点:new子类对象时先初始化父类
⑥继承的特点:
a、继承只支持单继承,不能多继承
b、继承支持多层继承
c、一个父类可以有多个子类
2.super和this关键字
①super
a、概述:代表的是父类引用
b、使用:调用父类构造方法:super() super(实参)
调用父类成员变量:super.成员变量名
调用父类成员方法:super.成员方法名(实参)
②this
a、概述:代表的是当前对象:哪个对象调用的this所在的方法this就代表哪个对象
b、使用:调用当前对象的构造:this() this(实参)
调用当前对象的成员变量:this.成员变量名
调用当前对象的成员方法:this.成员方法名(实参)
③注意
super和this如果在构造中使用,都必须在第一行,所以不能同时手写出来
3.抽象
①抽象方法:修饰符 abstract 返回值类型 方法名(形参);
②抽象类:public abstract class 类名{}
③特点:
a、抽象方法所在的类一定是抽象类
b、抽象类中不一定必须有抽象方法
c、抽象类中可以有私有属性构造,其他方法等
d、抽象类不能new对象,只能new子类对象
e、抽象类中可以有构造方法,但是是供创建子类对象时,初始化父类属性使用的