Nested Classes和Inner Classes

Nested classes 是指定义在类内部的类,Nested classes分两类:静态与非静态,静态叫static nested classes,非静态的叫inner claess。

class OuterClass {
    ...
    static class StaticNestedClass {
        ...
    }
    class InnerClass {
        ...
    }
}

Nested classes是外围类(enclosing classes)的一个成员,所以可以声明为private, protected , public 或 package private(default)。(外围类只能声明为public, 和default)


Java为什么引入Nested classes

  • 使类的设计更合理,比如一个类仅在一个地方使用,此时Nested classes更合适
  • 使封装性更好
  • 可读性和可维护性更好
  • 可以补充实现多继承(Thinking in Java 4e P259 Why inner classes)


Anonymous inner classes

Anonymous inner classes定义在方法中,因为没有类名,所以都通过new 直接创建它的实例。在Anonymous inner classes中可以访问外围的所有成员。

Anonymous inner classes:

class Base {
	String name;
	public Base() { name = "Base"; }
	public Base(String name) {this.name = name;}
}

public class AnonymousInnerClasserTest {

	public Base createBase(){
		//Must be final, refer to relative links in bottom
                final String str = "inner";
		
		return new Base() {
			void setName(){
				this.name = str;
			}
		};
	}
}

Non-final arguments in constructor

public class AnonymousInnerClasserTest {

	public Base createBase(){
		String str = "inner";
		
		return new Base(str) {
			void print() {}
		};
	}
}

Anonymous constuctor in inner class

public class AnonymousInnerClasserTest {

	public Base createBase(){
		String str = "inner";
		
		return new Base(str) {
			{System.out.println(this.name);}
			void print() {}
		};
	}
}


Static nested classes

static nested classes 不能访问外部成员,因为静态类无法访问非静态成员

Inner class 与static nested classes区别:

  • Inner class可以访问外围成员,static nested classes不能
  • inner class不能拥有静态成员,static nested classes可以

public class InnerAndNested {

	int outer = 10;
	
	//Inner class
	private class InnerClass {
		
		//inner class can't have static member, complier error
		//static String STRING = "TEST";
		//static void test() {}
		
		void print(){
			System.out.println(outer);
		}
	}
	
	//Static nested class
	private static class NestedClass {
		static String STRING = "TEST";
		static void test() {}
		
		//static class can't reference non-static member 
		void print(){
			//System.out.println(outer);
		}
	}
}

相关链接:

Nested Classes

How does java implement inner class closures?

Why inner classes require “final” outer instance variables [Java]?

Cannot refer to a non-final variable inside an inner class defined in a different method


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值