【java】内部类学习

1. 成员内部类
  • 成员内部类的成员变量和成员方法没有static修饰;
  • 成员内部类作为外部类的成员,可以直接访问外部类的所有成员方法和成员变量,即使是私有的;
  • 外部类要想访问内部类的成员方法和成员变量,必须先创建内部类对象,通过内部类对象的引用来调用内部类的成员。可以有两种方法创建内部类对象:
    – 1. 外部类对象的引用调用getInner()方法
    – 2.外部类对象的引用使用.new语法
  • 要想在内部类中创建对外部类对象的引用,可以使用.this语法。该方法产生的引用自动具有正确的类型,在编译期就被知晓并受到检查,没有运行时开销(来自《java编程思想》)
  • 当内部类和外部类具有相同的成员变量和成员方法时,内部类能直接访问到的默认是内部类的成员变量和成员方法,若要访问外部类的成员,可以使用.this语法;否则,内部类能直接访问到外部类的成员变量和成员方法。
public class OuterClass1 {
	private int a=5;
	private int c=10;
	
	private Inner getInner(){
		return new Inner();
	}
	
	private void alert(){
	    System.out.println(b);//编译不通过,不能直接访问内部类成员
	    System.out.println(getInner().b);//这样才能访问到内部类的成员
	    System.out.println(this.new Inner().b);//或者使用.new语法
		System.out.println("I'm outter!");
	}

	public class Inner{
		private int a=3;
		private int b=7;
		private OuterClass1 getOutter(){
			return OuterClass1.this;
		}
		/*当内部类和外部类具有相同的成员变量时,内部类能直接访问到的默认是内部类的成员变量,若要访问外部类的成员,可以使用.this语法*/
		private void alert(){
			System.out.println(a);//此处访问到的a==3
			System.out.println(OuterClass1.this.a);//此处访问到的a=5
			System.out.println(c);//可以直接访问到外部类成员,c=10
			System.out.println("I'm inner!");
		}
	}

	public static void main(String[] args) {
		OuterClass1 out=new OuterClass1();
		/*外部类对象调用内部类私有方法*/
		Inner in1=out.getInner();
		in1.alert();		
		OuterClass1.Inner in2=out.getInner();
		in2.alert();		
		Inner in3=out.new Inner();//.new语法
		in3.alert();		
		OuterClass1.Inner in4=out.new Inner();//.new语法
		in4.alert();
		/*内部类对象调用外部类私有方法和私有变量*/
		in1.getOutter().alert();
		in2.getOutter().alert();
		in3.getOutter().alert();
		in4.getOutter().alert();
		System.out.println(in1.getOutter().a);
	}
}
2. 局部内部类
  • 定义在方法或作用域中,用于在解决一个复杂问题的过程中辅助你的解决方案,但是又不希望这个类是公共可用的。
  • 局部内部类不能用public、protected、private以及static修饰。(可以用final修饰)
  • 匿名内部类也是局部内部类的一种
  • 局部内部类中访问外部方法中的局部变量,该变量必须是final修饰的。原因:http://blog.csdn.net/lhacker/article/details/7967128。
  • 但是,在JDK 1.8中,该局部变量可以不是final修饰,编译器在编译时会自动对其加上final。
public class ThreadTest3 {

	public static void main(String[] args) {
		Person person = new Person();//由于安装的是jdk 1.8,因此此处不需要加final修饰
		int a = 5;//由于安装的是jdk 1.8,因此此处不需要加final修饰
		String str = new String("haha");
		Executor executor = Executors.newFixedThreadPool(10);
		executor.execute(new Runnable() {
			public void run() {
				for (int i = 0; i < 50; i++) {
					System.out.println(str + a + "info: " + person + i);
				}
			}
		});
		System.out.println("over!");
	}
}

class Person {
	private int age = 26;
	private String name = "hiphone";

	public Person() {
	}

	public String toString() {
		String info = " " + name + ":" + age;
		return info;
	}
}
3. 静态内部类(嵌套类)

未完待续…………

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值