【Java】抽象类中六条必须牢记的知识点

2020/8/29
闲来无事整理了一下《Java核心技术 卷Ⅰ》中有关抽象类的相关内容。共计六条重要知识点如下:

1、抽象类是含有一个或多个抽象方法的类,只要含有一个抽象方法,这个类就一定要声明为abstract。抽象类只是作为派生其他类的基类,而不适用于构造特定实例。
2、抽象类可以包含有字段和具体方法。
举例:Person类

public abstract class Person
{
   private String name;//字段
   
   public Person(String name)//构造函数
   {
      this.name = name;
   }
   
   public abstract String getDescription();//抽象方法
   
   public String getName()//具体方法
   {
      return name;
   }
}

3、抽象类不能实例化,即不能创建抽象类的对象。
4、如果一个子类继承于一个抽象类:
a)子类中部分父类的抽象函数仍未定义,那么子类也要声明为abstract。
b)子类定义了父类所有抽象方法,则子类不需要声明为abstract。
5、即使一个类中不含有抽象方法,仍可以将其声明为抽象类。
6、虽然抽象类不能实例化,但允许定义一个抽象类的对象变量。

Person p;//这是合法的

抽象类的对象变量只允许引用其非抽象子类的对象
父类变量引用非抽象子类对象时可以使用父类中的抽象方法。

//定义一个非抽象的Student类,其继承于抽象类Person
public class Student extends Person
{
   private String major;
   public Student(String name, String major)
   {
      super(name);
      this.major = major;
   }
   public String getDescription()
   {
      return "a student majoring in" + major;
   }
}

Person p = new Student("Harry", "cs");//合法,抽象类对象引用非抽象类子类的对象。
System.out.println(p.getDescription());//合法,此时的p引用的是Student类的对象。

但请注意,如果Student类中新定义了一个goClass()方法,即使此时的p引用的是Student类对象,仍然不可以调用p.goClass()。因为编译器只允许调用在类中声明的方法。

public class Student extends Person
{
   ...
   public void goClass()//新增一个父类中没有的方法
   {   
      System.out.println("In class.");
   }
}

Person p = new Student("Harry", "cs");
p.goClass();//不合法,因为Person类中没有声明goClass方法。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值