抽象类
抽象类
一、抽象类的定义与使用
1.抽象类的定义
在普通类的基础上扩充一些抽象方法(抽象方法是只声明而未实现的方法,即没有方法体);所有的抽象方法用abstract关键字定义,并且抽象方法所在的类也要用abstract修饰表示抽象类。
抽象类中包含抽象方法,抽象方法不包含方法体,所以抽象类不能直接产生实例化对象。
abstract class Person{ private String name;//属性 //普通方法 public void setName(String name){ this.name = name; } public String getNmae(){ return this.name; }
//抽象方法,无方法体 public abstract void getInfo(); } |
使用原则:
1.所有抽象类都必须含有子类;
2.抽象类的子类不是抽象类,必须覆写抽象类的所有抽象方法;
3.抽象类的子类可以使用对象多态性利用子类对其实例化;
4.private和abstract 不能同时使用(因为private为私有变量不能被覆写,而abstract必须要被子类所覆写)。
抽象类的使用:
abstract class Person{ private String name;//属性 //普通方法 public void setName(String name){ this.name = name; } public String getNmae(){ return this.name; }
//抽象方法,无方法体 public abstract void getInfo(); } class Student extends Person{ //对父类的getInfo()方法进行覆写 public void getInfo(){ System.out.println("我是一个学生"); } } class Test6{ public static void main(String[] args) { Person per = new Student(); per.getInfo();//被子类所覆写的方法 } } |
|
2.抽象类的相关规定
a.抽象类只是比普通类多了抽象方法,所以在抽象类中也可包含构造方法,并且子类遵循对象实例化的流程,实例化子类对象一定先调用父类对象。
//父类中只含无参构造 abstract class Person{ private String name;//属性 //构造方法(无参构造) public Person(){ System.out.println("我是Person类的无参构造"); } //普通方法 public void setName(String name){ this.name = name; } public String getNmae(){ return this.name; }
//抽象方法,无方法体 public abstract void getInfo(); } class Student extends Person{ ///无参构造 public Student(){ System.out.println("我是Student类的无参构造"); } //对父类的getInfo()方法进行覆写 public void getInfo(){ //空实现 } } class Test6{ public static void main(String[] args) { new Student(); } } |
|
若父类中不含无参构造,必须在子类构造中用super指明调用那个构造方法
b.对象实例化操作:进行类加载->进行类对象的空间开辟->进行类对象中的属性初始化(构造方法)
abstract class A{ //A的无参构造函数 public A(){//3、调用构造 this.print();//4、调用被子类覆写的方法 } //抽象方法 public abstract void print(); } class B extends A{ private int num = 20; public B(int num){//2、调用子类的实例化对象 super();//3、调用父类的无参构造 this.num = num;//7、为类中属性初始化 } public void print(){//5、此时子类对象的属性还没有被初始化 System.out.println(this.num);//6、对应其数据类型的默认值 } } public class Test6{ public static void main(String[] args) { A a = new B(100);//1、对子类进行对象的实例化 a.print(); } } |
|
c.抽象类中允许不定义任何的抽象方法,但是此时的抽象类仍然无法创建实例化对象。
abstract class A{ public void print(){ //普通方法,空实现 } } public class Test6{ public static void main(String[] args) { A a = new A();//错误,A是抽象类,无法实例化 } } |
|
d.抽象类不能使用final修饰,因为final修饰的类不能有子类,而抽象类必须有子类;抽象方法也不能用private修饰,因为抽象方法需要被覆写。
e.抽象类也可分为内部抽象类和外部抽象类,内部抽象类可以使用static定义来描述外部抽象类。
//外部抽象类不可以使用static修饰 static abstract class A{ public abstract void Print1(); abstract class B{ public abstract void Print2(); } }
class C extends A{ public void Print1(){ //空实现 } class D extends B{ public void Print2(){
} } } public class Test6{ public static void main(String[] args) { A a = new C(); } }
| //内部抽象类可以使用static修饰 abstract class A{ public abstract void Print1(); static abstract class B{ public abstract void Print2(); } }
class C extends A.B{ //public void Print1(){ //空实现} public void Print2(){ System.out.println("haha"); } } public class Test6{ public static void main(String[] args) { A.B b = new C(); b.Print2(); } } |
|
二、抽象类的应用——模板设计模式
抽象类的特点:
强制规定了子类的实现结构
还可起到模板的作用。
例:人=吃饭+睡觉+工作
猪=吃饭+睡觉
机器人=吃饭+工作
//模板设计模式 //先定义行为类 abstract class Action{ public static final int EAT = 1; public static final int SLEEP = 2; public static final int WORK =3; public void command(int cmd){ switch(cmd){ case EAT: this.eat(); break; case SLEEP: this.sleep(); break; case WORK: this.work(); break; case EAT+SLEEP+WORK: this.eat(); this.sleep(); this.work(); break; } } public abstract void eat(); public abstract void sleep(); public abstract void work(); }
//定义子类实现 //1、人的实现 class Person extends Action{ public void eat(){ System.out.println("人吃干净的饭菜"); } public void sleep(){ System.out.println("人困了躺在床上睡觉"); } public void work(){ System.out.println("我们现在的工作就是好好学习"); } } //2、猪的实现 class Pig extends Action{ public void eat(){ System.out.println("猪吃糠"); } public void sleep(){ System.out.println("猪总是在地上睡觉"); } public void work(){ //猪不工作 } } //3、机器人的实现 class Robot extends Action{ public void eat(){ System.out.println("机器人充电补充能量"); } public void sleep(){ //机器人不睡觉 } public void work(){ System.out.println("机器人可以不停歇的工作"); } }
//定义具体操作 public class Test6{ public static void fun(Action action){ action.command(Action.EAT+Action.SLEEP+Action.WORK); } public static void main(String[] args) { fun(new Person()); fun(new Pig()); fun(new Robot()); } } |
|