final 定义的类不能有子类、final定义的方法不能被复写,用final定义的变量成为了常量,常量无法修改。
如果在开发中使用了public static final定义的就是全局常量
public static final int GOOD= 100;
此概念在开发中使用频繁,只要是常量定义,都用大写字母
多态实现的前提:
继承
覆写
方法的多态性:
方法重载
方法的覆写
对象的多态性:父类与子类对象的转换操作
对象向上转型:父类 父类对象= new 子类() 自动完成的
对象向下转型: 子类 子类对象 = (子类)父类实例 强制转换
抽象类:如果类中需要定义一个没有方法体的方法,那么可以用abstract关键字定义,而包含有抽象方法的类成为抽象类
如果父类要求子类必须覆写父类的方法,普通类不能对子类产生限制,所以就用抽象类
abstract class A{ public void fun(){ System.out.println(“Hello”); } public abstract void print(); //没有方法体,使用了abstract声明,抽象方法后面没有”{ }”表示没有方法体 } class B extends A{ public void print(){ System.out.println("强制覆写"); } } public class TestDemo{ public static void main(String args[]){ A a = new B(); //向上转型,抽象类不能直接实例化对象 a.print(); //调用被子类覆写过的方法 } }
抽象类使用原则:
必须有子类,子类用extends来继承抽象类,一个子类只能继承一个父类
抽象类的子类(如果不是抽象类),那么必须覆写抽象类中全部抽象方法,普通方法不需覆写。
抽象类可以利用对象的向上转型机制,通过子类对象进行实例化操作。(抽象类不能直接被实例化对象)
抽象类不能使用final关键字来定义,因为抽象类必须有子类,final不能有
抽象类比普通类的好处是强制让子类必须覆写其中的方法。本质上就是比普通类多了几个抽象方法定义而已。
但是普通类中所有结构抽象类都可以定义,比如:普通方法,构造方法,属性,常量...而且子类对象也符合对象实例化流程,默认先调用父类中的无参构造方法,而后再执行子类自己的构造操作
抽象类中可以没有抽象方法,但依然不能用关键字new实例化操作
外部抽象类不允许使用static声明,内部抽象类可以使用,这样表明的是外部抽象类。
abstact class A{ public abstract void printA(); abstract class B{ public abstract void printB(); } } class X{ public void printA(){} public Y extends B{ public void printB(){}; } }
abstact class A{ public abstract void printA(); static abstract class B{ //加上static就成了外部抽象类 public abstract void printB(); } } class X extends A.B{ //继承B public void printB(){} }