标签:log end ext ase 没有 print 第一条 style xtend
用简单的话来描述Java:编译类型与运行类型不一致的时候就会出现多态!
下面一段代码可以用来描述Java多态
class BaseClass{ public String flag="父类的flag"; public BaseClass(){ System.out.println("父类无参构造函数被调用"); } public void base(){ System.out.println("父类的base方法"); } public void test(){ System.out.println("父类的test方法"); } } class SubClass extends BaseClass{ public String flag="子类的flag"; public String flag2="子类的flag2"; public SubClass(){ System.out.println("子类无参构造函数"); } public void test(){ System.out.println("子类的test方法"); } public void exam(){ System.out.println("子类的exam方法"); } } public class Test{ public static void main(String[] args){ BaseClass bc=new BaseClass(); System.out.println(bc.flag); bc.test(); // 输出: // 父类无参构造函数被调用 // 父类的flag // 父类的test方法 SubClass sc=new SubClass(); System.out.println(sc.flag); sc.test(); sc.exam(); // 输出: // 父类无参构造函数被调用 // 子类的flag // 子类无参构造函数 // 子类的test方法 // 子类的exam方法 BaseClass X=new SubClass(); System.out.println(X.flag); // System.out.println(X.flag2);//错误 X.base(); X.test(); // X.exam();//报错 没有为类型 BaseClass 定义方法 exam() // 输出: // 父类无参构造函数被调用 // 子类无参构造函数 // 父类的flag // 父类的base方法 // 子类的test方法 } }
上面代码中,对象实例 X 的编译类型为BaseClass,运行类型为SubClass
在运行的时候
一、实例对象可以调用的方法要满足
1、该方法必须是父类中(即编译类型)包含的方法,子类(即运行类型)特有的方法(新添加的方法)不可以被调用。
2、当调用方法时,表现出来的是子类方法的特征(如子类将父类中的方法改写了,则输出改变以后的内容),否则依旧输出父类原内容
二、实例对象调用变量的原则
1、与上面第一条相同
2、访问该变量的时候,访问的始终是父类的变量,而非子类的变量,与调用方法的第二点相反
标签:log end ext ase 没有 print 第一条 style xtend
原文地址:http://www.cnblogs.com/-beyond/p/6104401.html