这是我参与更文挑战的第6天,活动详情查看: 更文挑战
什么是内部类?内部类和外部类有什么区别和联系?
让我们带着这两个问题来学习本期内容,首先是第一个问题。
什么是内部类?
把一个类定义在另一个类中,这样的类叫做内部类,也叫作嵌套类。而包含内部类的类叫做
外部类或宿主类。
例如:
public calss A{
class B{
}
}
复制代码
A就是宿主类,B就是内部类。
内部类又分为静态内部类和非静态内部类。和名字一样,静态内部类就是在class前加上
static关键字,非静态内部类就是不加static关键字。
内部类中还有一种很重要的类叫做匿名类。
所谓匿名类顾名思义就是没有名字的内部类。
下期我会详细说静态内部类和非静态内部类的区别,还有匿名类的创建及使用。
第一个问题是不是很简单? 那我们来看第二个问题。
内部类和外部类有什么区别和联系?
- 内部类仅供它的宿主类使用,其他类不能使用某个类的内部类来声明对象。
- 内部类成员可以访问外部类的私有数据,但外部类不能访问内部类的成员
- 外部类可以使用使用内部类来创建对象作为外部类的成员
- 内部类比外部类多了三个修饰符,分别是private,protected,static
- 非静态内部类不能拥有静态成员
下面我们通过具体例子来理解上面内容
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