本帖最后由 li6232876 于 2016-5-19 08:42 编辑
4.10 多态 (1)前提: ① 有继承关系;② 有方法重写;③ 要有父类引用指向子类对象。 (2)多态中的成员访问特点? ① 成员变量:编译看左边,运行看左边; ② 成员方法:编译看左边,运行看右边;→动态绑定 ③ 静态方法:编译看左边,运行看左边;→静态绑定 简单记:只有成员方法是编译看左边,运行看左边。 (3)多态的好处和弊端? ① 好处: 提高了代码的维护性(继承保证); 提高了代码的扩展性(由多态保证)。 ② 弊端:不能使用子类的特有属性和行为。 4.11 内部类 (1)内部类的访问特点? ① 内部类可以直接访问外部类的成员,包括私有; ② 外部类要访问内部类成员,必须创建对象: Outer.Inner in = new Outer().new Inner() 外部类·内部类 对象名 = 外部类对象·内部类对象 (2)成员内部类被静态修饰后的访问方式是? 答: Outer.Inner in = new Outer.Inner(); 外部类·内部类 对象名 = 外部类名· 内部类对象 (3)示例:要求使用已知的变量,在控制台输出30,20,10。 class Outer { public int num = 10; class Inner { public int num = 20; public void show() { int num = 30; System.out.println(?); // num System.out.println(??); //this.num System.out.println(???); //Outer.this.num } } } class InnerClassTest { public static void main(String[] args) { Outer.Inner oi = new Outer().new Inner(); oi.show(); } } (4)局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么?答: 因为当调用这个方法时,局部变量如果没有final修饰,他的生命周期和方法的一样长,当方法弹栈,这个局部变量也就会消失;如果用final修饰,会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也能继续使用. (5)匿名内部类 ① 格式: new 类名或接口名 ( ) { 方法重写 } 本质: 是一个集成了该类或者实现了该接口的子类匿名对象; ② 案例演示:
//按照要求,补齐代码,要求在控制台输出”HelloWorld” class OuterDemo { public static void main(String[] args) { Outer.method().show(); } } interface Inter { void show(); } class Outer { //补齐代码} 解答: class Outer { public static Inter method () { returnnew Inter () { public void show () {// 重写Inter接口中的方法 System.out.println("HelloWorld"); } }; //蓝色部分new Inter() {} 相当于Inter的一个子类对象。 } } 解析: (1)Outer.method() 是 ”类名.方法名” 调用; 说明method()是静态方法static; (2)Outer.method().show(),说明show()前面是一个对象;而有show()方法的只有Inter方法, 所以method()方法中返回值类型应该是Inter ;所以为public static Inter method () {} ; (3)Inter()方法时一个指针(抽象类),所以method()方法中return的应该是Inter()的一个子类,连带重写Inter()中的抽象方法;故为return public void show () { System.out.println("HelloWorld"); } ;
|