继承抽象类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了继承抽象类相关的知识,希望对你有一定的参考价值。


继承

继承:描述的是类与类之间的所属关系,在现有类的基础上去构建一个新的类,这个新的类被称为是子类,现有的类被称为是父类,子类会自动拥有父类中可继承的属性和方法,注意,私有的内容不能继承。

继承需要用到extends关键字,具体如何继承如下代码:

l  员工类

package cn.itcast.extends继承;
/*
 * 员工类(父类),定义了姓名和功能
 * 要实现继承成员变量和方法不能私有,否则不能实现继承
 */
public class Employee {
   //定义姓名变量
   String name;
   //定义方法
   public void work(){
      System.out.println("员工在工作");
   }
}


l  研发部员工类

package cn.itcast.extends继承;
/*
 * 研发部员工类(子类),他的属性有员工类的属性和方法
 * 他的属性extends继承员工类就可以了,不用重复定义
 */
public class Developer extends Employee {
   //实验在子类中不用定义姓名是否可以打印出父类中的姓名
   public void getName(){
System.out.println(name);
}
}


l  测试类

package cn.itcast.extends继承;
/*
 * 测试类,测试Developer类是否继承了Employee类中的属性
 */
public class Test {
   public static void main(String[] args) {
      //创建Developer类的对象
      Developer s = new Developer();
      //给姓名赋值
      s.name = "张三";
      //通过Developer类的对象调用Employee类中的方法
      s.work();
      //调用Developer类中的对象
      s.getName();
   }
}


继承的好处

1、 继承的实现提高了代码的复用性

2、 继承使类与类之间产生了联系,为多态提供了前提。

继承的注意事项

1、 java中只支持单继承,不支持多继承,下面这种情况是不允许的

public class A{}

public class B{}

public class C extends A,B{}

2、 多个类可以继承同一个父类,如:

public class  A{}

public class B extends A{}

public class C extends A{}

3、 Java中可以多重继承,也就是说一个类的父类可以去继承另一个类的父类,如:

public class A{}

public class B extends A{}

public class C extends B{}

继承——子类父类中成员变量的特点

前提:该成员变量不能是私有的,子类父类中变量名重名。

创建子类对象,如果想要使用子类的成员变量,这时方法中的局部变量名字也一样,想要使用成员变量在变量名前面加上this.即可。如果想要使用父类中的成员变量,在变量名前面加上super.即可。

this. 访问本类中的成员变量

super.      访问父类中的成员变量

继承——子类父类中成员方法的特点

前提:该成员方法不能是私有的,子类父类中方法名相同。

创建子类对象,调用方法时,如果子类有就会使用子类自己的,子类没有,就会使用父类的方法。子类父类中的方法名相同,调用子类方法,该方法会重写父类方法,运行的方法还是子类中的方法。

继承的用法

以前的手机的功能有打电话,发短信,显示来电号码,现在需要加入新的功能,在来电显示号码中加入显示姓名和头像,如果在原来的代码中重新改功能的话,会遇到许多不可预知的后果,这是就需要用到继承的用法,不需要直接改原来的功能,只需要在来电显示的功能中进行方法的重即可,下面对这个需求进行代码的演示:

l  手机类

package cn.itcast.phone继承;
/*
 * 手机类
 * 功能:打电话、发短信、来电显示号码
 */
public class Phone {
   //打电话的功能
   public void callNumber(){
      System.out.println("打电话功能");
   }
   //发短信功能
   public void sendMessage(){
      System.out.println("发短信功能");
   }
   //来电显示号码功能
   public void showNumber(){
      System.out.println("来电显示号码功能");
   }
}


l  新手机类

package cn.itcast.phone继承;
/*
 * 新手机类,加入了来电显示姓名和头像功能
 * 继承Phone类,重写callNumber功能即可
 */
public class NewPhone extends Phone{
   //重写来电显示功能
   public void showNumber(){
      //调用原来的来电显示功能
      super.showNumber();
      System.out.println("显示姓名");
      System.out.println("显示头像");
   }
}


