个人主页:兜里有颗棉花糖
欢迎 点赞 收藏✨ 留言✉ 加关注本文由 兜里有颗棉花糖 原创
收录于专栏【JavaSE_primary】
本专栏旨在分享学习Java的一点学习心得,欢迎大家在评论区讨论
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么这个内部的完整结构最好使用内部类。
另外,在 Java 中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。内部类也是封装的一种体现。
在Java中,内部类分为4种,分别是:实例内部类、静态内部类、局部内部类、匿名内部类。
下面是一个简单的内部类:
//外部类
public class OutClass {
//内部类
class InnerClass{
}
}
class OuterClass{
public int data1;
int data2;
public static int data3;
public void func(){
System.out.println("OutClass::func()");
}
class InnerClass{
public int data4;
int data5;
// public static int data6; 这种写法是错误的
public void func(){
System.out.println("InnerClass::func()");
}
}
}
实例内部类主要有两种方式,请看:
public class Test {
public static void main(String[] args) {
// 实例内部类方式一
OuterClass outerclass = new OuterClass();
OuterClass.InnerClass innerclass1 = outerclass.new InnerClass();
// 实例内部类方式二
OuterClass.InnerClass innerclass2 = new OuterClass().new InnerClass();
}
}
这里有一个问题:在实例内部类中,我们如何访问外部类中相同的成员变量呢?
解决方法:通过外部类的实例名.
来引用外部类的成员变量。例如,在实例内部类的方法中,可以使用OuterClass.this.data
来访问外部类中的成员变量。
代码演示如下:public int data; class InnerClass { public void display() { System.out.println("OuterClass data: " + OuterClass.this.data); } } } ```
注意:实例内部类中是不能直接定义静态成员变量的,但是如果确实需要在实例内部类中使用静态成员变量,可以将其定义为 final 类型的常量,因为常量在编译期间会替换为实际的值,不依赖于外部类对象的存在。
比如:
上述代码中的data6
被声明为final static int
类型,它是一个常量。
在Java中,final关键字用于声明常量,表示该变量的值不能被修改。同时,static关键字表示该变量属于类本身,而不是类的实例。
外部类名称.this.同名成员
来进行访问外部类名称.this
来调用外部类的成员)如果要实例化一个非静态的内部类对象,通常需要先创建外部类的实例,然后使用该实例来创建内部类的对象。这是因为非静态的内部类对象依赖于外部类对象的存在。(实例内部类对象需要外部类对象的引用才可以)
如果我们不使用外部类对象的引用能不能实例内部类对象呢?答案是肯定的。
我们如果不想通过外部类对象来实例内部类对象的话,我们就可以把这个内部类定义成静态内部类。
下面我们通过下面的静态内部类来进行代码的演示,请看:
class OuterClass2{
public int data1 = 10;
int data2 = 20;
static int data3 = 30;
public void func(){
System.out.println("OuterClass2::func()");
}
static class InnerClass2{
public int data4 = 40;
int data5 = 50;
public static int data6 = 60;
public void func(){
System.out.println("InnerClass2::func()");
}
}
}
关于如何获取静态类内部类对象,请看举例:
public class Test2 {
public static void main(String[] args) {
OuterClass2.InnerClass2 innerclass1 = new OuterClass2.InnerClass2();
}
}
解释
:在静态内部类 InnerClass2 的 func() 方法中,不能直接访问外部类 OuterClass2 的非静态成员变量和方法。需要注意的是,静态内部类是与外部类的实例无关的,它只能直接访问外部类的静态成员变量和方法。
通俗一点:我们在实例静态类对象的时候并没有用到外部类对象的引用,所以既然没有外部类对象的话我们是不能直接访问data1和data2的(因为data1和data2的调用时需要外部类的引用的);同时上述代码的内部类是一个静态类,我们在实例化静态类对象的时候也并没有用到外部类对象的引用。(总之一句话就是,既然没有外部类对象的引用,我们就不能直接访问data1和data2)
如果我们要访问data1和data2的话,我们可以这样,请看下面代码:
静态内部类需要注意的是:
局部内部类是定义在方法或作用域内部的内部类,它的作用域被限制在所在的方法或作用域中。局部内部类与实例内部类和静态内部类相比具有更短的声明周期和更窄的作用域。
这里直接简单演示一个局部内部类,请看:
public class Test2 {
public void func(){
class InnerClass {
//局部内部类
}
}
public static void main(String[] args) {
}
}
局部内部类只能在当前方法内进行实例化对象,其它位置都不可以使用。
外部类名字$数字内部类名字.class
哈哈,局部内部类几乎不会使用
在java中,一个类对应一个字节码文件。
直接上代码:
class Person{
String name;
int age;
}
public static void main(String[] args) {
System.out.println(new Person().name);
System.out.println(new Person().age);
new Person(){
//匿名内部类
};
}
匿名对象只能使用一个,每次使用都需要new。
匿名内部类这里先简单带大家了解以下,后续再为大家带来更加详细的讲解。
好了,以上就是Java内部类的全部讲解,就到这里啦,再见友友们!!!