背景
ChatGPT与你分享Java内部类和组合的区别,这将有助于你更好地理解如何在Java编程中使用它们。如果你对这个话题感兴趣,那么请继续阅读,我将向你展示内部类和组合的不同之处。
先看看以下问题ChatGPT是如何回答的,
Java使用内部类的主要原因有以下几个:
Java中的内部类可以访问其外部类的所有成员,包括私有成员和方法,这是因为内部类与其外部类之间具有特殊的关系。
具体来说,当一个内部类被实例化时,它会自动持有一个对其外部类对象的引用,即内部类对象会包含一个指向外部类对象的引用。因此,在内部类的方法中,可以使用这个引用来访问外部类的所有成员变量和方法。
这种特殊的关系称为内部类的“包含关系”,也就是内部类包含在其外部类的内部。因此,内部类可以像外部类一样访问外部类的成员变量和方法,但外部类不能访问内部类的成员变量和方法。
需要注意的是,内部类只能在其外部类中被创建和使用,而不能在其外部类之外的地方创建实例。因此,内部类的访问权限不会影响外部类对其成员的访问权限。
Java中的内部类和组合都是用于实现类之间的关联和协作的机制,但它们有以下几点区别:
首先分为四类,成员内部类、静态内部类、局部内部类、匿名内部类,代码说事如下,
class Outer {
private static String outerStrA = "A";
private static void outerFuncA() {
System.out.println(InnerB.innerBStrA);
}
private void outerFuncB() {
InnerB innerB = new InnerB();
System.out.println(innerB.innerBStringB);
System.out.println(InnerB.innerBStrA);
}
// 1、成员内部类
class InnerA {
// private static String strA = "A";
}
// 2、静态内部类
static class InnerB {
private static String innerBStrA = "A";
private String innerBStringB = "B";
private void funcA() {
outerFuncA();
System.out.println(innerBStrA);
new Outer().outerFuncB();
}
}
// 局部方法,静态或者成员都可以
public void localA() {
// 3、局部内部类
class InnerC {
private int num = 0;
}
// 4、匿名内部类
TestOuter testOuter = new TestOuter() {
private int num = 0;
};
}
}
class TestOuter {
public static void main(String[] args) {
new Outer().new InnerA();
new Outer.InnerB();
}
}
注意,内部类可用protected和private修饰,外部类只能使用public和缺省的包访问权限,注意同一文件可以定义多个外部类。
成员内部类不能有静态变量,优点是能够自由的使用外部类的所有变量和方法。
静态内部类只能直接访问外部类的静态成员,不能访问外部类的非静态成员,因为它在对象实例中初始化。
注意,外部类可以通过内部类对象访问其成员,并且能够直接访问到内部类的私有属性无需提供getter;
这是由于内部类的private属性javac在编译时,会生成了一个static的acess的方法,外部类可以隐式的调用000方法访问到private属性。
讲到这,内部类看起来有点和组合(当前类声明外部类)类似,但其实两者还是有很大的区别。
虽然对于外部类而言都是has a关系,举一个实际的例子,组合相当于你在你手机上安装了一款游戏,而内部类则是你在自己开发了一款游戏安装在了你手机上,你清楚它的来龙去脉。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。