`
samsongbest
  • 浏览: 162239 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java内部类

 
阅读更多

Java内部类

1. 定义普通内部类

package com.sam.innerclass;

public class Parcel1 {
	
	//define inner class
	class Content{		
	}
	
	public void ship() {
		Content c = new Content();
	}
	
	public static void main(String[] args) {
		Parcel1 p = new Parcel1();
		p.ship();
	}

}

 

2. 外部类创造内部类对象

package com.sam.innerclass;

public class Parcel2 {
	
	public void ship() {
		Parcel1 p = new Parcel1();
		
		//OuterClassName.InnerClassName
		Parcel1.Content c = p.new Content();
	}
}

 

3. 给内部类加修饰符

package com.sam.innerclass;

public class Parcel3 {
	
	//define inner class
	private class Content{		
	}
	
	public void ship() {
		Content c = new Content();
	}
}

class TestParcel3{
	Parcel3 p = new Parcel3();
	// Illegal -- can't access private class:
	//! Parcel3.Content = p.new Parcel3();
}

普通的(非内部的)类,不能声明为private或protected;它们只可以被赋予public或者包访问权。

 

4.局部内部类,可定义在方法中。

package com.sam.innerclass;

public class Parcel4 {	
	public void ship() {		
		// Nesting a class within a method.
		class Content{		
		}
	}
}

 

5. 在任意作用域嵌入内部类,已经和其它类一起编译过了

package com.sam.innerclass;

public class Parcel5 {
	public void ship(boolean b) {
		if (b) {
			// Nesting a class within a scope.
			class Content {
			}
		}		
		// Can't use it here, out of scope
		//! Content c = new Content();		
	}
}

 

6. 匿名内部类

公用接口Destination

package com.sam.innerclass;

public interface Destination {
	String readLine();
}

 公用借口Contents

package com.sam.innerclass;

public interface Contents {
	int value();
}

 匿名内部类例子:

package com.sam.innerclass;

public class Parcel6 {
	public Contents ship() {
		return new Contents() {
			@Override
			public int value() {
				return 0;
			}
		};
	}
}

 上述匿名语法是下述形式的简化形式:

class MyContents implements Contents{
	public int value() {		
		return 0;
	}	
}
return new MyContents();

 

7. 带参数构造方法的匿名内部类

 

公共类

package com.sam.innerclass;

public class Wrapping {
	private int i;
	public Wrapping(int x) {
		i = x;
	}
	public int value() {
		return i;
	}
}

 

匿名内部类的构造方法带参数:

package com.sam.innerclass;

public class Parcel7 {
	public Wrapping wrap(int x) {
		return new Wrapping(x) {
			public int value() {
				return super.value()*47;
			}
		};
	}
}

 

8.匿名内部类中访问外部参数引用必须是final的。

package com.sam.innerclass;

public class Parcel8 {
	public Contents ship(final String name) {
		return new Contents() {
			String uname = name;
			public int value() {
				return 0;
			}			
		};
	}
}

 

9. 通过实例初始化,能达到为匿名内部类创建一个构造器的效果。

package com.sam.innerclass;

abstract class Base{
    public Base(int i) {
    }
    public abstract void f();
}

public class AnonymousConstructor {
    public static Base getBase(int i) {
        return new Base(i) {
            public void f() {               
            }           
        };
    }
}

package com.sam.innerclass;

abstract class Base{
	public Base(int i) {
	}
	public abstract void f();
}

public class AnonymousConstructor {
	public static Base getBase(int i) {
		return new Base(i) {
			public void f() {				
			}			
		};
	}
}

 此例中i不要求的final的,因为没有在匿名内部类中直接使用。

 

10. 内部类可以访问外围类的所有对象。

package com.sam.innerclass;

public class Parcel1 {
	int i;
	//using object of outer class
	class Content{	
		int j = i;
	}	
}

 

11.嵌套类

内部类与外部类不再有联系,嵌套类就是内部类加上一个static,内部类中不再有外部类的this对象。

package com.sam.innerclass;

public class Parcel10 {

	static class Content{
		static void ship() {		
		}
	}
}

 

12. 引用外围类的对象

要创建内部类对象,必须先创建外围类对象,因为内部类都回悄悄地连接到外围类对象。

package com.sam.innerclass;

public class Parcel11 {
	class Content {
	}

	public static void main(String[] args) {
		// this is wrong
		// ! Content c = new Content();

		Parcel11 p = new Parcel11();
		Content c = p.new Content();
	}
}

 

13. 从多层嵌套类中访问外部类成员

package com.sam.innerclass;

public class Parcel12 {
	class A {
		class B {
			class C {
			}
		}
	}

	public static void main(String[] args) {
		Parcel12 p = new Parcel12();
		Parcel12.A a = p.new A();
		A.B b = a.new B();
		A.B.C c = b.new C();
		A.B.C c2 = new Parcel12().new A().new B().new C();
	}
}

 

14. 内部类的继承

继承内部类,缺省的构造器不能用,必须在构造器里用外网类引用的super()方法。

enclosingClassReference.super();

package com.sam.innerclass;
class WithInner {
	class Inner {}
}
public class InheritInner extends WithInner.Inner{
	//! InheritInner() {} //Won't compile
	InheritInner(WithInner wi) {
		wi.super();
	}
}

 

15. 内部类可以被覆盖吗

继承外部类,再覆盖内部类,执行时并没有什么作用,内部类在各自的命名空间里。

package com.sam.innerclass;
class WithInner {
	class Inner {}
}
public class InheritInner extends WithInner{
	class Inner{}
}

 

但当覆盖的内部类明确继承某个内部类时,则有作用。

package com.sam.innerclass;
class WithInner {
	class Inner {}
}
public class InheritInner extends WithInner{
	class Inner extends WithInner.Inner {}
}

 

16. 局部内部类和匿名内部类的区别

初始化时,局部内部类可以有构造方法,匿名内部类因为没有名字,所以没有构造方法。

 

17. 内部类的class文件

Counter.class

LocalInnerClass$2.class

LocalInnerClass$1LocalCounter.class

LocalInnerClass.class

匿名类会产生一个数字加在$后面。

 

18. 为什么需要内部类

答案:可以实现Java的多重继承,每个内部类可以实现一个单独的接口。

 

19. 闭包与回掉

闭包是一个可调用的对象,记录了创建它作用域的一些信息,内部类是面向对象的闭包,内部类可以继承接口,实现方法后返回一个钩子。

 

1. 指明内部类对象的类型:OuterClassName.InnerClassName

分享到:
评论

相关推荐

    浅谈Java内部类的四个应用场景

    Java内部类是Java言语的一个很重要的概念,《Java编程思想》花了很大的篇幅来讲述这个概念。但是我们在实践中很少用到它,虽然我们在很多时候会被动的使用到它,但它仍然像一个幕后英雄一样,不为我们所知,不为我们...

    java内部类详解

    java内部类详解

    Java内部类总结

    Java内部类总结 学习java的资源

    Java内部类应用详解

    从Java1.1开始引入了内部类以来,它就引起了人们的激烈争论。其实任何优秀的语言特性用得不好就是滥用,内部类用得不好就会导致代码像迷宫一样,导致出现毫无重用的综合征。...本文档讲述Java内部类的规则及应用

    12.java内部类.zip

    12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类...

    java内部类的讲解

    这里是自己对java内部类整理的一篇文章,有可执行的源代码

    java内部类使用例子

    java内部类使用例子,可以运行

    Java内部类的四个应用场景

    谈Java内部类的四个应用场景

    java 内部类应用

    java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用

    Java 内部类

    Java 的使用 分别介绍了 成员内部类、方法内部类、静态内部类

    Java内部类(DOC)

    Java内部类Java内部类Java内部类Java内部类Java内部类Java内部类Java内部类

    java 内部类 局部内部类 匿名类 实例代码

    java 内部类 实例内部类 局部内部类 匿名类 静态内部类 实例代码

    JAVA 内部类 PPT

    详细介绍JAVA内部类的用法,用途,基本语法,及匿名类用法

    Java内部类的作用

    Java内部类的作用

    JAVA内部类总结

    JAVA内部类的一些总结

    JAVA内部类.doc

    对内部类不错的讲解,以及如何应用并且还帮你归了类,不错的选择

    java内部类

    高效的课件,详细的内容介绍,针对性的代码展示,提高性的练习题目。适合新手或者基础薄弱人员学习,一个PPT解决你编程中常见的错误,最重要的是一人下载多人使用,不受限制,没有隐藏密码

    Java 干货之深入理解Java内部类(学习资料)

    Java 干货之深入理解Java内部类;Java 干货之深入理解Java内部类;Java 干货之深入理解Java内部类;Java 干货之深入理解Java内部类;Java 干货之深入理解Java内部类;

    java基础java内部类

    java基础java内部类

Global site tag (gtag.js) - Google Analytics