抽象类
1、抽象:笼统、模糊、不具体的概念。
2、概念:使用了关键词abstract声明的类叫作”抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽
象)。”抽象方法”,属于一种不完整的方法,只含有一个声明,没有方法主体。
格式:abstract 类名{ }
3、特点:
- 成员可以是变量,也可以是一个常量。
- 构造方法:可以有无参,可以有有参,作用:给对象进行初始化的。
- 成员方法:可以有抽象方法,还可以有非抽象方法。
- 被abstract关键字修饰,该方法只有声明没有实现,抽象方法必须定义在抽象类中。
- 抽象类不可以被实例化,因为抽象类实例化的对象调用抽象方法没有意义。
- 抽象类有其子类覆盖了所有的抽象方法后,该子例才可以被实例化,否则,这个子例还是抽象类。
4、抽象类中的注意事项:
●抽象类有构造函数吗?
有,用于给子类对象进行初始化。
●抽象类可以不定义抽象方法吗?
可以的,抽象类中既可以有抽象方法,也有非抽象方法,但很少见,目的就是不让该类创建对象。AWT 的适配器对象就是这种类。
●抽象关键字abstract不可以与什么关键字共存?
private、static、final三个不行。
●由abstract修饰的方法就是抽象方法,抽象方法没有方法体。
●抽象类不一定要包含抽象方法,但是如果类中包含了抽象方法,则该类必须被定义为抽象类。
●如果一个子类没有实现抽象父类中所有的抽象方法,则该子类也成为一个抽象类。
●构造方法、静态方法、私有方法、final方法不能被声明为抽象方法。
5、抽象类与一般类的异同点?
◆相同:抽象类和一般类都用来描述事物,都在内部定义了成员。
◆不同:一般类有足够的的信息描述事物,抽象类描述事物的信息可能不足;一般类不能定义抽象方法,只能定义非抽象方法,而
抽象类可以定义抽象方法,也可以定义非抽象方法;一般类可被实例化,抽象类不能被实例化。
6、抽象类一定是个父类吗?
抽象类可能是父类,但是当子类没有实现抽象父类中所有的抽象方法,那么子类也变成了一个抽象类。
代码示例
package org.westos; abstract class Animal { // 提供一个抽象方法(只是一个声明) // public void eat() { // // } public abstract void eat(); // 抽象方法,没有方法体,需要子类去实现抽象类的这个抽象方法 // 非抽象功能 public void method() { } } // 定义一个抽象的猫类 // abstract class Cat extends Animal{ // // } // 具体的动物类 class Cat extends Animal { @Override public void eat() { System.out.println("猫吃鱼...."); } } class Dog extends Animal { @Override public void eat() { System.out.println("狗吃骨头...."); } } public class AbstractDemo { public static void main(String[] args) { Animal a = new Cat(); Animal a2 = new Dog(); a.eat(); a2.eat(); } }
代码示例
package org.westos; abstract class Person { // private abstract void function() ; // public final abstract void function() ; .//错误的,非法的 // public static abstract void function() ;//非法的 private String name; int num = 10; // 变量 public final int num2 = 100;// 常量 // 非抽象的功能 public void show() { System.out.println(num); System.out.println(num2); } // 抽象功能 public abstract void method(); } // 学生类 class Student extends Person { @Override public void method() { System.out.println("method student..."); } } public class AbstractDemo11 { public static void main(String[] args) { // 创建对象 Person p = new Student(); // =号左边:抽象类 =号右边:具体类 形式:抽象类多态 p.show(); p.method(); } }
老师案例
具体事物:基础班老师,就业班老师
共性:姓名,年龄,讲课。
分析:
BasicTeacher
name,age
无参.有参
setXXX()/getXXX()
teach功能 hobit功能
WorkTeacher
name,age
无参.有参
setXXX()/getXXX()
teach功能 hobit功能
抽象类:Teacher类
抽象方法: teach功能() ;
非抽象方法:hobit功能
抽象类Teacher类代码
package org.westos.抽象练习; //抽象老师类 public abstract class Teacher { private String name; private int age ; public Teacher() { super(); // TODO Auto-generated constructor stub } public Teacher(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //抽象功能 public abstract void teach(); //非抽象功能 public void hobit() { } }
具体类BasicTeacher类代码
package org.westos.抽象练习; public class BasicTeacher extends Teacher { public BasicTeacher() { super(); // TODO Auto-generated constructor stub } public BasicTeacher(String name, int age) { super(name, age); // TODO Auto-generated constructor stub } @Override public void teach() { System.out.println("基础班老师教JavaSE..."); } public void hobit() {//对父类hobit()的重写 System.out.println("基础班老师爱踢足球..."); } }
基础类WorkTeacher类代码
package org.westos.抽象练习; public class WorkTeacher extends Teacher { public WorkTeacher() { super(); } public WorkTeacher(String name, int age) { super(name, age); } @Override public void teach() { System.out.println("就业班老师教JavaEE..."); } public void hobit() { System.out.println("就业班老师爱打篮球..."); } }
测试类AbstractTest类代码
package org.westos.抽象练习; public class AbstractTest { public static void main(String[] args) { //创建具体类对象 BasicTeacher bt = new BasicTeacher("张三", 27) ; System.out.println(bt.getName()+"----"+bt.getAge()); bt.teach(); bt.hobit(); System.out.println("------------------"); Teacher t = new BasicTeacher("李四", 28) ;//抽象类多态 System.out.println(t.getName()+"----"+t.getAge()); t.teach(); t.hobit(); } }