Java——内部类1详解

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

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

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

什么是内部类?

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

例如:post

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

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

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

第一个问题是否是很简单? 那咱们来看第二个问题。spa

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

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

下面咱们经过具体例子来理解上面内容code

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  内部类不能访问外部类的成员
	}
}
复制代码

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

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

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

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();
	}
}
复制代码
相关文章
相关标签/搜索