抽象类
什么是抽象类?
针对一个事物,如果这个事物并不是具体事物,而是概括性的(需要抽象修饰这个类),比如动物,应该定义不应该定义具体类
class Animal{},并且动物的eat()/sleep()每个具体动物吃和睡不同的,所以这些功能应该声明(方法不能方法主体)将当前这个类定义为抽象类!
格式:
abstract class Animal{} 动物是一个抽象类
什么是抽象方法?只是给定义一个方法声明,没有方法主体({})
权限修饰符 返回值类型 方法名();
比如:动物的吃的功能 (抽象的,因为每一个动物吃的是不一样的,定义父类该功能必须为一个抽象)
public abstract void eat() ;
抽象类的特点: 抽象类不能实例化!(不能创建对象)
注意事项:
1.如果一个类中有抽象方法,那么这个类一定是抽象类
2.抽象类中一定是抽象方法吗?
不一定都是抽象方法,可以是非抽象的,也可以抽象的!
3.抽象类的子类是抽象类还是非抽象类呢?
子类是抽象类的情况:
一般情况没有意义的!
父类已经不能实例化(抽象了)
应该采用的父类引用指向子类对象
例如:Animal a = new Cat() ; 子类已经抽象了,无法实例化
研究都是子类是具体类的情况:
创建对象需要通过子类来实例化!
抽象类其他特点:
父类强制子类完成的事情!
抽象类成员特点:
成员变量
既可以是变量也可以是常量
成员方法:
既可以是抽象的(子类必须重写),也可以是非抽象的
构造方法:
抽象类中是可以存在构造方法(无参/有参),作用:对该类对象的数据进行构造初始化
abstract class Fu{
public int num = 100 ;//变量
public final int num2 = 50 ;//常量
public Fu(){
System.out.println("我是Fu类的无参构造方法") ;
}
//非抽象方法
public void show(){
System.out.println(num) ;
System.out.println(num2) ;
System.out.println("show Fu") ;
}
public abstract void method();
}
//子类
class Zi extends Fu{
public Zi(){
System.out.println("我是Zi类的无参构造方法") ;
}
public void method(){
int num = 30 ;
System.out.println(num) ;
}
}
//测试类
class AbstractDemo2{
public static void main(String[] args){
Fu f = new Zi() ;
f.show() ;
f.method() ;
}
}
关键词abstract
abstract跟哪些关键字冲突呢?
1.private:私有的,外界不能访问的,被private修饰的方法不能被继承
2.final :状态修饰符 被final修饰的成员方法,不能被重写,而抽象类中的抽象方法必须让子类重写这个功能!
3.static:静态,跟类相关,静态的成员方法,算不上方法重写,能够被static修饰,想通过类名调用
无论功能是抽象方法还是非抽象方法,只要存在方法重写,那么子类在重写父类的方法的时候,访问权限足够大!
多态练习题
class A{
public void show(){
show2();
}
public void show2(){
System.out.println("我");
}
}
class B extends A