l  测试类

package cn.itcast.phone继承;
/*
 * 测试类,测试手机功能
 */
public class Test {
   public static void main(String[] args) {
      //创建Phone对象
      Phone p = new Phone();
      p.callNumber();
      p.sendMessage();
      p.showNumber();
      //创建NewPhone对象
      NewPhone newp = new NewPhone();
      //调用showNumber方法
      newp.showNumber();
   }
}


方法重写的注意事项

方法重写时,子类的方法权限必须要大于等与父类的方法权限否则编译失败。

四大权限:public(公共的)         protected(受保护的权限)  default(默认的)    private(私有的)

抽象类

什么是抽象类呢?比如研发工程师和维护工程师他们都有工程师,有自己的工作的内容,我们需要抽取他们的共性内容,他们都会工作,但是具体的工作内容并不知道,向上抽取后,只抽取了他们会工作,但是具体的实现细节并没有抽取,这就是抽象方法,抽取后的类(工程师)也就是抽象类。

抽象类必须用一个关键字加以修饰,abstract

抽象类、抽象方法的定义

抽象类的定义格式:修饰符 abstract 类名{}

抽象方法的定义格式:修饰符 abstract 返回值类型 方法名();

接下来用一段代码来演示抽象类的定义:

 package cn.itcast.abstract抽象类;
/*
 * 开发工程师类:
 *  javaEE开发工程师
 *  android开发工程师
 * 他们都属于开发工程师,他们的共性内容就是开发,抽取后并不清楚他们开发的实现细节,所以开发功能是抽象方法,
 * 该方法没有方法主体,直接以分号结束即可,类也要定义成抽象类
 */
public abstract class Developer {
   public abstract void develop();
}


需要注意的是抽象类不能实例化对象,也就是说,不能创建抽象类的对象,因为它没有方法主体,调用它的方法并不能运行,那么为什么要定义抽象类呢?抽象类都是其他具体的类向上抽取而来,不能实例化抽象类,我们可以创建子类的对象,来重写抽象类的抽象方法,具体的代码演示如下:

l  开发工程师父类

package cn.itcast.abstract抽象类;
/*
 * 开发工程师类:
 *  javaEE开发工程师
 *  Android开发工程师
 * 他们都属于开发工程师,他们的共性内容就是开发,抽取后并不清楚他们开发的实现细节,所以开发功能是抽象方法,
 * 该方法没有方法主体,直接以分号结束即可,类也要定义成抽象类
 */
public abstract class Developer {
   public abstract void develop();
}


l  JavaEE开发工程师子类

package cn.itcast.abstract抽象类;
/*
 * JavaEE开发工程师,继承父类,重写父类Develop的方法
 */
public class JavaEEDeveloper extends Developer{
   public void develop(){
      System.out.println("JavaEE开发工程师正在开发B/S软件");
   }
}


l  Android开发工程师子类

package cn.itcast.abstract抽象类;
/*
 * Android开发工程师类:继承父类,重写父类Developer的方法
 */
public class AndroidDeveloper extends Developer{
   public void develop(){
      System.out.println("Andriod开发工程师正在开发手机软件");
   }
}


l  测试类

package cn.itcast.abstract抽象类;
/*
 * 测试类
 * 测试抽象类的方法是否被子类重写
 */
public class Test {
   public static void main(String[] args) {
      //创建JavaEE的对象
      JavaEEDeveloper ee = new JavaEEDeveloper();
      //调用重写方法
      ee.develop();
      //创建Andriod对象
      AndroidDeveloper android = new AndroidDeveloper();
      //调用重写方法
      android.develop();
   }
}


抽象类的特点

1、 抽象类中的抽象方法必须被abstract修饰,抽象类的前面也必须加上abstract

2、 抽象类不能被实例化对象,因为它没有方法体,调用它没有意义

3、 抽象类的子类必须把抽象类中的方法全部重写,如果只重写一部分,这个子类还是抽象类,不能创建子类对象。

抽象类的设计思想

