今日学习内容
- 面向对象三大特性-继承
- 继承的格式和使用特点
- 方法的重写
- super关键字
- this关键字
- 抽象的概念以及使用
第一节 继承
- 概述
子类继承父类的属性和行为,子类具有与父类相同的属性和行为,子类可以访问父类中非私有的属性和行为. - 举例
父类:动物
子类:猫 狗
动物的属性包括有眼有嘴 行为包括跑,吃东西.子类猫和狗也具备这些属性和行为,我们就成为动物是猫和狗的父类. - 好处
1.提高代码的复用性
2.类与类产生了上下关系 - 格式
子类通过extends关键字继承父类//父类代码格式 class 父类{ }
//子类代码格式 class 子类名 extends 父类名{ }
- 成员变量的继承
通过父类为员工子类为讲师的代码看//父类 public class Employee { public String name; private int age; }
//子类 public class Teacher extends Employee{ public String name; public void show(){ System.out.println("子类的姓名:"+name); } public void fushow(){ System.out.println("父类的姓名:"+super.name); } }
public static void main(String[] args) { Teacher teacher = new Teacher(); teacher.name = "张老师"; teacher.show(); teacher.fushow(); }
说明:当父类的成员变量名和子类不一致时,没有任何问题.如上图中父类变量name和子类变量name重名的情况下,想要在子类中引用父类的name,需要用关键字super.子类只能访问父类的非私有成员,像图中private int age变量就不能在子类中直接引用,可以通过set/get方法.
- 方法的继承
看下面代码
//父类
public class Employee {
public void work(){
System.out.println("父类工作");
}
}
//子类
public class Teacher extends Employee{
public void work(){
System.out.println("子类的工作");
}
}
//测试类
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.work();
}
说明:当父类和子类方法不重名时没有任何影响,如果子类和父类方法重名,并且传入参数和返回类型都一样,此时子类就会覆盖掉父类的方法,我们成为方法的重写.
方法的重写有助于代码的扩展性.
- 继承之构造方法
子类继承父类的流程:我们初始化子类对象的时候,首先调用了默认的子类构造方法,如果是继承,系统会在子类的默认构造方法开头加上super(),代表调用父类的无参构造方法.也就是先实例化父类再实例化子类.
public class Teacher extends Employee{
public String name;
//子类的每一个构造方法不写父类构造的话就默认加上父类的无参构造方法
Teacher(){
super();
}
}
如何在子类中调用父类的有参构造方法,在子类构造方法开始位置调用父类的构造方法即可
//父类代码
Employee(String sex){
System.out.println("父类性别");
}
子类代码
Teacher(String sex){
//父类的有参构造方法
super(sex);
//子类代码
}
小贴士:子类不能继承多个父类,即JAVA是单继承,我们编写的所有类有一个顶层类,就是object类.
第二节 抽象类
- 由来
当子类重写父类的方法时,父类的方法传入参数和返回类型还有意义,但是方法体就没有任何意义,我们把没有方法体的方法称为抽象方法,Java同时规定把含有抽象方法的类称为抽象类. - 抽象方法: 没有方法体的方法
- 抽象类: 拥有抽象方法的类
- 格式
//抽象类 abstract class 类名{ //抽象方法 abstract 返回类型 方法名(传入参数); }
- 例子
public abstract class abstractDemo { public abstract void show(String name); }
关于抽象类的使用
-
抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。
假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。
-
抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。
子类的构造方法中,有默认的super(),需要访问父类构造方法。
-
抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设 计。
-
抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象 类。
假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有 意义。