继承extends与 抽象类 abstract
继承的父子成员特点
子类继承父类:
1:子类可以访问父类的非私有成员
2:可以在子类中添加子类特有成员
继承的作用
1)继承可以提供代码的复用性:父类中的一个方法,所有的子类的都用
2)提供了程序的可扩展性
1:Java支持单继承
a:一个子类只能有一个父类(一个儿子只能有一个爹)
b:一个父类可以有多个子类(一个爹可以有多个儿子)
c:任何一个类如果没有指定父类,则他的父类默认就是Object
为什么Java不支持多继承?
如果两个父类中出现一模一样的方法,则子类如果都继承过来,在调用该方法时,会出现问题
super关键字(重点)
特点:
1:super和this一样也是一个引用,this是存放本类对象的地址,super是存放父类空间的地址
2:super只能访问到子类的直接父类(亲爹)
3:在任何一个类内部,都有一个隐藏的super,指向父类空间
什么需要使用super?
1:子类和父类出现了同名的变量,用super来区分
2:子类和父类出现了同名的方法,用super来区分
3:如果子类要调用父类的构造方式时,使用super(参数)
父子类构造方法的关系(重点)
特点:
1:当然创建子类对象时,系统会默认先调用父类的无参构造,如果父类还有父类,则会先行顶层类的构造
为什么子类会会调用父类的无参构造?
在子类构造方法的第一行有一个隐藏的super(),会自动调用父类的无参构造
意义:
在创建子类对象时,父类也会被开辟空间,父类的空间也要被初始化,所以在给子类空间初始化之前.必须先给父类的空间初始化,所以必须调用父类构造
方法的重写(重点)
特点:
1:子类写一个和父类一模一样的方法,这就是方法的重写
2:当调用重写后的方法时,执行的是子类的方法,就好像父类的方法被覆盖一样
意义:
当子类从父类继承一些方法时,如果父类的方法不能满足子类需求,则子类需要重写这些方法
需要注意的问题:
public > protected > 默认权限 > private
1:子类在重写父类方法时,子类方法的访问权限必须大于等于父类
2:如果父类的方法是private修饰,即使子类写一个和父类一样的方法,也不是重写.因为子类根本就不知道父类有这个方法,谈不上重写
3:当我们重写父类的方法时,只要和父类方法写的一模一样即可.
抽象方法
a:这种方法没有方法体(没有{})
b:抽象方法必须使用一个abstract关键字来声明
c:如果一个类有抽象方法,则该类必须加abstract关键字来声明
2:抽象类
a:类的前边有abstract关键字
b:抽象类不能创建对象
c:抽象类要作为父类
d:如果一个子类继承了抽象类,则必须重写该类中所有的抽象方法,否则该类还是抽象类
e: 抽象类不能创建对象,但是可以有构造方法,这个构造是给子类准备的.
f:一个抽象类可以没有抽象方法,这种类唯一的意义是不让我们创建该类的对象
2.2 抽象类的特点
抽象类不能创建对象,但是可以有构造方法,这个构造是给子类准备的.
2.3 抽象类的作用
我在设计一个类时,如果该类中的某个方法描述不清楚,该方法应该设为抽象方法,该类设为抽象类
某IT公司有多名员工,按照员工负责的工作不同,进行了部门的划分(研发部员工、维护部员工)。研发部根据所需研发的内容不同,又分为JavaEE工程师、Android工程师;维护部根据所需维护的内容不同,又分为网络维护工程师、硬件维护工程师。
公司的每名员工都有他们自己的员工编号、姓名,并要做它们所负责的工作。
l 工作内容
n JavaEE工程师:员工号为xxx的 xxx员工,正在研发淘宝网站
n Android工程师:员工号为xxx的 xxx员工,正在研发淘宝手机客户端软件
n 网络维护工程师:员工号为xxx的 xxx员工,正在检查网络是否畅通
n 硬件维护工程师:员工号为xxx的 xxx员工,正在修复打印机
请根据描述,完成员工体系中所有类的定义,并指定类之间的继承关系。进行XX工程师类的对象创建,完成工作方法的调用。
1.1 案例分析
l 根据上述部门的描述,得出如下的员工体系图
l 根据员工信息的描述,确定每个员工都有员工编号、姓名、要进行工作。则,把这些共同的属性与功能抽取到父类中(员工类),关于工作的内容由具体的工程师来进行指定。
n 工作内容
u JavaEE工程师:员工号为xxx的 xxx员工,正在研发淘宝网站
u Android工程师:员工号为xxx的 xxx员工,正在研发淘宝手机客户端软件
u 网络维护工程师:员工号为xxx的 xxx员工,正在检查网络是否畅通
u 硬件维护工程师:员工号为xxx的 xxx员工,正在修复打印机
l 创建JavaEE工程师对象,完成工作方法的调用
员工类:
package Employee;
public abstract class Employee {
private String id;
private String name;
public abstract void work();
public Employee() {
super();//访问父类对象的空参方法
}
public Employee(String id, String name) {
super();
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
研发部员工类:
package Employee;
public abstract class Developer extends Employee {
public Developer() {
super();
// TODO Auto-generated constructor stub
}
public Developer(String id, String name) {
super(id, name);
// TODO Auto-generated constructor stub
}
}
维护部员工类:
package Employee;
public abstract class Maintainer extends Employee {
public Maintainer() {
super();
// TODO Auto-generated constructor stub
}
public Maintainer(String id, String name) {
super(id, name);
// TODO Auto-generated constructor stub
}
}
javaEE
package Employee;
public class JavaEE extends Developer {
@Override
public void work() {
System.out.println("员工号为"+getId()+"的 "+getName()+"员工,正在研发淘宝网站");
}
public JavaEE() {
super();
// TODO Auto-generated constructor stub
}
public JavaEE(String id, String name){
super(id,name);
}
}
Android:
package Employee;
public class Android extends Developer {
@Override
public void work() {
System.out.println("员工号为"+getId()+"的 "+getName()+"员工,正在研发淘宝手机客户端软件");
}
public Android() {
super();
// TODO Auto-generated constructor stub
}
public Android(String id,String name){
super(id,name);
}
}
硬件维护:
package Employee;
public class Hardware extends Maintainer {
@Override
public void work() {
System.out.println("员工号为"+getId()+"的 "+getName()+"员工,正在修复打印机");
}
public Hardware() {
super();
// TODO Auto-generated constructor stub
}
public Hardware(String id,String name){
super(id,name);
}
}
软件维护:
package Employee;
public class Network extends Maintainer {
@Override
public void work() {
System.out.println("员工号为"+getId()+"的 "+getName()+"员工,正在检查网络是否畅通");
}
public Network() {
super();
// TODO Auto-generated constructor stub
}
public Network(String id,String name){
super(id,name);
}
}
测试类:
package Employee;
public class Test {
public static void main(String[] args) {
JavaEE javaEE = new JavaEE();
javaEE.setId("t001");
javaEE.setName("小强");
javaEE.work();
JavaEE javaEE2 = new JavaEE("t002","小明");
javaEE2.work();
}
}
推荐阅读
-
继承extends与 抽象类 abstract
-
00012.01抽象类与抽象方法(abstract)
-
PHP 抽象方法与抽象类abstract关键字介绍及应用,abstract关键字_PHP教程
-
PHP abstract 抽象类定义与用法示例
-
PHP 抽象方法与抽象类abstract关键字介绍及应用
-
PHP 抽象方法与抽象类abstract关键字介绍及应用_php技巧
-
PHP 抽象方法与抽象类abstract关键字介绍及应用,abstract关键字
-
PHP 抽象方法与抽象类abstract关键字介绍及应用
-
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
-
PHP 抽象方法与抽象类abstract关键字介绍及应用