黑马程序员技术交流社区

标题: 内部类问题 [打印本页]

作者: PANZERLEADER    时间: 2013-4-16 00:25
标题: 内部类问题
本帖最后由 PANZERLEADER 于 2013-4-16 21:10 编辑

局部内部类该怎么使用啊?谁能细说下?

比如
  1. public class OuterTest {
  2.         public void show(){
  3.                 class InnerClass{
  4.                         
  5.                 }
  6.         }
  7.         public static void main(String[] args) {
  8.                
  9.         }
  10. }
复制代码
要使用InnerClass的对象该怎么做呀?

作者: 段旭东    时间: 2013-4-16 02:03
本帖最后由 段旭东 于 2013-4-16 02:05 编辑

答题开始:
从功能和定义上来说:
方法中声明内部类,目的只是由外部类来控制内部类的可见性,
将一个类放到一个方法当中去定义的时候,那么就限定了这个类的使用范围只能在方法的内部,
我们只是代码这样写而已,不要理解成为在这个方法内部有一个类,这个类是方法的一部分,目的是为了控制内部类的可见性
内部类是一个独立的个体,他们就是两个类而已,他们各自都有自己
的成员变量和方法。
那么这个在方法中声明的内部类里面当然不能访问该方法的局部变量了,他们就是各自单独的两个类,
你在一个类里面可以通过该类引用访问他的成员变量或者方法,
但是方法中内部声明的局部变量的作用域只是这个方法内部,你无法访问这个局部变量。
通俗的举个例子:
你可以看作是两个圈,小圈只能认识他内部的方法变量,不会认识小圈外的东西也就是局部变量,也就是说内部类在定义及实现时根本不知道他的圈外定义了什么!好比一块钱能买5毛的东西,但是5毛却无权买1块钱的东西!
PS:内部类的功能
1.解决多继承
2.解决继承和实现接口时候方法名冲突情况
3.实现数据隐藏
你的第二问:附上代码一组
package com.itheima;
/* 创建一个包含实例内部类的类,外部类中定义一个名为str的String字符串并初始化任意值,
*        在内部类中定义跟外部类同种类型且同名的变量,并在内部类中定义一个方法,分别打印外部类和内部类的变量。
*
* */
public class Test5 {
        public static void main(String[] args){
                // 建立一个内部类对象,同时需一起建立外部类对象
                d.x out=new d().new x();
                //调用内部类方法
                out.print();
        }
}
//创建一个名为d的 外部类
class d{
        //外部类中定义一个名为str的String的字符串并初始化值为“段旭东”
        String str="段旭东";
        class x{//创建一个 内部类X
        //在内部类中定义跟外部类同类型的同名变量
        String str="段明玉";
        //在内部类中定义一个方法
        void print(){
                System.out.println("外部类str="+d.this.str);//在this前打上类名调用外部类变量
                System.out.println("内部类str="+this.str);//this可以直接调用内部类变量
        }
        }
       
}

作者: 杨武林    时间: 2013-4-16 13:55

  在方法中定义的内部类称为局部内部类。与局部变量类似,局部内部类不能有访问说明符,因为它不是外围类的一部分,但是它可以访问当前代码块内的常量,和此外围类所有的成员。

publicclass Outer {
privateints = 100;
privateintout_i = 1;

publicvoid f(finalint k) {
finalint s = 200;
int i = 1;
finalint j = 10;

//定义在方法内部
class Inner {
ints = 300; // 可以定义与外部类同名的变量

// static int m = 20; //不可以定义静态变量
Inner(int k) {
inner_f(k);
}

intinner_i = 100;

voidinner_f(int k) {
//如果内部类没有与外部类同名的变量,在内部类中可以直接访问外部类的实例变量
System.out.println(out_i);
//可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的
System.out.println(j);
//System.out.println(i);
//如果内部类中有与外部类同名的变量,直接用变量名访问的是内部类的变量
System.out.println(s);
//用this.变量名访问的也是内部类变量
System.out.println(this.s);
//用外部类名.this.内部类变量名访问的是外部类变量
System.out.println(Outer.this.s);
}
}
new Inner(k);
}

publicstaticvoid main(String[] args) {
// 访问局部内部类必须先有外部类对象
Outer out = new Outer();
out.f(3);
}
}






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2