Java基础之abstract关键字

tech2022-09-12  103

abstract关键字

抽象类:实现多态机制

abstract关键字一般用来定义抽象类,和抽象方法。(抽象类也是类,只不过包含抽象方法)

抽象类的一大优点:可以充分利用公共属性来提高开发和维护程序的效率。

对于抽象类与抽象方法的限制:

抽象类可以有零个或多个抽象方法,也可以包含非抽象的方法。抽象类中可以没有抽象方法,但是有抽象方法的一定是抽象类。对于抽象方法来说,在抽象类中只指定其方法及其类型,而不书写其实现代码。抽象类不能创建对象,创建对象的工作由抽象类派生子类来实现。如果父类中已有同名的abstract方法,则子类中就不能再有同名的抽象方法。abstract不能与final并列修饰同一个类。abstract不能与private,static,final或native并列修饰同一个方法。

1.创建动物抽象类

package AbstractKey; /* * 抽象类 * 抽象类除了不能实例化对象之外,类的其它功能依然存在, * 成员变量、成员方法和构造方法的访问方式和普通类一样。 * * 此案例用动物类说明 * Animal是动物体系最顶级的 * 主要用于定义有哪些功能, * 一旦类中定义有抽象的方法,那么这个类就是抽象类。 * 但是抽象类中不一定有抽象方法。 * * */ public abstract class Animal { // 属性 private String name; private int age; // 构造方法 public Animal() { } // 抽象方法,不实现(没有方法体即{}) public abstract void eat(); // 非抽象成员方法get,set方法 public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } }

2.创建dog类继承动物类

package AbstractKey; /* * 狗类继承动物类 * 一旦一个类 继承了 抽象类(抽象类中有抽象方法) * 那么这个类 * 要么重写抽象方法 * 要么将此类也修饰为抽象类 */ public abstract class Dog extends Animal { // 狗的私有属性---品种 private String type; // 狗的特有功能 public void funcation() { System.out.println("Dog function"); } public void setType(String type) { this.type = type; } public String getType() { return type; } }

3.创建猫类继承动物类

package AbstractKey; /* * 猫类 * 继承动物类 * * */ public class Cat extends Animal{ // 定义猫的属性 private String type; // 重写父类中的抽象方法 @Override public String eat() { return "Cat eat"; } // 特有功能 public void function() { System.out.println("Cat function"); } // 成员方法 public void setType(String type) { this.type = type; } public String getType() { return type; } }

5.测试类

package AbstractKey; /* * 测试抽象类 * * */ public class Test { public static void main(String[] args) { // 多态,向上转型 Animal cat = new Cat(); cat.eat(); // 向下转型,调用子类对象特有的功能 Cat c = (Cat)cat; System.out.print("调用猫类中的catchMouse方法: "); c.function(); c.setType("狸花猫"); System.out.println("输出猫的品种:"+c.getType()); System.out.println("----------------"); // Dog是抽象类,不能创建对象,但可以通过匿名内部类进行实例化 Animal dog = new Dog(){ @Override public String eat() { return "通过匿名内部类重写狗吃饭"; } }; System.out.println("调用dao中的eat方法:"+dog.eat()); // 向下转型为Dog类型 Dog d = (Dog)dog; // 子类是抽象方法,可以重写(也可以不重写)eat()方法 System.out.println("转型为Dog的对象调用eat方法:"+d.eat()); d.funcation(); System.out.println("--------------------"); // 创建一个匿名内部类对象,会自动生成重写抽象类中的方法 Animal animal = new Animal() { @Override public String eat() { return "动物吃饭"; } }; System.out.println(animal.eat()); } }

运行结果:

调用猫类中的catchMouse方法: Cat function 输出猫的品种:狸花猫 ---------------- 调用dao中的eat方法:通过匿名内部类重写狗吃饭 转型为Dog的对象调用eat方法:通过匿名内部类重写狗吃饭 Dog function -------------------- 动物吃饭
最新回复(0)