【90%正规代码 】在以后所有进行的项目开发之中,绝对不要出现一个类去继承一个已经实现好的类,而只能够继承抽象类和接口。
对象多态性的核心本质在于方法的覆写上,那么如果说现在子类没有去进行指定方法的覆写,这样的操作就有些不合要求的。所以如果对子类的方法进行一些强制的要求就必须采用抽象类来解决。
抽象类的基本概念
抽象类只是在普通类的基础上扩充了一些抽象方法而已。
所谓的抽象方法指的只是声明而未实现(没有方法体)的方法
所有的抽象方法要求使用abstract关键字来进行定义,
并且抽象方法所在的类也一定要使用abstract定义类表示抽象类
范例:定义一个抽象类
abstract class A{
private String msg="www";
public void print() {
//普通方法
System.out.println(msg);
}
// {}为方法体,所有的抽象方法上是不包含有方法体的
public abstract void fun();//抽象方法
}
public class TestDemo {
}
现在可以发现抽象类就是比普通类多了一些抽象方法而已
抽象类中包含有抽象方法,而抽象方法与普通方法最大的区别在于其没有方法体,
即:不知道具体的实现,而如果现在产生了实例化对象,则意味着可以调用类中的所有操作。
对于抽象类使用的原则:
·所有的抽象类必须要有子类;
·抽象类的子类(不是抽象类)必须覆写抽象类中的全部抽象方法
|-方法覆写一定要考虑到权限问题:抽象方法可以使用任意权限,要求权限尽量都用public
·抽象类的对象可以用过对象多态性,利用子类为其实例化
范例:使用抽象类
abstract class A{
private String msg="www";
public void print() {
//普通方法
System.out.println(msg);
}
//{}为方法体,所有的抽象方法上是不包含有方法体的
public abstract void fun();//抽象方法
}
//一个子类只能够利用extends来继承抽象类,所以依然存在有单继承局限
class B extends A{
public void fun() {
System.out.println("hello");//子类覆写父类中所有抽象方法
}
}
public class TestDemo {
public static void main(String args[]) {
A a=new B();//实力化子类对象 子类对象向上转型之后
a.fun();//被子类所覆写过的方法
}
}
从正常的开发角度来讲,以上的操作没有任何问题,而且也是一种使用最多的形式,但是对于抽象类必须有一点说明,你以后有可能见到如下的一种形式。
abstract class A{
private String msg="www";
public void print() {
System.out.println(msg);
}
public static A getInstance() {
//只能取得B的对象 如果想取得其他类对象 生成类后继承 但是不能使用原继承类的方法
class B extends A{//定义抽象类的子类(内部类)
public void fun() {
System.out.println("hello");
}
}
return new B(); // 如果不太懂继承就记住这个套路,B()可能是返回B类中的方法吧
}
public abstract void fun();//抽象方法
}
public class TestDemo {
public static void main(String args[]) {
A a= A.getInstance();
a.fun();
}
}
此类模式属于非常模式,但是对于一些封装性是由好处的。把具体的子类封装在一起了
但并不是开发首选。
应为有抽象类产生子类,子类覆写全部抽象方法