抽象类

一、抽象类的定义:
  • 抽象类:
  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修饰的属性和方法不能被外部使用)。

  5. 当多个子类类中方法标签相同,但方法提不同,使用抽象类

三、抽象类注意事项:
  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);
        }
        }
    
    }
    
四、抽象类与多态

老师与学生的行为

测试类

package oop.Deom08.jiehe;

public class tests {
    public static void main(String[] args) {
	//多态
        people student = new student();
        people teacher = new teacher();
        rukou rukou = new rukou();
        //学生
        student.setNames("王羲之");
        rukou.room(student);
        System.out.println("======================");
        //老师
        teacher.setNames("李丽");
        rukou.room(teacher);
    }
}

人类

package oop.Deom08.jiehe;

public abstract class  people {
    private String names;

    public String getNames() {
        return names;
    }

    public void setNames(String names) {
        this.names = names;
    }

    public abstract void eat();
    public abstract void work();
}

教师类/学生类

package oop.Deom08.jiehe;

public class teacher extends people{
    @Override
    public void eat() {
        System.out.println("面包");
    }

    @Override
    public void work() {
        System.out.println("教师");
    }
}
package oop.Deom08.jiehe;

public class student extends people{
    @Override
    public void eat() {
        System.out.println("辣条");
    }

    @Override
    public void work() {
        System.out.println("学生");
    }

}

调动类

package oop.Deom08.jiehe;

public class rukou {
    public void room(people people){
        System.out.println(people.getNames());
        people.eat();
        people.work();
    }
}

测试图

abstract.png