抽象类
一、抽象类的定义:
- 抽象类:
-
在普通类的基础上扩充了一些抽象方法(0~n)的类(抽象类是普通类的超集),使用abstract关键字定义。
-
抽象类不能直接产生实例化对象,因为抽象类是“半成品”,无法直接使用。不能直接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() { } }
二.、抽象类使用原则:
-
所有抽象类必须有子类(abstract与final不能同时出现,编译错误)。
public abstract class A { public final abstract void setTime(); //编译报错,组合非法 }
-
如果子类不是抽象类,子类必须覆写抽象类(父类)的所有抽象方法。(子类是抽象类则可以不要求全部覆写)
public abstract class A { public abstract void setTime(); }
public class B extends A { @Override public void setTime() { } }
-
抽象类可以使用子类向上转型对其实现实例化,抽象类一定不能直接实例化对象(无论是否有抽象方法)。
-
由于抽象类强制要求子类覆写父类方法,所以private 与 abstract 不能同时使用。(private 修饰私有属性,被private修饰的属性和方法不能被外部使用)。
-
当多个子类类中方法标签相同,但方法提不同,使用抽象类
三、抽象类注意事项:
- 不能new这个抽象类,只能靠子类去实现它(约束!)。
- 抽象类可以写普通方法。
- 抽象方法必须在抽象类中。
- 抽象的抽象:约束
思考?
-
其存在得意义?
答:抽象出来,提高开发效率。
-
抽象类存在构造器吗?
答:抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已。在继承了抽象类的子类中通过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();
}
}
测试图
评论区