欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

继承extends与 抽象类 abstract

程序员文章站 2024-02-17 16:36:10
...

继承的父子成员特点

子类继承父类:

  1:子类可以访问父类的非私有成员

  2:可以在子类中添加子类特有成员

 

 

继承的作用

 1)继承可以提供代码的复用性:父类中的一个方法,所有的子类的都用

 2)提供了程序的可扩展性


1:Java支持单继承

  a:一个子类只能有一个父类(一个儿子只能有一个爹)

  b:一个父类可以有多个子类(一个爹可以有多个儿子)

  c:任何一个类如果没有指定父类,则他的父类默认就是Object

 为什么Java不支持多继承?

   如果两个父类中出现一模一样的方法,则子类如果都继承过来,在调用该方法时,会出现问题




 super关键字(重点)

   特点:

1:superthis一样也是一个引用,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员工,正在研发淘宝手机客户端软件

网络维护工程师:员工号为xxx的 xxx员工,正在检查网络是否畅通

硬件维护工程师:员工号为xxx的 xxx员工,正在修复打印机


请根据描述,完成员工体系中所有类的定义,并指定类之间的继承关系。进行XX工程师类的对象创建,完成工作方法的调用。

1.1 案例分析

l 根据上述部门的描述,得出如下的员工体系图 

继承extends与 抽象类 abstract

l 根据员工信息的描述,确定每个员工都有员工编号、姓名、要进行工作。则,把这些共同的属性与功能抽取到父类中(员工类),关于工作的内容由具体的工程师来进行指定。

n 工作内容

u JavaEE工程师:员工号为xxx的 xxx员工,正在研发淘宝网站

u Android工程师:员工号为xxx的 xxx员工,正在研发淘宝手机客户端软件

网络维护工程师:员工号为xxx的 xxx员工,正在检查网络是否畅通

硬件维护工程师:员工号为xxx的 xxx员工,正在修复打印机

创建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();

	}

}


上一篇: java 抽象类

下一篇: 决策树--ID3