public abstract class TestAbstract
private int cnt;

public TestAbstract() {
super();
}
public TestAbstract(int cnt) {
super();
setCnt(cnt);
}

public int getCnt() {
return cnt;
}
public void setCnt(int cnt) {
this.cnt = cnt;
}
//自定义抽象方法
public abstract void show();
public static void main(String[] args) {
//TestAbstract ta = new TestAbstract();
//System.out.println("ta.cnt = " + ta.cnt); //0
public class TestSubAbstract extends TestAbstract

public static void main(String[] args) {

//子类的引用指向子类自己的对象
TestSubAbstract tsa = new TestSubAbstract();
//子类的引用只能调用子类自己的show()方法
tsa.show();

System.out.println("---------------------------");
//父类的引用指向子类的对象,形成了多态
TestAbstract ta = new TestSubAbstract();
//在编译阶段调用父类的show()方法,在运行阶段调用子类重写以后的方法
ta.show();
}

@Override
public void show() {
System.out.println("抽象类");
}

}

抽象类与模板设计模式
1、抽象方法
抽象方法就是指不能被具体实现的方法,也就是没有方法体,并且使用abstract关键字修饰
语法格式:
访问控制符 abstract 返回值类型 方法名称(形参列表);
如:
public abstract void cry();

2、 抽象类
抽象类就是指使用abstract关键字修饰的类,抽象类体现在不能实例化对象。

3、注意事项
a)抽象类中可以有成员变量、成员方法以及构造方法;
b)抽象类中可以有抽象方法也可以没有;
c)拥有抽象方法的类必须是抽象类,因此通常情况下认为拥有抽象方法并且有abstract关键字修饰的类才认为是真正的抽象类;

4、实际意义
抽象类的实际意义不在于实例化对象而在于被继承,若一个类继承自抽象类则必须要重写抽象方法,否则该类也得变成抽象类。
因此,抽象类对子类具有强制性和规范性,叫做模板设计模式

经验分享
在以后的开发中推荐使用父类引用指向子类对象的形式,因为父类引用直接调用的方法一定是父类拥有的方法,当需要更换指向的子类对象时,只需要将new后面的类型更改即可,其他代码无需改动,因此提高了代码的可维护性和可扩展性。
该方式的缺点在于:父类引用不能直接调用子类独有的方法,若调用则需要强制类型转换。