保证功能的完整性,强制子类重写父类中的方法。

案例

JavaEE工程师、Android工程师属于研发部,网络维护工程师、硬件维护工程师属于维护部。

公司的每名员工都有他们自己的员工编号、姓名,并要做它们所负责的工作。

l  工作内容

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

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

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

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

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

分析:我们需要对这四个职位进行共性的抽取,JavaEE工程师、Android工程师属于属于研发部,向上抽取,网络维护工程师、硬件维护工程师属于维护部,向上抽取,研发部、维护部都属于员工类,可以继续向上抽取。

代码实现:

l  员工类

package cn.itcast.abstract抽象类演示;
/*
 * 员工类:对每个职位的共性内容进行抽取
 * 共性内容:工号、姓名
 *      工作
 */
public abstract class Employee {
   //定义抽取的姓名
   private String name;
   //定义抽取的工号
   private String ID;
   
   public String getName() {
      return name;
   }
 
   public void setName(String name) {
      this.name = name;
   }
 
   public String getID() {
      return ID;
   }
 
   public void setID(String ID) {
      this.ID = ID;
   }
 
   //定义抽取的方法
   public abstract void work();
}


l  研发部类

package cn.itcast.abstract抽象类演示;
/*
 * 研发部员工类,继承员工类
 * 以后可以定义研发部员工自己特有的功能
 */
public abstract class Developer extends Employee{
 
}


l  维护部类

package cn.itcast.abstract抽象类演示;
/*
 * 维护部员工类,继承员工类
 * 以后可以定义维护部员工自己特有的功能
 */
public abstract class Maintainer extends Employee{
 
}


l  JavaEE工程师类

package cn.itcast.abstract抽象类演示;
/*
 * JavaEE研发类:继承研发部类
 * 属性:工号、姓名
 * 方法:工作
 */
public class JavaEE extends Developer{
   //重写父类的功能
   public void work(){
      System.out.println(super.getName()+"..."+super.getID()+"..."+"JavaEE工程师正在研发淘宝网站");
   }
}


l  Andriod工程师类

package cn.itcast.abstract抽象类演示;
/*
 * Android研发类,继承研发部类
 */
public class Android extends Developer{
   //重写父类中的方法
   public void work(){
      System.out.println(super.getName()+"..."+super.getID()+"Android研发人员正在研发淘宝手机客户端软件");
   }
}


l  网络维护部类

package cn.itcast.abstract抽象类演示;
/*
 * 网络维护工程师类,继承维护部类
 */
public class Network extends Maintainer{
   //重写父类方法
   public void work(){
      System.out.println(super.getName()+"..."+super.getID()+"..."+"网络维护工程师正在检查网络是否畅通");
   }
}


l  硬件维护部类

package cn.itcast.abstract抽象类演示;
/*
 * 硬件维护工程师类,继承维护部类
 */
public class Hardware extends Maintainer{
   //重写父类方法
   public void work(){
      System.out.println(super.getName()+"..."+super.getID()+"硬件维护工程师正在修复打印机");
   }
}


l  测试类

package cn.itcast.abstract抽象类演示;
/*
 * 测试类
 */
public class Test {
   public static void main(String[] args) {
      //创建个工作人员 的对象
      JavaEE ee = new JavaEE();
      Android and = new Android();
      Network net = new Network();
      Hardware hard = new Hardware();
      //调用方法
      ee.setName("张三");
      ee.setID("研发部001");
      and.setName("李四");
      and.setID("研发部002");
      net.setName("王五");
      net.setID("维护部001");
      hard.setName("马六");
      hard.setID("维护部002");
      ee.work();
      and.work();
      net.work();
      hard.work();
      
      
   }
}


 


以上是关于继承抽象类的主要内容,如果未能解决你的问题,请参考以下文章

复习面向对象--继承,重写,重载,抽象详解

继承 多态 抽象类 接口等学习内容总结

继承抽象类

继承抽象类

面向对象:继承抽象类抽象方法虚方法

java中封装,继承,多态,接口学习总结