JAVA关键字——abstract的使用
1、abstract:抽象的;
2、abstract可以用来修饰的结构:类、方法;
3、abstract修饰的类就是抽象类;
3.1 抽象类不可以实例化,否则会报错:Cannot instantiate the type ···(抽象类名)
3.2 抽象类虽然不可以实例化,但它的构造器还是存在并且还是有用的, 便于子类实例化时调用,如下例子可以看到,OverWrite类实例化的时候也会用到Person2的构造器,因为它继承了Person2。至于继承了Person2后OverWrite实例对象也会创建Person2对象的原因,请看super关键字的讲解了噢!
public class Abstract5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// Person2 test = new Person2(); //抽象类不能实例化;Cannot instantiate the type Person2
// Woman women = new Woman();//抽象类不能实例化:Cannot instantiate the type Woman
OverWrite overWrite = new OverWrite();
}
}
abstract class Creature{
public abstract void breath() ;
}
abstract class Person2 extends Creature{
int age;
String name;
public Person2() {
System.out.println("Person2你好");
}
public Person2(String name,int age) {
this.name = name;
this.age = age;
}
public String eat() {
return "吃饭";
}
//抽象方法!
public abstract void read();
}
abstract class Woman extends Person2{
public abstract void beauty() ;
}
//OverWrite继承了抽象类并且重写了它的抽象方法
class OverWrite extends Person2{
public OverWrite() {
System.out.println("OverWrite你好");
}
public void read() {}
public void breath() {}
}
4、abstract修饰的方法为抽象方法;
4.1 抽象方法只有方法声明,没有方法体,也就是没有大括号;如:
abstract class Creature{
//抽象方法的声明:
public abstract void breath() ;
}
4.2 包含抽象方法的类一定是抽象类,抽象类不一定有抽象方法;
//因为由抽象方法breath(),所以这个类必须是抽象类;
abstract class Creature{
//抽象方法的声明:
public abstract void breath() ;
}
//虽然该类为抽象类,但它的方法可以是具体的方法,不用一定要有抽象方法
abstract class Creature{
//抽象方法的声明:
public void breath(){
···
};
}
4.3 若子类重写了父类(包括直接父类和间接父类)的所有抽象方法后,此子类就可以实例化;若子类没有重写,则要用abstract修饰这个子类,让它也成为一个抽象类。
//如这个类,它继承了Person2,Person2又有它自己继承的抽象类,也就是OverWrite有直接父类和间接父类,所以把这些父类的抽象方法都重写后,就可以实现实例化,如上面整体代码所示:OverWrite overWrite = new OverWrite();不会报错;
class OverWrite extends Person2{
public OverWrite() {
System.out.println("OverWrite你好");
}
public void read() {}
public void breath() {}
}
//如果子类没有重写父类的抽象方法,那就说明这个子类也含有抽象方法,那就回到4.2所讲,含有抽象方法的类必须为抽象类,所以这个类要用abstract修饰!
5、abstract使用上的注意点:
我们都知道,类的成员有属性、方法、构造器、代码块、内部类。那abstract不能修饰哪些成员呢?
5.1 不能修饰属性、构造器、方法体;
(1)抽象就是空的,属性肯定不为空,
(2)构造器不给它加{}那就失去了意义而且它不能重写,
(3)方法体本身就是一对{},把它去掉那就啥都没有了;
对于方法,也不是所有方法都能修饰的!
5.2 不能修饰私有方法、静态方法、final的方法和final的类
(1)不能修饰私有方法(private),因为私有方法子代看不见,不能重写,而抽象方法就是要重写;
(2)不能修饰静态方法(static),因为静态方法不能被重写;父类的static的方法如果在子类中也有,这两个方法不能构成重写;
(3)不能修饰final的方法,因为final方法就是最后的了,不能重写;
(4)不能修饰final的类,因为final的类不能被继承,而抽象类就是要被继承才有意义的。
以上为笔者学习总结,有误的地方还望各位朋友指出呀!