内部类(InnerClass)

一:概念

内部类(Inner Class),是 Java 中对类的一种定义方式,是嵌套类的一个分类,即非静态嵌套类(Non-Static Nested Class)。内部类(非静态嵌套类)分为成员内部类、局部内部类和匿名内部类三种。

内部类主要解决Java不能多重继承的问题。


二:内部类的特性

Inner class 作为类的成员

  1. 可以声明为final的
  2. 和外部类不同,Inner class可声明为private或protected;
  3. lnner class可以声明为static的,但此时就不能再使用外层类的非static的成员变量;

Inner class 作为类

  • 可以声明为abstract类,因此可以被其它的内部类继承

【注意】非static的内部类中的成员不能声明为static的,只有在外部类或static的内部类中才可声明static成员。


三:示例

内部类示例

public class inner_class {
	int i;
	public int z;
	private int k;

//======================================================
	/*
	 * 内部类
	 */
	class InnerClass {

		int i; // 内部类拥有自己的属性,可以与外部类属性重名

		public void setInner_files() {
			// 内部类调用用外部类属性
			inner_class.this.i = 1; // 外部属性 类名.this.属性
			inner_class.this.k = 2;
			inner_class.this.z = 3;
		}

		// 内部方法调用内部属性
		public void SetVariable() {
			this.i = 10;
		}
	}
//=====================================================

	// 外部类调用内部类属性 方法,需要new一个对象

	public void SetInfo() {
		InnerClass ic2 = new InnerClass();
		ic2.setInner_files();// 调用内部类方法
		ic2.i = 10;
	}

	public void ShowInfo()
	// 打印外部类属性
	{
		System.out.println(this.i);
		System.out.println(this.k);
		System.out.println(this.z);
	}

//======================================================
	public static void main(String[] args) {
		inner_class ic = new inner_class();// 实例化对象
		ic.SetInfo();
		ic.ShowInfo();
	}

}

多层继承示例

public class T1_inner_class {

	public static void main(String[] args) {
		A_Class test_Inner = new A_Class();
		// 测试实现的多重继承
		test_Inner.T1();// 调用A类T1方法
		test_Inner.T2();// 调用A类T2方法

	}
}

//=================================
/*
 * A类同时获得B类和C类的方法,并重写
 */

class A_Class {
	/*
	 * A类继承B类和C类实现多重继承
	 */

	// ==========================================
	// 利用内部类继承B类

	private class Inner_B extends B_Class {
		// 内部类重写继承父类B_Class的方法
		@Override
		public void ShowInfo_B() {
			System.out.println("这里是B类重写的方法");

		}
	}

	// 利用内部类继承B类
	private class Inner_C extends C_Class {
		// 内部类重写继承父类C_Class的方法
		@Override
		public void ShowInfo_C() {
			System.out.println("这里是C类重写的方法");
		}
	}

	// ==========================================
	public void T1() {
		new Inner_B().ShowInfo_B(); // 调用B类重写的方法
	}

	public void T2() {
		new Inner_C().ShowInfo_C();// 调用C类重写的方法
	}

}

//=================================

class B_Class {
	public void ShowInfo_B() {
	}
}

//=================================
class C_Class {
	public void ShowInfo_C() {

	}
}
posted @   Gonfei  阅读(339)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示