注意:内部类和外部类共享一个 java源文件,但是经过编译之后,会形成各自单独的字节码文件
==================================================================
在外部类中,内部类定义位置与外部类成员所处的位置相同,因此称为成员内部类
成员内部类有:普通内部类和静态内部类
普通内部类
未被 static 修饰的成员内部类
//外部类
public class OutClass {
public void method(){
}
//普通内部类
class InnerClass1{
}
}
如何使用普通内部类??
先看普通类的使用:
package Date20210917;
public class Test1 {
int a;
public void method1(){
}
//普通内部类
class InnerClass{
int b;
void method2() {
}
}
public static void main(String[] args) {
Test1 test1 = new Test1();
test1.method1();
}
普通类:先构造对象—通过对象访问类内部的成员
那么,我们可以试着 new 一个 InnerClass 的对象:
我们发现并不可行,因为 InnerClass 也是 外部类的成员,所以我们在使用内部类时,需借助外部类的对象来创建内部类的对象
则正确操作:
public static void main(String[] args) {
//普通类:先构造对象—通过对象访问类 内部的成员
Test1 test1 = new Test1();
test1.method1();
//普通内部类
InnerClass innerClass = test1.new InnerClass();
innerClass.method2();
}
不同文件下 普通内部类的使用:
package Date20210917;
//外部类
public class OutClass {
//测试Test1 中的内部类的使用:
void test(){
Test1 test1 = new Test1();
//要实例化 Test1 中内部类的对象
//InnerClass; 编译器不能识别,因为该类没在此文件中
Test1.InnerClass t = test1.new InnerClass();
}
public static void main(String[] args) {
}
}
当内外部类出现同名变量时,使用就近原则~ 即:优先访问内部类的
public class Test1 {
int a;
int b;
public void method1(){
}
//普通内部类
class InnerClass{
int b;
void method2() {
a = 10;
method1();
b = 66; //给内部类自己的 成员变量 b 赋值
}
}
}
内部类中给同名外部类成员变量赋值:
Test1.this.b = 88;
调试验证:
即:编译后,对 method2 进行以下修改
修改前:
void method2() {
a = 10;
method1();
b = 66; //给内部类自己的 成员变量 b 赋值
Test1.this.b = 88;
}
修改后:
void method2(InnerClass this){
this$0.a = 10;
method1(this$0);
this.b = 66;
Test1.this.b = 88;
}
总结:
-
普通内部类对象必须在先有外部类对象前提下才能创建
-
外部类中,不能直接访问内部类中的成员,如果要访问必须先要创建内部类的对象
-
外部类中的任何成员都可以被在普通内部类方法中直接访问
-
在内部类方法中访问同名的成员时,优先访问自己的(就近原则),如果要访问外部类同名的成员,必须:外部类名称.this.同名成员 来访问
静态内部类
被 static 修饰的内部成员类称为静态内部类
public class Test2 {
int a;
int b;
static int c;
static void method1(){
System.out.println(“我是method()”);
}
static class InnerClass{
int d;
static int e;
void method2(){
}
}
}
静态内部类对象的创建
1.同文件中创建:
//静态成员变量的访问
System.out.println(Test2.c);
//不需要借助外部类对象来创建
InnerClass innerClass = new InnerClass();
2.不同文件里 创建:
void test2(){
//静态成员变量的访问:
System.out.println(Test2.c);
//静态内部类对象 (类比静态成员变量的访问)
Test2.InnerClass t = new Test2.InnerClass();
//静态内部类对象可以直接创建,不需要依赖外部类对象
}
总结
总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。
如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。
了解详情https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB
c);
//静态内部类对象 (类比静态成员变量的访问)
Test2.InnerClass t = new Test2.InnerClass();
//静态内部类对象可以直接创建,不需要依赖外部类对象
}
总结
总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。
如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。
[外链图片转存中…(img-6vHkR8df-1724323414328)]
了解详情https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB