Java——内部类1详解

这是我参与更文挑战的第6天,活动详情查看: 更文挑战

什么是内部类?内部类和外部类有什么区别和联系?

让我们带着这两个问题来学习本期内容,首先是第一个问题。

什么是内部类?

把一个类定义在另一个类中,这样的类叫做内部类,也叫作嵌套类。而包含内部类的类叫做
外部类或宿主类。

例如:

public calss A{
     class B{
     }
}
复制代码

A就是宿主类,B就是内部类。
内部类又分为静态内部类和非静态内部类。和名字一样,静态内部类就是在class前加上
static关键字,非静态内部类就是不加static关键字。
内部类中还有一种很重要的类叫做匿名类。
所谓匿名类顾名思义就是没有名字的内部类。

下期我会详细说静态内部类和非静态内部类的区别,还有匿名类的创建及使用。

第一个问题是不是很简单? 那我们来看第二个问题。

内部类和外部类有什么区别和联系?

  1. 内部类仅供它的宿主类使用,其他类不能使用某个类的内部类来声明对象。
  2. 内部类成员可以访问外部类的私有数据,但外部类不能访问内部类的成员
  3. 外部类可以使用使用内部类来创建对象作为外部类的成员
  4. 内部类比外部类多了三个修饰符,分别是private,protected,static
  5. 非静态内部类不能拥有静态成员

下面我们通过具体例子来理解上面内容

public class Test {
	private int no;
	private String name;
	TestA testA = new TestA();//外部类可以使用内部类来创建对象作为自己的成员
	private class TestA{//内部类可以使用private来修饰
		int a=0;
		//static int num=0; //error   非静态内部类不能拥有静态成员
		public void Show(){
			//内部类访问外部类的私有成员
			System.out.println(no+name);
		}
	}
	public void Speak(){
		//System.out.println("内部类中的a是"+a); //error  内部类不能访问外部类的成员
	}
}
复制代码

不难发现,在外部类中使用非静态内部类和普通类的创建没有什么太大的区别。

那么非静态内部类创建的对象和外部类对象有什么关系呢?

非静态内部类创建的对象必须要依赖于外部类对象,简单的说如果存在一个非静态内部类创
建的对象,那么一定有一个外部类创建的对象被它所寄生。

public static void main(String[] args) {
		//new TestA(); //error  不能在外部类的静态成员中直接使用非静态内部类
		//如要要使用应该依赖于外部类来创建对象
		Test A =new Test();
		TestA a=A.new TestA();
		
	}
复制代码

静态内部类又有什么不同呢?

static修饰的成员属于整个类,所以静态内部类是类相关而不是实例相关。
静态内部类中可以包含静态成员,但是静态内部类中不能访问外部类的实例成员,只能访问
外部类的静态成员。
外部类依然不能直接访问内部类的成员,但可以通过静态类的类名来访问静态内部类的成员。

public class Test {
	private int no;
	private String name;
	private static String shape;
	private static class TestA{
		int a=0;
		static int num=0;    //非静态内部类可以拥有静态成员
		public void Show(){
			//System.out.println(no+name);// error 静态内部类不能访问外部类的非静态成员
		}
	}
	public void Speak(){
		//System.out.println("内部类中的a是"+a); //error  内部类不能访问外部类的成员
		System.out.println(TestA.num);//可以通过类名来访问静态内部类的静态成员
	}
	public static void main(String[] args) {
		//TestA a=A.new TestA();//error 静态类不依赖于外部类对象
		//应该这样来创建对象
		Test.TestA a=new Test.TestA();
	}
}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享