抽象(abstract)类的概述:抽象就是看不懂的
抽象类的特点
1,抽象类和抽象方法必须用 abstract 关键字修饰
抽象类:abstract class 类名 {}
抽象方法:public abstract void eat();
2,抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口
3,抽象类不能实例化,那么抽象类如何实例化呢?
按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态
抽象类的子类:
1,要么是抽象类
2,要么重写抽象类中的所有抽象方法
例子
class Demo1_Abstract {
public static void main(String[] args) {
//Animal a = new Animal(); //错误: Animal是抽象的; 无法实例化
Animal a = new Cat(); //父类引用指向子类对象
a.eat();
}
}
abstract class Animal { //抽象类
public abstract void eat(); //抽象方法
public Animal() {
System.out.println("父类空参构造");
}
}
class Cat extends Animal {
public Cat() {
super();
}
public void eat() {
System.out.println("鱼吃猫");
}
}
抽象类的成员特点
特点
1,成员变量:即可以是变量,也可以是常量,
abstract不能修饰成员变量
2,构造方法:用于子类访问父类数据的初始化
3,成员方法:即可以是抽象的,也可以是非抽象的
抽象类的成员方法特性
1,抽象方法:强制要求子类做的事情
如:重写方法。
2,非抽象方法:子类继承的事情,提高代码的复用性。
例子
abstract class Demo {
int num1 = 10;
final int num2 = 20;
public Demo(){}
public void print() {
System.out.println("111");
}
public abstract void method();
}
class Test extends Demo {
public void method() {
System.out.println("111");
}
}
1 class Demo_Teacher { 2 public static void main(String[] args) { 3 Teacher1 t1 = new Teacher1("王富贵",43); 4 System.out.println("姓名:" + t1.getName() + '\n' + "年龄:" + t1.getAge()); 5 t1.print(); 6 Teacher2 t2 = new Teacher2("陈教授",48); 7 System.out.println("姓名:" + t2.getName() + '\n' + "年龄:" + t2.getAge()); 8 t2.print(); 9 } 10 } 11 12 abstract class Teacher { 13 private String name; 14 private int age; 15 16 public Teacher() {} 17 public Teacher(String name,int age) { 18 this.name = name; 19 this.age = age; 20 } 21 public void setName(String name) { 22 this.name = name; 23 } 24 public String getName() { 25 return name; 26 } 27 public void setAge(int age) { 28 this.age = age; 29 } 30 public int getAge() { 31 return age; 32 } 33 public abstract void print() ; 34 } 35 class Teacher1 extends Teacher { 36 public Teacher1() {} 37 public Teacher1(String name,int age) { 38 super(name,age); 39 } 40 public void print() { 41 System.out.println("讲基础"); 42 } 43 } 44 class Teacher2 extends Teacher{ 45 public Teacher2() {} 46 public Teacher2(String name,int age) { 47 super(name,age); 48 } 49 public void print() { 50 System.out.println("讲就业"); 51 } 52 53 }
abstract不能与以下关键字共存
abstract和static
被abstract修饰的方法没有方法体
被static崔氏的可以用类名.调用,但是类名.调用抽象方法是没有意义的
abstract和final
被abstract修饰的方法强制子类重写
被final修饰的不然让子类重写,所以他俩是矛盾的
abstract和private
被abstract修饰的是为了让子类看到并强制重写
被private修饰的不让子类访问,所以他俩是矛盾的
如:
abstract class Demo {
//public static abstract void print(); //错误: 非法的修饰符组合: abstract和static
//public final abstract void print(); //错误: 非法的修饰符组合: abstract和final
private abstract void print(); //错误: 非法的修饰符组合: abstract和private
}