本篇主要介绍Java中的类与对象中 的内部类
👩🏻🏫作者: 初入编程的菜鸟哒哒
📚系列文章目录:一、TvT——JavaSE(1)–Java的数据类型与变量
二、TvT——JavaSE(2)–Java的运算符
三、TvT——JavaSE(3)–Java的逻辑控制
四、TvT——JavaSE(4)–Java方法的使用
五、你真的学会了JavaSE中数组的定义与使用吗?
六、Java中的类与对象来袭
七、类与对象有关static成员的知识你真的了解吗?
八、有关代码块的知识你真的了解吗?
📜刷题笔记:
📖TvT——C语言进阶の刷题【1】:指针进阶
📖面试高频题の环形链表 环形链表Ⅱ 全解析
文章目录
- 前言
- 内部类
- 🔊1.实例内部类:
- 🎼1.1 实例内部类当中不可以定义静态的成员变量。
- 🎼1.2 实例内部类当中不可以定义静态的成员方法
- 🎼1.3 如何实例化 实例内部类:
- 🎼1.4 实例内部类成员变量与外部类成员变量重名问题
- 🔊2.静态内部类
- 🎼2.1 如何定义一个静态内部类
- 🎼2.1 如何拿到静态内部类的对象
- 🎼2.2 静态内部类如何访问外部类的成员
- 🔊3. 局部内部类
- 🔊4. 匿名内部类
- 总结
大家记得联系上一篇博客一起学习。
Java中的类与对象来袭
内部类
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。在Java中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。
内部类也是封装的一种体现。
class superClass {
class downClass {
}
}
这个代码superClass
就是外部类,downClass
就是superClass
的内部类。
内部类有很多种:
- 实例内部类
- 静态内部类
- 本地内部类(了解)
- 匿名内部类 (这个后面学完接口再介绍)
这个downClass
就是实例内部类:
class superClass {
class downClass {
}
}
🎼1.1 实例内部类当中不可以定义静态的成员变量。
如定义,那么这个静态的成员应该是被final
修饰的。❓ 那为什么不能定义?
因为内部类的调用是依赖于外部类对象才能调用,而静态的不依赖于对象。
下面的不可以定义静态成员方法也是一个道理。
public class Tset2 {
superClass aClass = new superClass() ;
superClass.downClass Class = aClass.new downClass();
}
外部类类名.内部类 变量名 = 外部类引用.new内部类(); |
或者:
superClass.downClass Class = new superClass().new downClass();
那我可不可以在内部类中访问外部类的成员变量呢?
是可以的。
class superClass {
public int age1 = 1;
private int age2 = 2;
public static int age3 = 3;
/**
实例内部类
*/
class downClass {
public int age1 = 111;
public int age4 = 4;
private int age5 = 5;
public final static int AGE6 = 6;
public downClass(){
System.out.println("实例内部类的构造方法");
}
public void func1(){
System.out.println("实例内部类的普通方法");
System.out.println(age1);
System.out.println(age2);
System.out.println(age3);
System.out.println(age4);
System.out.println(age5);
}
}
}
public class Tset2 {
public static void main(String[] args) {
superClass.downClass Class = new superClass().new downClass();
Class.func1();
}
}
此时内部类的age1就与外部类的age1重名了,那func1()
里面打印出来的age1
是什么呢?
答案是内部类的age1
。
那这种情况怎么在内部类里面调用外部类的age1
呢?
很简单,只需要superClass.this.age1
这样写就ok。
一个类生成一个字节码文件。
内部类字节码文件的命名格式为:外部类$内部类
实例内部类的注意事项:
- 外部类中的任何成员都可以被在实例内部类方法中直接访问
- 实例内部类所处的位置与外部类成员位置相同,因此也受
public
、private
等访问限定符的约束- 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名 称.
this.
同名成员 来访问- 实例内部类对象必须在先有外部类对象前提下才能创建
- 实例内部类的非静态方法中包含了一个指向外部类对象的引用
- 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。
🔊2.静态内部类 🎼2.1 如何定义一个静态内部类
class Home {
/**
* 静态内部类:
*/
static class Room {
}
}
🎼2.1 如何拿到静态内部类的对象
只需要:
Home.Room room = new Home.Room();
class Home {
public int data1 = 1;
private int data2 = 2;
public static int data3 = 3;
/**
* 静态内部类:
* 1、如何拿到静态内部类的对象?
* Home.Room room = new Home.Room();
*/
static class Room {
public int data4 = 4;
private int data5 = 5;
public static int data6 = 6;
public Room() {
System.out.println("静态内部类的构造方法!");
}
}
}
public class TestDemo {
public static void main(String[] args) {
Home.Room room = new Home.Room();
}
}
🎼2.2 静态内部类如何访问外部类的成员
静态内部类不能直接访问外部类的非静态的数据成员,因为静态内部类不依赖于实例对象。
如果一定要访问:
那就创建一个实例对象就可以了
或者:
this.home = home;
给当前引用赋值一个对象。
注意事项:
- 在静态内部类中只能访问外部类中的静态成员
- 创建静态内部类对象时,不需要先创建外部类对象
定义在外部类的方法体或者{}
中,该种内部类只能在其定义的位置使用,一般使用的非常少,此处简单了解下语法格式。
public class OutClass {
int a = 10;
public void method(){
int b = 10;
// 局部内部类:定义在方法体内部
// 不能被public、static等访问限定符修饰
class InnerClass{
public void methodInnerClass(){
System.out.println(a);
System.out.println(b);
}
}
// 只能在该方法体内部使用,其他位置都不能用
InnerClass innerClass = new InnerClass();
innerClass.methodInnerClass();
}
注意事项:
🔊4. 匿名内部类
- 局部内部类只能在所定义的方法体内部使用
- 不能被
public
、static
等修饰符修饰- 编译器也有自己独立的字节码文件,命名格式:
外部类名字$内部类名字.class
- 几乎不会使用
匿名对象:
匿名对象没有名字,并且只能使用一次
匿名内部类:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)