黑马程序员_内部类_2




                                 ----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

内部类的概念:当一个类定义在另一个类的里面,这个类就是内部类。内部类分为:成员内部类(包括静态嵌套类)、方法内部类、匿名内部类。它们的共性有

(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。

        如Outer$1。
(2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。
class Outer{
	private int x;
	class Inter{
		void showX(){
			System.out.println(x);	
		}
	}
}
//这里内部类就能访问外面的x,即使x是private的

(3)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量。
class Outer{
	private static int x;
	static class Inter{
		void showX(){
			System.out.println(x);	
		}
	}
}
//这里showX方法可以访问x,因为x被static修饰了。假如x 
//注意内部类定义了静态成员,那么这个内部类就必须是static


下面分类介绍java内部类。
一、成员内部类:把内部类定义在成员位置上。这个时候,内部类可以被成员修饰符修饰。如static,private。当被static修饰的后,它只能访问外部类中的static成员。出现的访问局限。当被 private修饰后,外部其他类就不能直接访问这个类了。
被static修饰的示例:
public class InnerClass {
	public static void main(String[] args){
	new Outer.Inter().showX();
}
}
class Outer{
	private static int x = 10;
	static class Inter{
		void showX(){
			System.out.println(x);	
		}
	}
}
//外部其他类访问的格式 new 外部类名.内部类名().方法

仅仅被private修饰的示例::
public class InnerClass {
	public static void main(String[] args) {
		new Outer().method();
	}
}
class Outer{
	private int x = 10;
	void method(){
		new Inter().showX();
	}
	private class Inter{
		void showX(){
			System.out.println(x);	
		}
	}
}
注意:当内部类定义了静态成员。该内部类就一定要定义成static。


二、方法内部类:把内部类定义在方法内。这时内部类不能被成员修饰符修饰。
方法内部类的准则:
(1)、方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。
(2)、方法内部类对象不能使用该内部类所在方法的非final局部变量。
示例:
public class MethodInnerClass {
	public static void main(String[] args) {
		new Outer1().doSomething();
	}
}
class Outer1{
	int y = 20;
	public void doSomething(){
		final int x = 10;            //要定义为final,不然访问不了.            
		class Inner{
			public void show(){
				System.out.println(x + y);
			}

		}
		Inner inter = new Inner();         //只能在定义内部类的方法里实例化
		inter.show();
	}
}

三、匿名内部类:顾名思义,没有名字的内部类。
(1)、定义匿名内部类要满足的条件:a、只用到类的一个实例。
b、类在定义后马上用到。
c、类非常小。
d、给类命名并不会导致你的代码更容易被理解。
e、内部类必须继承一个类,或者必须实现接口。然后这个内部类就是这个类或者接口的子类。
(2)、匿名内部类的好处就是大大的简化了书写。
示例:
public class MissingName {
	public static void main(String[] args)
	{
		new AbsDemo() {                     //继承了AbsDemo       注意,这里不能被修饰符修饰
			
			@Override
			void show() {
				System.out.println(getClass().getName());
				
			}
		}.show();                      //马上使用了
	}
}
abstract class AbsDemo{
	abstract void show();
}


为什么要使用内部类:
典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其的外围类的对象。所以你可以认为内部类提供了某种进入其外围类的窗口。(人和心脏的例子)

使用内部类最吸引人的原因是:
每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。




            ----------------------- android培训java培训、java学习型技术博客、期待与您交流! ----------------------

详情请查看:http://edu.csdn.net/heima



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值