简述:
每个类会产生一个.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());
}
}
分享到:
相关推荐
1. 对于成员内部类和静态嵌套类,可以通过`new OuterClass().new InnerClass()`或`OuterClass.InnerClass inner = new OuterClass().new InnerClass();`来实例化。 2. 局部内部类和匿名内部类只能在定义它们的方法...
可以通过"OuterClass.InnerClass"的方式引用静态成员类,如`new Outer.Inner1()`。 6. **使用场景** - 当需要创建一个与外部类紧密相关的辅助类,并且希望这个类在没有外部类实例的情况下也能存在时,可以使用...
内部类(Inner Class)是Java语言中一个独特的特性,它允许在一个类的内部定义另一个类。这种设计模式在处理特定问题时提供了更大的灵活性,比如实现事件监听器、封装复杂逻辑或者创建私有的辅助类。本章我们将深入...
Anonymous Inner Class (匿名内部类) 是否可以 extends(继承)其它类?匿名内部类是没有名字的内部类。不能 extends(继承)其它类,但一个内部类可以作为一个接口,由另一个内部类实现。 final 修饰符(关键字)...
### Java内部类详解 #### 一、嵌套类概述 在Java编程中,嵌套类是一种重要的面向对象设计工具,它允许程序员在一个类的内部定义另一个类。这种特性极大地增强了Java语言的灵活性和封装能力。 #### 二、嵌套类分类...
在“java_innerclass_instance.rar_innerclass”这个压缩包中,包含的资源可能是一个关于Java内部类实例应用的示例代码。 内部类主要有四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。这里我们主要...
内部类分为四种类型:成员内部类、静态嵌套类、方法内部类和匿名内部类。 1. 成员内部类: 成员内部类就像外部类的成员变量一样,可以访问外部类的所有成员。但是,成员内部类不能包含静态成员,因为它们依赖于...
嵌套类主要分为两大类:静态嵌套类(Static Nested Class)和非静态嵌套类(Non-static Nested Class),后者通常被称为内部类(Inner Class)。 - **静态嵌套类**:此类嵌套类被声明为`static`,因此它们与外部类...
Java中的静态内部类(Static Class),也称为嵌套静态类,是Java语言提供的一种独特机制,它允许我们在一个外部类内部定义一个静态的类。这种类的声明前面带有`static`关键字,与普通的内部类(非静态内部类)有所...
Java面向对象(高级)-- 类的成员之五:内部类(InnerClass)
创建静态内部类的实例时,无需先创建外部类的实例,而是通过外部类名直接创建,如 `OuterClass.InnerClass inner = new OuterClass.InnerClass();`。 2. 成员内部类(Member Inner Class) 成员内部类不带 `static...
另外,在Java面试中,Anonymous Inner Class(匿名内部类)也是一个重要的知识点。匿名内部类是没有名字的内部类。不能extends(继承)其它类,但一个内部类可以作为一个接口,由另一个内部类实现。 在Java中,还有...
本篇文章将深入探讨Java中的四种内部类:实例内部类、局部内部类、匿名类和静态内部类,并通过实例代码进行详细解析。 1. **实例内部类**:这是最常见的内部类形式,它在外部类的实例方法或成员位置定义。实例内部...
根据不同的应用场景和特性,内部类可以分为多种类型:成员内部类、局部内部类、静态内部类、匿名内部类。下面将详细介绍每种类型的内部类及其特点和使用方法。 #### 成员内部类 成员内部类(也称为非静态内部类)...
在这个例子中,`InnerClass`是`OuterClass`的一个成员内部类,它可以访问并修改`outerVar`。在`main`方法中,我们创建了`OuterClass`的实例,并通过这个实例来创建和使用`InnerClass`。 内部类还可以用来实现策略...
这种内部类可以是成员内部类、局部内部类、匿名内部类或静态内部类,每种都有其特定的用途和使用场景。在这个"java内部类使用例子"中,我们将深入探讨这些类型,并通过实际代码来理解它们的工作原理。 首先,成员...
- 静态内部类声明时需用static修饰,可以直接通过外部类名进行实例化,如`OuterClass.InnerClass inner = new OuterClass.InnerClass();` 3. **匿名内部类**:在不定义具体类名的情况下,直接在使用处创建的内部类...
内部类可以分为四种:成员内部类、静态嵌套类、方法内部类和匿名内部类。 成员内部类 成员内部类是定义在外部类的成员变量中的一种内部类。它可以访问外部类的所有成员变量和方法,包括私有的变量和方法。成员内部...
在示例3中,`LocalInnerClassTest`类的`main()`方法内定义了一个局部内部类`InnerClass`,并使用`final`变量`a`,然后在方法内部创建并调用了`InnerClass`的方法。 4. 匿名内部类(Anonymous Inner Class) 匿名...