A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

本帖最后由 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");  } ;

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马