`

Inner Class(内部类)

 
阅读更多

简述:

每个类会产生一个.class文件,文件名即为类名。内部类也会产生这么一个.class文件,但是它的名称却不是内部类的类名,而是有着严格的限制。由外围类的名字,加上$再加上内部类名字。 内部类不是在调用方法时生成,而是与外围类一同编译,就可以通过查看.class文件的方式来证明。

 

使用内部类的好处:

内部类提供了某种进入外围类的窗户,每个内部类都能独立地继承一个接口,而无论外围类是否已经继承了某个接口。 因此,内部类使多重继承的解决方案变得更加完整。

 

Inner Class(内部类)

1、定义:一个类的定义放在另一个类的内部,这个类就叫做内部类。

    示例:

public class OuterTest {
	
	public class InnerTest {
		public void test() {
			System.out.println("this is inner Class");
		}
	}
	
}

  

 

 

 

InnerTest就叫做内部类,创建了内部类时,不需任何特殊条件能访问外围类的所有成员。

 

2、内部类可以访问外围类的任何对象和方法,注意内部类的实现方式与平常的不同

public class OuterTest {
	
	private String str = "hello";
	
	public class InnerTest {
		public void test() {
			System.out.println(str + " this is inner Class");
		}
	}
	
	public static void main(String[] args) {
		OuterTest ot = new OuterTest();
		OuterTest.InnerTest it = ot.new InnerTest();
		it.test();
	}
}

 

用外围类创建内部类对象时,此内部类对象会秘密的捕获一个指向外围类的引用,于是,可以通过这个引用来访问外围类的成员。通常,这些都是编译器来处理,我们看不到,也不用关心这个。

 

 

 

 3、.this与.new

public class OuterTest {
	
	private int it = 0;
	
	public OuterTest(){
	}
	
	public OuterTest(int i){
		this.it = i;
	}
	
	public class InnerTest {
		public void test() {
			// 通过.this方法直接获得外围类
			System.out.println(OuterTest.this.it);
		}
		
		public void test2(OuterTest ot) {
			// 传递进来的外围类
			System.out.println(ot.it);
		}
		
		public void test3() {
			System.out.println(new OuterTest().it);
		}
	}
	
	public static void main(String[] args) {
		OuterTest ot = new OuterTest(100); 
		// 如果想直接创建一个内部类对象,而不是通过外围类对象的方法来得到,可以使用.new关键字
		// 必须是外围类对象.new,而不能是外围类.new
		OuterTest.InnerTest it = ot.new InnerTest();
		it.test();
		it.test2(ot);
		it.test3();
	}
}

 

.new:想直接创建一个内部类对象,而不是通过外围类对象的方法来得到,可以使用.new关键字,必须是外围类对象.new,而不能是外围类.new

.this:是用来在内部类调用外围类的方法,不需要类对象

 而且需要注意的是,在创建外围类对象之前,不可能创建内部类的对象(嵌套类除外:内部静态类)。

 

4、内部类向接口和父类转换

 

interface TestIn{
	public void printStr();
}

class TestInn {
	public void printCls() {
		System.out.println("TesTInn");
	}
}

public class OuterTest {
	
	private class InnerTest extends TestInn implements TestIn{
		public void printStr() {
			System.out.println("InnerTest的方法打印");
		}
		
		public void printCls() {
			System.out.println("InnerTest");
		}
	}
	
	public TestIn getInner(){
		return new InnerTest();
	}
	
	public static void main(String[] args) {
		OuterTest ot = new OuterTest();
		// 通过外围类.new生成
		OuterTest.InnerTest it = ot.new InnerTest();
		it.printStr();
		it.printCls();
		// 通过返回接口得到内部类
		TestIn it2 = ot.getInner();
		it2.printStr();
		((TestInn)it2).printCls();
	}
}

 

 

 

内部类是private的,除了外围类以外,没人能访问。private内部类给类的设计者提供了一种途径,通过这种方式可以完全阻止任何依赖于类型的编码,并完全隐藏实现的细节。

 

 

Anonymous Inner Class 匿名内部类

匿名的内部类是没有名字的内部类。匿名的内部类不能显示地extends(继承)其它类,也不能显示地implements Interface(实现接口)实现。但是能够间接的实现extends(继承)其它类implements Interface(实现接口)。

interface TestIn{
	public void printStr();
}

class TestInn {
	public void printCls() {
		System.out.println("TesTInn");
	}
}

public class OuterTest {
	
	public TestIn OuterPrint() {
		return new TestIn(){
			public void printStr() {
				System.out.println("Inner");
			}
		};
	}
	
	public TestInn OuterPrint2() {
		return new TestInn(){
			public void printCls() {
				System.out.println("TesTInn  inner");
			}
		};
	}
	
	public static void main(String[] args) {
		OuterTest ot = new OuterTest();
		ot.OuterPrint().printStr();
		ot.OuterPrint2().printCls();
	}
}

 

 

 

 

 

匿名的内部类传参如果不是final的,编译器就会提示出错,还可以在匿名内部类里定义属性、方法。

 

class TestInn {
	private int num;
	
	public TestInn() {
		
	}
	
	public TestInn(int num) {
		this.num = num;
	}
	
	public void printCls() {
		System.out.println("TesTInn");
	}
}

public class OuterTest {
	
	public TestInn OuterPrint(final int num) {
		return new TestInn(num){
			public void printCls() {
				System.out.println("OuterPrint :" + num);
			}
			
		};
	}
	
	public static void main(String[] args) {
		OuterTest ot = new OuterTest();
		ot.OuterPrint(200).printCls();
	}
}

 

 

 

 

Nested class(嵌套类/静态的内部类)
static的内部类就叫做嵌套类,嵌套类是个例外,使用嵌套类时有两点需要注意: 

1、创建嵌套类对象时,不需要外围类
2、在嵌套类中,不能像普通内部类一样访问外围类的非static成员

class TestInn {
	private static int num;
	
	public TestInn() {
		
	}
	
	public TestInn(int num) {
		this.num = num;
	}
	
	public void printCls() {
		System.out.println("TesTInn");
	}
	
	public static class TestInner{
		public TestInner(int num){
			TestInn.num = num; 
		}
		
		public int getNum(){
			return num;
		}
	};
}

public class OuterTest {
	
	public static void main(String[] args) {
		TestInn.TestInner tr = new TestInn.TestInner(200);
		System.out.println(tr.getNum());
	}
}

  

 

 

分享到:
评论

相关推荐

    Java中inner_class内部类

    1. 对于成员内部类和静态嵌套类,可以通过`new OuterClass().new InnerClass()`或`OuterClass.InnerClass inner = new OuterClass().new InnerClass();`来实例化。 2. 局部内部类和匿名内部类只能在定义它们的方法...

    java-内部类(InnerClass)详解.pdf

    可以通过"OuterClass.InnerClass"的方式引用静态成员类,如`new Outer.Inner1()`。 6. **使用场景** - 当需要创建一个与外部类紧密相关的辅助类,并且希望这个类在没有外部类实例的情况下也能存在时,可以使用...

    第11章 内部类(Inner class).ppt

    内部类(Inner Class)是Java语言中一个独特的特性,它允许在一个类的内部定义另一个类。这种设计模式在处理特定问题时提供了更大的灵活性,比如实现事件监听器、封装复杂逻辑或者创建私有的辅助类。本章我们将深入...

    java易混淆概念Anonymous Inner Class

    Anonymous Inner Class (匿名内部类) 是否可以 extends(继承)其它类?匿名内部类是没有名字的内部类。不能 extends(继承)其它类,但一个内部类可以作为一个接口,由另一个内部类实现。 final 修饰符(关键字)...

    Java内部类(innerclass).docx

    ### Java内部类详解 #### 一、嵌套类概述 在Java编程中,嵌套类是一种重要的面向对象设计工具,它允许程序员在一个类的内部定义另一个类。这种特性极大地增强了Java语言的灵活性和封装能力。 #### 二、嵌套类分类...

    java_innerclass_instance.rar_innerclass

    在“java_innerclass_instance.rar_innerclass”这个压缩包中,包含的资源可能是一个关于Java内部类实例应用的示例代码。 内部类主要有四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。这里我们主要...

    Class详解内部类等

    内部类分为四种类型:成员内部类、静态嵌套类、方法内部类和匿名内部类。 1. 成员内部类: 成员内部类就像外部类的成员变量一样,可以访问外部类的所有成员。但是,成员内部类不能包含静态成员,因为它们依赖于...

    java-嵌套类(inner class)-来自oracle官网

    嵌套类主要分为两大类:静态嵌套类(Static Nested Class)和非静态嵌套类(Non-static Nested Class),后者通常被称为内部类(Inner Class)。 - **静态嵌套类**:此类嵌套类被声明为`static`,因此它们与外部类...

    深入浅析Java中Static Class及静态内部类和非静态内部类的不同

    Java中的静态内部类(Static Class),也称为嵌套静态类,是Java语言提供的一种独特机制,它允许我们在一个外部类内部定义一个静态的类。这种类的声明前面带有`static`关键字,与普通的内部类(非静态内部类)有所...

    Java面向对象(高级)- 类的成员之五:内部类(InnerClass)

    Java面向对象(高级)-- 类的成员之五:内部类(InnerClass)

    java内部类详解

    创建静态内部类的实例时,无需先创建外部类的实例,而是通过外部类名直接创建,如 `OuterClass.InnerClass inner = new OuterClass.InnerClass();`。 2. 成员内部类(Member Inner Class) 成员内部类不带 `static...

    Java面试题,他会给你很好的Java面试准备,第一,谈谈final, finally, finalize的区别,第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

    另外,在Java面试中,Anonymous Inner Class(匿名内部类)也是一个重要的知识点。匿名内部类是没有名字的内部类。不能extends(继承)其它类,但一个内部类可以作为一个接口,由另一个内部类实现。 在Java中,还有...

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

    本篇文章将深入探讨Java中的四种内部类:实例内部类、局部内部类、匿名类和静态内部类,并通过实例代码进行详细解析。 1. **实例内部类**:这是最常见的内部类形式,它在外部类的实例方法或成员位置定义。实例内部...

    内部类的分类及各自用法

    根据不同的应用场景和特性,内部类可以分为多种类型:成员内部类、局部内部类、静态内部类、匿名内部类。下面将详细介绍每种类型的内部类及其特点和使用方法。 #### 成员内部类 成员内部类(也称为非静态内部类)...

    第十章 内部类

    在这个例子中,`InnerClass`是`OuterClass`的一个成员内部类,它可以访问并修改`outerVar`。在`main`方法中,我们创建了`OuterClass`的实例,并通过这个实例来创建和使用`InnerClass`。 内部类还可以用来实现策略...

    java内部类使用例子

    这种内部类可以是成员内部类、局部内部类、匿名内部类或静态内部类,每种都有其特定的用途和使用场景。在这个"java内部类使用例子"中,我们将深入探讨这些类型,并通过实际代码来理解它们的工作原理。 首先,成员...

    java 成员内部类的使用规范

    - 静态内部类声明时需用static修饰,可以直接通过外部类名进行实例化,如`OuterClass.InnerClass inner = new OuterClass.InnerClass();` 3. **匿名内部类**:在不定义具体类名的情况下,直接在使用处创建的内部类...

    Java语法总结 - 内部类

    内部类可以分为四种:成员内部类、静态嵌套类、方法内部类和匿名内部类。 成员内部类 成员内部类是定义在外部类的成员变量中的一种内部类。它可以访问外部类的所有成员变量和方法,包括私有的变量和方法。成员内部...

    11.内部类.doc

    在示例3中,`LocalInnerClassTest`类的`main()`方法内定义了一个局部内部类`InnerClass`,并使用`final`变量`a`,然后在方法内部创建并调用了`InnerClass`的方法。 4. 匿名内部类(Anonymous Inner Class) 匿名...

Global site tag (gtag.js) - Google Analytics