用法:abstract抽象类与抽象方法的笔记

/*
 * abstract
 * 抽象类与抽象方法的使用
 * 1.抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类
 * 2.如果子类没有实现父类的所有抽象方法,子类必须被定义为抽象类
 * 3.没有抽象构造方法,也没有抽象静态方法
 * 4.抽象类中可以有非抽象的构造方法,创建子类的实例时可能调用
 * */
public abstract class Base {
	//抽象类中可以没有抽象方法,但包含了抽象方法的类就必须被定义为抽象类
	public abstract void method1();
	public abstract void method2();
	public void method3(){}
	//没有抽象的构造方法
	//public abstract Base(){}
	//没有抽象的静态方法
	//static abstract void method4();
	public String var="Base";
	public Base(){
		System.out.println("父类的无参构造方法");
	}
	static void method4(){
		System.out.print("静态方法表示类所特有的功能,这种功能的实现不依赖于类的具体实例,也不依赖于它的子类。因此,当前类必须为静态方法提供实现");
	}
}
//如果子类没有实现父类的所有抽象方法,子类必须被定义为抽象类
public abstract class Sub1 extends Base {
	public String var="Sub1";
	public void method1() {
		System.out.println("重写父类的method1");
	}
}
//否则就必须实现父类的所有抽象方法
public class Sub2 extends Base {
	public String var="Sub2";
	public Sub2(){
		System.out.println("子类的无参构造方法");
	}
		public void method1() {
		System.out.println("重写父类的抽象方法method1");
	}
	public void method2() {
		System.out.println("重写父类的抽象方法method2");
	}
}
public class Test {
	public static void main(String[] args) {
		//抽象类不允许实例化
		//Base base=new Base();
		//抽象类中可以有非抽象的构造方法,创建子类的实例时可能调用
		//抽象类不能被实例化,但可以创建一个引用变量,其类型是一个抽象类,指向非抽象的子类实例
		Base test=new Sub2();
		//method1()是普通方法,在调用时,实行动态绑定,根据test的实例类型来执行。
		test.method1();
		//method4()是静态方法,在调用时,实行静态绑定,根据test的引用类型来执行。
		test.method4();
		//成员变量(static修饰和没有static修饰的变量),在调用时,实行静态绑定,根据test的引用类型来执行。
		System.out.println("\n测试:Test.var调用的是"+test.var+"的变量");
	}
}

猜你喜欢

转载自4636.iteye.com/blog/2315242