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) {
		 = 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
--------------------
动物吃饭