论坛首页 Java企业应用论坛

Java的内部类——你知道多少?   

浏览 14897 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (5) :: 隐藏帖 (6)
作者 正文
   发表时间:2011-03-04  
haiwoo 写道
 最后一个问题就是:怎样写一个匿名的内部类?如果大家搞过Java Swing或者Android开发,这个问题对你来说很简单,因为在随便的一些事件里,你就可以定义一个匿名的内部类,然后实现它的方法。
  内部类最大好处 就是保持跟外部类的生命周期一致,可以通过管理一个类的生命周期来维护俩个类的生命周期在线成池 ,连接池 ,通信套接字 是必然用到的。
这些要求内存管理很高的时候,对类的生命是必须负责的 ,但过多的类不好维护,通常为便于方便维护,就将归纳
并放在一起

学习了
0 请登录后投票
   发表时间:2011-03-04  
yangguo 写道
天下本不需内部类,庸人自扰之。


同意

貌似最近也被javaeye扣分了...
0 请登录后投票
   发表时间:2011-03-04   最后修改:2011-03-04
hehez 写道
ricoyu 写道
引用
如果这样写的话,会报编译错误。那么为什么会报错呢?因为在Java的设计中,如果想访问一个类的内部类,你必须通过宿主类去取它,然后,再对它进行操作,Java就是想这样把内部类给封闭起来的,好吧,正确的写法,我给大家贴出来:

  以下是内部类的写法:

  

1 public class MainClass {
2     public InnerClass getInnerClass() {
3         return new InnerClass();
4     }

6     public class InnerClass {
7         public String name = "name";

9         public String getName() {
10             return name;
11         }
12
13         public void setName(String name) {
14             this.name = name;
15         }
16     }
17 }

  如果你想访问Java内部类,你必须先拿到它的宿主类,这样你才能对内部类进行操作:



1 public class CheckClass {
2     public static void main(String[] args) {
3         MainClass mainClass = new MainClass();
4         System.out.println(mainClass.getInnerClass().getName());
5     }
6 }

  这样的话,编译就不会报错了。


不用这么麻烦非要在外围类里面通过方法返回一个内部类的实例吧?
因为你的内部类是public的, 所以可以这样子写
1 public class CheckClass {
2     public static void main(String[] args) {
3         MainClass main = new MainClass();
4         MainClass.InnerClass inner = main.new InnerClass();
5     }
6 }



好的,谢谢



好啥好啊?这样写的话,还要内部类干嘛?直接放在外面分成两个类好了。

这种不伦不类的写法,分明是为了使用内部类而使用内部类。

内部类一般两种用法:
1、内部类为private类型,目的是不被外部发现你用了内部类。
2、static类型,直接 MainClass.InnerClassName 调用。
0 请登录后投票
   发表时间:2011-03-04  
内部类在初学java的时候,还好好了解了一下,不过在实际开发中,几年来也没使用过这种!不了解内部类的实用价值
0 请登录后投票
   发表时间:2011-03-04  
8830417 写道
xutao5641745 写道
楼主:我觉得你讲这么多还是没有讲清楚到底何时用内部类,何时用静态内部类,何时用匿名内部类,何时用局部类。

能不能讲解下???谢谢



我的博客里面写了一篇,但不是很详细,希望对你有帮助!
0 请登录后投票
   发表时间:2011-03-04   最后修改:2011-03-04
1.外部类(非主类)通过怎样的方式访问内部类?
前提是内部类,必须不能被定义成private的,否则外部类无法访问(这跟类里的其他普通属性一样)
public class OuterClass {

	public class InnerClass {

	}

	public static class StaticInnerClass {

	}

}

public class TestClass {

	public static void main(String[] args) {
		OuterClass.InnerClass innerObj = new OuterClass().new InnerClass();
		System.out.println(innerObj);

		OuterClass.StaticInnerClass staticInnerObj = new OuterClass.StaticInnerClass();
		System.out.println(staticInnerObj);

	}
}


