Java---内部类的定义与用法

注意事项:

1. 定义在class类名花括号外的,即使是在一个文件里,都不能称为内部类,例:

public class OutClass {

}

class InnerClass { //不是内部类,它在花括号外

}

2. 内部类和外部类共用一个java源文件,但是经过编译之后,内部类会单独形成字节码文件

先看一下内部类都可以在一个类的哪些位置可以定义:

public class OutClass {

public class InnerClass1{ //未被static修饰,普通内部类

}

static class InnerClass2{ //被static修饰,静态内部类

}

public void method(){

class InnerClass3{ //在方法中定义,局部内部类

}

}

{

class InnerClass4{ //实例代码块中,局部内部类

}

}

static {

class InnerClass5{ //静态代码块中,局部内部类

}

}

}

二. 成员内部类


内部类定义的位置与外部类成员所处的位置相同,称为成员内部类

2.1 普通内部类

未被static修饰的内部类称为普通内部类

想了解普通内部类的用法,看完下面的代码和注释,所有问题就迎刃而解了

public class OutClass {

private int a;

static int b;

int c;

public void method1() {

a = 1;

System.out.println(a);

}

public static void method2(){

b = 2;

System.out.println(b);

}

public class InnerClass1 {

int c;

public void innerMethod(){

a = 10;

b = 20;

method1(); //内部类中可以直接访问外部类任何访问限定符修饰的成员

method2();

c = 30; //访问的是内部类自己的成员c

innerMethod();

OutClass.this.c = 300; //通过访问 外部类.this.同名成员名字 来访问外部类中与内部类同名的成员

System.out.println(OutClass.this.c);

}

}

public static void main(String[] args) {

//普通内部类的成员创建以及访问

OutClass oc = new OutClass();

System.out.println(oc.a);

System.out.println(oc.b);

System.out.println(oc.c);

oc.method1();

oc.method2();

//要访问普通内部类中的成员,必须先构造普通内部类对象

//构造普通内部类对象方法:

OutClass.InnerClass1 ic = new OutClass().new InnerClass1();

//也就是说想构造内部类对象必须借助外部类

System.out.println(ic.c);

ic.innerMethod();

}

}

注意事项:

1. 外部类的任何成员都可以被在普通内部类方法中直接访问

2. 普通内部类所处的成员与外部类成员位置相同,因此受public private 等访问限定符约束

3. 在内部类方法中访问同名的成员时,优先访问自己的,如果访问外部类同名的成员必须以:外部类名称.this.成员变量 来访问

4. 普通内部类对象必须在先有外部类前体下才能创建

5. 普通内部类的非静态方法中包含了一个指向外部类对象的引用

6. 外部类中,不能直接访问内部类中的成员,如果要访问必须先创建外部类对象

2.2 静态内部类

被static修饰的内部成员类称为静态内部类

想了解静态内部类的用法,看下面的代码和注释

public class OutClass {

private int a;

static int b;

int c;

public void method1(){

a = 1;

System.out.println(a);

}

public static void method2(){

b = 2;

System.out.println(b);

}

static class InnerClass{

public void methodInner(){

// a = 10; 编译器会报错,因为静态内部类中只能访问外部类的静态成员

b = 20; //这一编译器不会报错,因为b是静态成员

// method1(); 编译器报错,因为method1不是静态成员方法

method2(); //这里编译器正常通过

}

}

public static void main(String[] args) {

//静态内部类对象创建及成员访问

OutClass.InnerClass ic = new OutClass.InnerClass();

ic.methodInner();

}

}

注意事项:

1.在内部类中只能访问外部类中静态成员

2.在创建内部类对象时不需要创建外部类成员

3.成员内部类经过编译之后会产生独立的字节码文件,命名格式为:外部类名称$内部类名称

三. 局部内部类


定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用,一般用的较少。

看以下代码:

public class OutClass {

int a = 10;

public void method(){

int b = 20;

class InnerClass{ //不能被public static等访问修饰符修饰

public void methodInner(){

System.out.println(a);

System.out.println(b);

}

}

InnerClass ic = new InnerClass(); //只能在该方法体内部使用,其他位置都不能用

ic.methodInner();

}

public static void main(String[] args) {

//

必看视频!获取2024年最新Java开发全套学习资料 备注Java

InnerClass ic = new InnerClass(); 在这里变异错误

}

}

注意事项:

1.局部内部类只能在定义本方法体中内部使用

2.不能被public,static修饰

3.编译器也有自己独立的字节码文件,命名格式:外部类名字$x内部类名字.class,x是一个整数

四.匿名类


总结

互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

**另外本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理 **

下面有部分截图希望能对大家有所帮助。

在这里插入图片描述

3.编译器也有自己独立的字节码文件,命名格式:外部类名字$x内部类名字.class,x是一个整数

四.匿名类


总结

互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

**另外本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理 **

下面有部分截图希望能对大家有所帮助。

[外链图片转存中…(img-cPy1q63a-1716449184165)]

  • 15
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值