使用关键字abstract的方法,被定义为抽象方法,拥有抽象方法的抽象类必须用abstract来修饰,抽象方法是指没有方法体的方法,它的方法体在子类被重写。
抽象类无法被实例化,抽象类的抽象方法没有方法体,因此无法被调用。
抽象类的使用原则:
1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public,同时抽象类不一定有抽象方法;
2)抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理;
3)抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;
4)子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类)。
抽象类与普通类的区别:
1)抽象类继承的子类必须对抽象类的抽象方法进行重写,普通类可以选择性的重写父类的方法;
2)抽象类比普通类只多了一些抽象方法,其他与普通类一样;
3)普通类的对象可以直接被实例化,而抽象类不能被直接实例化。
抽象类的使用限制:
1)抽象类也有构造方法,目的是为了属性的初始化,并且子类对象实例化的时候,会先调用抽象类的构造方法,再调用子类的构造方法。
abstract class A{
public A(){
System.out.println("A类构造方法");
}
}
class B extends A{
public B(){
System.out.println("b类构造方法");
}
}
public class AbstractDemo {
public static void main(String[] args) {
A a = new B();
}
}
运行结果:

2)抽象类不能用final修饰,因为抽象类必须有子类,而用final修饰的类不能有子类;
3)外部抽象类不允许使用static声明,而内部抽象类可以使用static声明;
abstract class A{
static abstract class B{
abstract void print();
}
}
class C extends A.B{
@Override
void print() {
System.out.println("-------------");
}
}
public class AbstractDemo {
public static void main(String[] args) {
A.B a = new C();
a.print();
}
}
运行结果:

4)抽象类的普通方法任何时候都可以用static声明,而且调用时可以直接调用,不用创建对象;
abstract class A{
abstract void print();
static void test(){
System.out.println("static声明方法");
}
}
class C extends A{
@Override
void print() {
System.out.println("-------------");
}
}
public class AbstractDemo {
public static void main(String[] args) {
A.test();
}
}
运行结果:

5)有时候由于抽象类中只需要一个特定的系统子类操作,所以可以忽略掉外部子类。这样的设计在系统类库中会比较常见,目的是对用户隐藏不需要知道的子类。
abstract class A{
abstract void print();
private static class B extends A{
@Override
void print() {
System.out.println("**************");
}
}
static A getInstance(){
return new B();
}
}
public class AbstractDemo {
public static void main(String[] args) {
A a = A.getInstance();
a.print();
}
}
运行结果:

文章介绍了Java编程中抽象类和抽象方法的概念及使用规则。抽象类不能被实例化,含有抽象方法的类必须声明为抽象类,子类继承抽象类后必须实现所有抽象方法(除非子类也是抽象类)。此外,还提到了抽象类的构造方法、静态方法的使用以及抽象类的某些设计策略。
3万+

被折叠的 条评论
为什么被折叠?