2.内部类能不能访问主类私有的属性,为什么?
可以
public class OuterClass {

	private String privateOuterField;
	private static String privateStaticOuterField;

	public class InnerClass {
		
		//访问外部类的非静态变量
		public String innerField1 = privateOuterField;//直接访问
		public String innerField2 = OuterClass.this.privateOuterField;

		//访问外部类的静态变量
		public String innerField3 = privateStaticOuterField;//直接访问
		public String innerField4 = OuterClass.privateStaticOuterField;
	}

	public static class StaticInnerClass {
		
		//访问外部类的非静态变量
		public String innerField1 = privateOuterField;//不能直接访问(此行编译会报错)
		public String innerField2 = new OuterClass().privateOuterField;
		
		
		//访问外部类的静态变量
		public String innerField3 = privateStaticOuterField;//直接访问
		public String innerField4 = OuterClass.privateStaticOuterField;
	}

}



3.内部类能不能继承别的类和接口?
肯定能继承别的类,因为所有类首先都是Object的子类
实际上,只要是在宿主类里能访问到的类和接口,都可以让内部类来继承或实现(前提是被继承的类不能使用final定义)

public class SupperClass {

}

public interface SuperInterface {

}

public class OuterClass {

	public class InnerClass extends SupperClass implements SuperInterface {

	}

}


4.内部类能不能是static的?
可以,见1,2

5.在主类的方法里面可不可以定义内部类?
这个问题我和LZ理解的有点不一样
LZ理解成能否在主类方法中使用内部类了
我的理解是在在主类function里可不可以有类的定义?答案是可以的

public class OuterClass {

	public class InnerClass {

	}

	public void function() {

		class FunctionInnerClass {

		}

		FunctionInnerClass funInnerClassInstance = new FunctionInnerClass();
		
		System.out.println(funInnerClassInstance);
	}

}

public class TestClass {

	public static void main(String[] args) {
		new OuterClass().function(); // 执行结果:OuterClass$1FunctionInnerClass@1fb8ee3
	}
}




6.初始化主类的时候是不是也把内部类给初始化了?为什么?
比较同意LZ的观点



7.怎样写一个匿名的内部类?


举个小例子
public class SupperClass {

}

public class OuterClass {

	public SuperInterface superInterface = new SuperInterface() {
		
		@Override
		public void fun() {
			System.out.println(this.getClass());
		}
	};

}

public class TestClass {

	public static void main(String[] args) {
		new OuterClass().superInterface.fun(); // 执行结果:class OuterClass$1
	}
}


在Swing编程,处理事件的时候,匿名内部类的用法比较常见。
其实多线程里也有这样的用法:

public class TestClass {

	public static void main(String[] args) {
		new Thread(new Runnable() {

			@Override
			public void run() {
				System.out.println(this.getClass());
			}
		}).run(); //运行结果:class TestClass$1
	}
}




0 请登录后投票
   发表时间:2011-03-04  
ricoyu 写道
每个内部类都能独立地继承自一个实现, 所以无论外围类是否已经继承了某个实现, 对于内部类都没有影响。 即内部类有效地实现了多重继承

谢谢指点
0 请登录后投票
   发表时间:2011-03-04  

引用
好啥好啊?这样写的话,还要内部类干嘛?直接放在外面分成两个类好了。

这种不伦不类的写法,分明是为了使用内部类而使用内部类。

你不知道内部类是了解它的外围类的吗? 为什么说“了解”? 因为即便是外围类的private字段, 内部类照样可以访问到,所以请教一下把他们分成两个类以后, 拆分出来的内部类如何去访问外部类的属性? 假设外部类处于安全原因没有提供任何getter/setter方法?
0 请登录后投票
   发表时间:2011-03-04  
不够详细,希望能再扩展点.
0 请登录后投票
   发表时间:2011-03-04  
akunamotata 写道
yangguo 写道
天下本不需内部类,庸人自扰之。


同意

貌似最近也被javaeye扣分了...

同意 +1
and
扣分 +1
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics