目录
前言
抽象类属于Java类的高级特性,是一种特殊的类,用来提供更高级的类型抽象。如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。好,我们下面开始学习抽象类、抽象方法和嵌套类。
抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。在关键字class前面使用关键字abstract来声明抽象类,语法格式为:
abstract class 类名{
//类体
}
一个类包含有抽象方法,那么这个类必须被声明为abstract,如下所示:
public abstract class Student{
//声明字段
//声明非抽象的方法
abstract void leaning(); //声明抽象方法
}
注意:
- 当一个抽象类派生子类时,子类通常提供父类中所有抽象方法的实现。如果子类中没有实现其父类中所有的抽象方法,那么这个子类也必须被声明为abstract;
- 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样;
- 由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类;
- 父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法;
- 在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
抽象类实例
首先声明一个抽象类Student,在这个类中,提供被所有子类所全部共享的成员变量和方法,还声明一些抽象方法,这些方法需要被子类实现,但是实现的途径又各自不同。例如:
abstract class Student{ //声明一个抽象类Student
String name; //声明被所有的子类所共享的成员变量
...
void study(){
...
}
abstract void run();
abstract void eat();
}
每一个Animal类的非抽象子类,如dog类和cat类,必须实现run()和eat()方法,例如:
class dog extends Animal{ //声明dog类,是抽象类Animal的子类
void run(){ //在子类中实现父类中的声明的抽象方法,提供具体的实现
...
}
void eat(){
...
}
}
class cat extends Animal{ //声明cat类,是抽象类Animal的子类
void run(){ //在子类中实现父类中的声明的抽象方法,提供具体的实现
...
}
void eat(){
...
}
}
虽然dog类和cat类都有自己的run()方法和eat()方法,但它们实现的方法是不同的。这样就在抽象类Animal中提供了统一的对外接口,而在子类中去具体实现。
所有的子类如果要想正常的完成操作,必须按照指定的方法进行覆写才可以,而这个时候抽象类所起的功能就是一个类定义模板的功能。
抽象类的类成员
一个抽象类也可以有静态字段和静态方法。与其他类一样,可以直接使用抽象类名来引用这些静态成员。例如:
abstract class AbstractClass{
static void say(){ //定义的类方法(静态方法)
System.out.println("Hello");
};
}
public class myfirst {
public static void main(String[] args) {
AbstractClass.say(); //可以直接通过抽象类名调用其静态方法
}
}
注意:修饰符static和abstract不能一起使用。
抽象方法
如果一个方法被声明但是没有被实现,那么该方法被称为“抽象方法”。即只有方法的声明,而没有方法的实现,用关键字abstract进行修饰,语法格式为:
abstract 方法返回值类型 方法名(参数列表);
除关键字abstract,其他声明与普通方法的声明相同。但,一个接口中的所有方法,隐含的都是抽象的,因此接口的方法可以不使用abstract修饰符。
嵌套类
- 使用嵌套类有很多种原因,包括以下几种:
- 将只用在同一个地方的类进行逻辑上的分组的一种方法;
- 增强封装型;
- 使代码可读性和可维护性更强。
嵌套类的定义
在Java中允许在一个类(classA)中定义另一个类(classB),则classB称为“嵌套类”,classA称为“外部类”。例如:
class A{
...
class B{
...
}
}
嵌套类可以分为:
- 声明为static的嵌套类称为“静态嵌套类”;
- 非静态嵌套类称为“内部类”。
例如:
class outerClass{
...
static class StaticNestedClass{ //静态嵌套类
...
}
class InnerClass{ //内部类
...
}
}
内部类
内部类中不能定义任何静态成员。内部类的实例对象存在于外部类的实例对象中。并可以直接访问包围它的实例的方法和字段,包括私有方法和私有字段。
要实例化一个内部类,必须首先实例化其外部类,然后使用以下的语法创建位于外部对象中的内部对象:
OuterClass.InnerClass innerObject=outerObject.new InnerClass();
一个嵌套类可以访问它的封装类的所有私有成员,包括字段和方法。因此,被一个子类所继承的一个public或protected嵌套类可以间接访问父类的所有私有成员。
静态嵌套类
与类方法和类变量一样,静态嵌套类与它的外部类相关联,并且和静态类方法一样,一个静态嵌套类不能直接引用其他外部类的实例变量或实例方法,只能通过一个对象引用使用它们,语法格式如下:
OuterClass.StaticNestedClass
要创建一个静态嵌套类对象,可以使用下面所示的语法:
OuterClass.StaticNestedClass nestedObject=new OuterClass.StaticNestedClass();
最后
好了,Java的抽象类、抽象方法和嵌套类讲到这里了,谢谢观看!!!
我们下篇文章再见!!!
成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成。