abstract
有些类并不能真正的去描述一个对象,只是将子类相似的特点抽象出来,形成了一个类的模板,这种类称为抽象类。用abstract修饰。
1.什么是abstract?
abstract的意思是抽象的,用于修饰方法、类。
2.abstract的用法
(1)abstract修饰类
被abstract修饰的类称为抽象类。
抽象类只是一个更特殊的类,抽象类也拥有普通类的基本特性,在抽象类中可以使用4个权限修饰符,任意定义属性和方法,抽象类也有构造方法;
package com.dh.abstractdemo;
//使用abstract修饰类
public abstract class AbstractDemo {
//可以使用4个权限修饰符
public String name;
int age;
public AbstractDemo(String name, int age) {
this.name = name;
this.age = age;
}
public void show(){
System.out.println("抽象类的普通方法");
}
}
下面就是抽象类的特殊性了:
抽象类只能被继承,不能实例化对象;
书写一个类继承上述抽象类:
package com.dh.abstractdemo;
public class Test extends AbstractDemo {
public Test(String name, int age) {
super(name, age);
}
}
可以看到是没有问题的。
我们再看看能不能实例化对象:
可以看到抽象类是不能实例化对象的,抽象类的作用就是充当一个类的模板,给其它的类继承。
但是,继承抽象类的子类是可以实例化对象的。
(2)abstract修饰方法
被abstract修饰的方法叫抽象方法,子类如果继承的是抽象类,必须重写其抽象方法,除非子类也是抽象方法。
注意:抽象方法是没有方法体的!用于给子类重写。
package com.dh.abstractdemo;
//使用abstract修饰类
public abstract class AbstractDemo {
public String name;
public int age;
public AbstractDemo(String name, int age) {
this.name = name;
this.age = age;
}
public void show(){
System.out.println("抽象类的普通方法");
}
//抽象方法没有方法体,用于给子类重写
public abstract void abstractMethod();
}
如果子类不重写父类的抽象方法就会报错:
可以直接点击蓝色的Implement methods在子类中生成重写的方法:此时不再报错
如果子类也是抽象类,就不是必须要实现父类的抽象方法了:
我们在(1)中看到,abstract类中是可以不书写abstract方法的,那书写了abstract方法,但是不定义成abstract类可以吗?
答案是no,书写了抽象方法就一定要将该抽象方法所在的类定义成抽象类。
3.总结
-
abstract修饰的类称为抽象类
-
可以使用4种权限符定义属性和方法;
-
拥有构造方法;
-
可以被继承,不能实例化对象;
-
继承抽象类的子类,可以实例化对象;
-
-
abstract修饰的方法称为抽象方法
-
没有方法体,给子类重写;
-
抽象类中可以没有抽象方法;
-
定义了抽象方法的类一定要定义为抽象类;
-
继承了抽象类的子类,一定要实现其抽象方法;
- 除非该类也为抽象类
-
本人水平有限,若有错误和不足,望指正~