抽象类

一、抽象类的定义:
  • 抽象类:
  1. 在普通类的基础上扩充了一些抽象方法(0~n)的类(抽象类是普通类的超集),使用abstract关键字定义。

  2. 抽象类不能直接产生实例化对象,因为抽象类是“半成品”,无法直接使用。不能直接new。

    public class oop {
        public static void main(String[] args) {
        	A a = new A();  //报错,'A' 为 abstract;无法实例化
            B b = new B();  //只能new子类
        }
    }
    
    public abstract class A {
         public abstract void setTime();
    }
    
    public class B extends A {
        @Override
        public void setTime() {
    
        }
    }
    
二.、抽象类使用原则:
  1. 所有抽象类必须有子类(abstract与final不能同时出现,编译错误)。

    public abstract class A {
         public final abstract void setTime(); //编译报错,组合非法
    }
    
  2. 如果子类不是抽象类,子类必须覆写抽象类(父类)的所有抽象方法。(子类是抽象类则可以不要求全部覆写)

    public abstract class A {
         public abstract void setTime();
    }
    
    public class B extends A {
        @Override
        public void setTime() {
    
        }
    }
    
  3. 抽象类可以使用子类向上转型对其实现实例化,抽象类一定不能直接实例化对象(无论是否有抽象方法)。

  4. 由于抽象类强制要求子类覆写父类方法,所以private 与 abstract 不能同时使用。(private 修饰私有属性,被private修饰的属性和方法不能被外部使用)。

三、抽象类注意事项:
  1. 不能new这个抽象类,只能靠子类去实现它(约束!)。
  2. 抽象类可以写普通方法。
  3. 抽象方法必须在抽象类中。
  4. 抽象的抽象:约束

思考?

  • 其存在得意义?

    答:抽象出来,提高开发效率。

  • 抽象类存在构造器吗?

    答:抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已。在继承了抽象类的子类中通过super()或super(参数列表)调 用抽象类中的构造方法。

    public class oop {
        public static void main(String[] args) {
            B b = new B();
            System.out.println("================");
            B b1 = new B(6);
            System.out.println(b1.a);
        }
    }
    
    public abstract class A {
        //约束,有人帮我实现
        //abstract,抽象方法,只有抽象名字,没有方法的实现!
        public abstract void setTime();
        public A(){
            System.out.println("构造器");
        }
        public A(int i){
            a = i
        }
    
    public class B extends A {
        @Override
        public void setTime() {
        //调用抽象类(父类)的构造器,得使用关键字super,并且只能能在子类构造器中调用抽象类(父类)
    	public B(){
            super();
        }
        public B(int i){
            super(i);
        }
        }
    
    }
    

Q.E.D.