0721 封装、继承、多态
内存泄露:析构时未使用delete
野指针:*p=0,p指向未知的位置
内存创建对象:
初始化:
封装:隐藏内部细节,private属性,提供public方法
继承:JAVA单继承 子类可以获得父类的属性,supper恢复隐藏;可改写基类中的方法
破坏了封装,使得父类的细节被子类知道了。
//P152 //不要在父类的构造函数中调用可以将被子类改写的方法 //我有一点疑问 class Base { public void test() { System.out.printLn("parent test"); } public Base() { test(); //此处进行调用 } } class Derived extends Base { public String name; public void test() { System.out.printLn("son test"+name.length()); } public static void main() { Derived d1=new Derived(); //此时,先创建一个Base对象 //调用Base的构造函数 //调用test函数,为什么是子类的test函数。NOT父类的test函数 //this 指针吗? //子类的test需要访问name,而此时子类name=null,指针异常 } }
//1.子类会暂存父类的属性,但是隐藏。注意不是覆盖
class Base { public String tag; } class Derived extends Base { } public class HiCode { public static void main(String[] ,args) { Derived d=new derived(); // //创建该对象时保持两个tag变量 } }
多态:
//编译时类型 ,声明 //运行时类型,赋值
//P149 帮助理解多态 //b1.test()能通过并且表示子类方法 //在编译时检查,认为是Base类型,可调用Base的方法 //在运行时发现类型为Derived,实际调用Derived的方法 class Base { public void partest() { System.out.printLn("parent test"); } public void test() { System.out.printLn("base"); } } class Derived extends Base { public void test() { System.out.printLn("Derived"); } public void sontest() { System.out.printLn("son test"); } public static void main() { Base b1=new Derived(); b1.partest();//运行时。显示正常 b1.test();//运行时。。显示出的是子类的行为特性 //b1.sontest(); 编译出错 //虽然b1所引用的变量中的确有这个方法,但是。 //b1在编译时不通过,是Base方法 } }