这是我参与更文挑战的第6天,活动详情查看: 更文挑战web
什么是内部类?内部类和外部类有什么区别和联系?markdown
让咱们带着这两个问题来学习本期内容,首先是第一个问题。app
把一个类定义在另外一个类中,这样的类叫作内部类,也叫做嵌套类。而包含内部类的类叫作 外部类或宿主类。svg
例如:post
public calss A{
class B{
}
}
复制代码
A就是宿主类,B就是内部类。 内部类又分为静态内部类和非静态内部类。和名字同样,静态内部类就是在class前加上 static关键字,非静态内部类就是不加static关键字。 内部类中还有一种很重要的类叫作匿名类。 所谓匿名类顾名思义就是没有名字的内部类。学习
下期我会详细说静态内部类和非静态内部类的区别,还有匿名类的建立及使用。url
第一个问题是否是很简单? 那咱们来看第二个问题。spa
下面咱们经过具体例子来理解上面内容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();
}
}
复制代码