第一节 非静态内部类

第一节 非静态内部类

一个类在一个类的内部称为内部类,包含内部类的类称为外部类

非静态内部类的基本语法
class < 外部类类名 >{
    // 外部类其他成员
    
    [ 成员访问限制修饰符号 ] class < 内部类名 > {
        // 内部类成员
    }
    
    // 外部类其他成员
}
在外部类中创建内部类实例
public class CreateInnerClass {
	public static void main(String[] args) {
		Outter outter = new Outter();
		outter.createInnerInstance();
	}
}

class Outter{
	public class Inner{
		public Inner() {
			System.out.println("Inner 实例创建成功!");
		}
	}
	
    // 通过外部类方法创建内部类实例
    // 与创建普通类实例一致
	public void createInnerInstance() {
		Inner i = new Inner();
	}
}

/*
 * 执行结果
 * Inner 实例创建成功
 */
在外部类以外创建内部类实例

< 外部类名 >.< 内部类名 > 引用变量 = < 外部变量对象引用 >.new < 内部类构造器 >;

< 外部类名 >.< 内部类名 > 引用变量 = new < 外部类构造器 >.new < 内部类构造器 >;

public class CreateInnerClass {
	public static void main(String[] args) {
        // 通过外部类实例调用内部类构造方法创建内部类实例
        Outter outter = new Outter();
		Outter.Inner inner0 = outter.new Inner();
		Outter.Inner inner1 = new Outter().new Inner();
	}
}

class Outter{
	public class Inner{
		public Inner() {
			System.out.println("Inner 实例创建成功!");
		}
	}
}

/*
 * 执行结果
 * Inner 实例创建成功
 * Inner 实例创建成功
 */
1. 创建的类型为 `Outter.Inner` 类型
2. 返回的对象为**外部类对内部类的一个引用**
外部类与内部类之间的成员互访

内部类可以访问外部类私有字段

内部类可以访问外部类私有方法

public class TestInnerClass {
	public static void main(String[] args) {
		Outter.Inner o = new Outter().new Inner();
		o.callingOutterMethod();
		System.out.println(o.getOutterFiled());
	}
}

class Outter{
	private int outterFiled = 520;
	
	private void outterMethod() {
		System.out.println("Calling outterMethod() successfully!");
	}
	
	public class Inner{
        // 内部类访问外部类私有字段
		public int getOutterFiled() {
			return outterFiled;
		}
		
        /// 内部类访问外部类私有方法
		public void callingOutterMethod() {
			outterMethod();
		}
	}
}

/*
 * 执行结果
 * Calling outterMethod() successfully!
 * 520
 */

外部类可以访问内部类私有字段

外部类可以访问内部类私有方法

public class TestInnerClass {
	public static void main(String[] args) {
		Outter o = new Outter();
		o.callingInnerMethod();
		System.out.println(o.getInnerFiled());
	}
}

class Outter{
	public class Inner{
		private int innerFiled = 1314;
		
		private void innerMethod() {
			System.out.println("Calling innerMethod() successfully!");
		}
	}
	
    // 访问内部类私有字段
	public void callingInnerMethod() {
		new Inner().innerMethod();
	}
	
    // 访问内部类私有方法
	public int getInnerFiled() {
		return new Inner().innerFiled;
	}
}

/*
 * 执行结果
 * Calling innerMethod() successfully!
 * 1314
 */

预定义对象引用 this

当内部类有字段与外部类重名,可以通过预定义对象引用访问外部类字段

< 外部类名 >.this.< 外部类字段 >

public class TestInnerClass {
	public static void main(String[] args) {
		Outter.Inner o = new Outter().new Inner();
		System.out.println(o.getOutterX());
	}
}

class Outter{
	int x = 520;
	
	public class Inner{
        // 与外部类重名字段x
		int x = 1314;
		
		public int getOutterX() {
            // 预定义对象引用外部类字段x
			return Outter.this.x;
		}
	}
}

/*
 * 执行结果
 * 520
 */
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个静态内部类静态内部类的区别示例: ```java public class OuterClass { private static int staticField = 1; private int nonStaticField = 2; // 静态内部类 public static class StaticInnerClass { public void print() { System.out.println("StaticInnerClass: " + staticField); } } // 静态内部类 public class NonStaticInnerClass { public void print() { System.out.println("NonStaticInnerClass: " + staticField + " " + nonStaticField); } } } ``` 在这个例子中,我们定义了一个外部类`OuterClass`,包含一个静态成员变量`staticField`和一个静态成员变量`nonStaticField`。同时,我们定义了一个静态内部类`StaticInnerClass`和一个静态内部类`NonStaticInnerClass`。 我们来看一下如何使用这两种内部类: ```java public class Main { public static void main(String[] args) { // 静态内部类的使用 OuterClass.StaticInnerClass staticInner = new OuterClass.StaticInnerClass(); staticInner.print(); // 输出:StaticInnerClass: 1 // 静态内部类的使用 OuterClass outer = new OuterClass(); OuterClass.NonStaticInnerClass nonStaticInner = outer.new NonStaticInnerClass(); nonStaticInner.print(); // 输出:NonStaticInnerClass: 1 2 } } ``` 我们可以看到,在使用静态内部类时,我们可以直接使用外部类的类名来创建内部类的实例,并访问外部类的静态成员变量。而在使用静态内部类时,我们必须先实例化外部类对象,再通过外部类对象来创建内部类的实例,并可以访问外部类的所有成员变量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值