0%

Java笔记——继承与覆盖(三)

一些关于抽象类的笔记(´Д`)。

抽象类的特点

  • 包含有抽象方法的类即为抽象类,抽象类必须有关键字abstract修饰;
  • 抽象类的访问权限必须为publicprotected,在没有访问权限关键字修饰时默认为public
  • 抽象类必须要有子类使用extends继承,并且一个子类只能继承一个抽象类
  • 若某抽象类的子类不为抽象类,则必须重写父类中所有的抽象方法;
  • 若某抽象类的子类没有实现父类的抽象方法,则必须将该子类也定义为抽象类;
  • 抽象类不能直接实例化对象,必须通过子类(子类为非抽象类)采用向上转型的方式处理
  • 抽象类不能使用关键字final声明;
  • 外部抽象类不允许使用关键字static声明,而内部抽象类允许使用关键字static声明;
  • 可直接调用抽象类中使用关键字static声明的方法而不需要实例化对象。

补充

抽象方法只有声明而没有具体的实现,即没有方法体;定义抽象方法时必须使用关键字abstract修饰。

举个栗子

抽象类的最基础的使用

abstract class Person0		//定义一个抽象类
{
public void OUTPUT0() //一般方法
{
System.out.println("NIMITIZ");
}
public abstract void OUTPUT1(); //抽象方法
}
class Person1 extends Person0
{
public void OUTPUT1() //必须要重写父类中所有的抽象方法
{
System.out.println("Hello world!");
}
}
public class PRACTICE0
{
public static void main(String[] args)
{
Person0 P0=new Person1(); //向上转型
P0.OUTPUT1();
}
}

运行结果:

Hello world!

抽象类中的构造方法

为了对抽象类中的成员进行初始化,抽象类中必定存在构造方法;并且在实例化子类对象时依然先执行父类的构造方法,再执行子类的构造方法。

abstract class Person0
{
public Person0()
{
System.out.println("Person0");
}
public abstract void OUTPUT();
}
class Person1 extends Person0{
public Person1()
{
System.out.println("Person1");
}
public void OUTPUT()
{
System.out.println("Hello world!");
}
}
public class PRACTICE1
{
public static void main(String[] args)
{
Person0 P0=new Person1();
}
}

运行结果:

Person0
Person1

使用关键字static声明内部抽象类

使用关键字static声明的内部抽象类相当于一个外部抽象类,在被继承的时候,使用<外部抽象类名>.<内部抽象类名>来表示类名。

abstract class Person0
{
static abstract class Person1 //该内部抽象类相当于一个外部抽象类
{
public abstract void OUTPUT();
}
}
class Person2 extends Person0.Person1
{
public void OUTPUT()
{
System.out.println("Hello world!");
}
}
public class PRACTICE2
{
public static void main(String[] args)
{
Person0.Person1 P01=new Person2();
P01.OUTPUT();
}
}

运行结果:

Hello world!

直接调用关键字static声明的方法

在任何情况下,都可直接调用类(不限于抽象类)中由关键字static声明的方法而不需要实例化对象。

abstract class Person
{
public static void OUTPUT()
{
System.out.println("Hello world!");
}
}
public class PRACTICE3
{
public static void main(String[] args)
{
Person.OUTPUT();
}
}

运行结果:

Hello world!

整理自

Java抽象类 详解