一、内部类

将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。

1.成员内部类

定义在类中的方法外的类。

class 外部类 {
class 内部类 {
}
}
特点:
  • 作为成员存在,可以被权限修饰符修饰。
  • 内部类可以直接访问外部类的成员,包括私有成员。
  • 外部类要访问内部类的成员,必须要建立内部类的对象。
主方法内创建内部类对象:
外部类名.内部类名 对象名 = new 外部类型().new 内部类型();
ps:内部类仍然是⼀个独⽴的类,在编译之后会内部类会被编译成独⽴的.class⽂件,但是前⾯

冠以外部类的类名和$符号 。比如:Person$Heart.class
代码说明
//外部类
public class Outer {//外部类成员变量int a = 1;private int b = 2;int e = 10;//相同的外部类的成员变量//外部类成员方法public void outM1(){//当外部类想访问内部类的成员时,需要创建内部类的对象Inner in = new Inner();System.out.println(in.c+","+in.d);//内部类的私有成员变量也能获取in.inM1();//内部类成员方法System.out.println("外部类的成员方法outM1");}//成员内部类public class Inner{//内部类成员变量int c = 3;private int d = 4;int e = 10;//相同的内部类的成员变量//内部类的成员方法public void inM1(){int e = 10;//相同的外部类的局部变量//在内部类里可以直接访问到外部类的成员,包括私有成员System.out.println(a+","+b);//private int b = 2;outM1();//直接调用外部类成员方法//若出先变量名相同的情况该如何获取到想要的变量//1.获取相同的内部类的局部变量System.out.println(e);//2.获取相同的内部类的成员变量System.out.println(this.e);//3.获取相同的外部类的成员变量System.out.println(Outer.this.e);System.out.println("内部类的成员方法inM1");}}
}
//无关类
public class Main {public static void main(String[] args) {//当无关类想获取内部类的成员//1.间接调用:在外部类成员方法里创建了内部类的对象,再在无关类创建外部类的对象,通过调用外部类成员方法,间接调用内部类Outer ou = new Outer();ou.outM1();//2.直接调用Outer.Inner inOu = new Outer().new Inner();inOu.inM1();//但如果想直接访问外部或者内部私有成员,还是需要创建get,set}
}

2.静态内部类

定义在类中的方法外的,被static关键词修饰的类。

class 外部类 {
static class 内部类 {
}
}
特点:
  • 作为静态成员属性存在,可以被任意权限修饰符修饰。
  • 可以直接访问外部类static相关的属性和方法。
  • 访问外部类普通属性和方法,则需要通过new外部类去访问。

代码说明

//静态内部类public class Outer {//外部类//成员变量int a;//静态成员变量static int b;//成员方法public void m1(){System.out.println("成员方法m1");}//静态成员方法public static void  m2(){System.out.println("静态成员方法m2");}//静态内部类public static class inner1{int ina;static int inb;public void innerM1(){System.out.println(b);//可以直接访问外部类静态成员m2();// m1();//不可以直接访问外部类不是静态的成员//访问其他属性跟方法 需要实例化外部类Outer ou = new Outer();ou.a = 5;ou.m1();}}}
public class Main {public static void main(String[] args) {//调用普通成员Outer ou1 = new Outer();ou1.m1();//调用静态的成员Outer.b = 23;Outer.m2();//访问内部类成员Outer.inner1 oi = new Outer.inner1();oi.innerM1();oi.ina = 5;//调用内部类静态成员Outer.inner1.inb = 6;}
}

3.局部内部类

定义在类中方法中的类。

class 外部类 {
public void m1(){
class 内部类 {
}
}
}
特点:
  • 存在方法之中,只能在方法中使用,类前不能有访问权限。
  • 局部内部类只在当前方法中有效。
  • 不能定义static成员,因为在方法结束后,内存需要释放。
  • 局部内部类中可以访问外部类的所有成员。
  • 可以直接访问方法的局部变量,但无法修改,编译会出错。

代码说明

//局部内部类
public class Outer {//成员变量int a;//成员方法public void m1(){//局部变量int b=5;//局部内部类:存在于外部类的成员方法中//注意局部内部类的修饰词不能用访问修饰符 :4个class Inner{//局部内部类的成员变量int ina;//局部内部类的成员方法public void m2(){int inb =3;System.out.println("局部内部类的成员方法m2");//如果想在局部内部类中获取外部类成员方法的局部变量System.out.println(b);//b = 10;-->不能被修改因为此时的外部类方法中的局部变量默认被final修饰//局部内部类方法中的局部变量System.out.println(inb);//3inb = 8;System.out.println("inb"+inb);//8能被修改}};//想要使其他类获取局部内部类的成员//需要在外部类中,方法中,局部内部类外,创建局部内部类的对象Inner in = new Inner();//然后就能在方法里调用局部内部类的成员了System.out.println(in.ina);//局部内部类的成员变量in.m2();//局部内部类的成员方法System.out.println("外部类的成员方法m1");}}
//无关类
public class Main {public static void main(String[] args) {Outer ou = new Outer();ou.m1();}
}

4.匿名内部类

跟局部内部类相似,但本质是一个为了继承抽象类,或者实现接口。

new ⽗类名或者接⼝名() {
// ⽅法重写
@Override
public void method() {
// 执⾏语句
}
};
特点:
  • 没有类名的内部类,必须在创建时使用new语句来声明类。
  • 匿名类和局部内部类一样,存在方法中,可以访问外部类的所有成员。
  • 重写父类/接口中的抽象方法。
  • 匿名类中允许使用非静态代码块进行成员初始化操作。
  • 匿名类的非静态代码块会在父类的构造方法之后被执行。

代码说明(接口举例)


public interface InterfaceA {//接口的抽象方法public abstract  void a1();public abstract  void a2();}
//匿名内部类
public class Outer {int num;public void m1(){//1.局部内部类里创建一个接口的实现类class InterfaceImpl implements InterfaceA{@Overridepublic void a1() {System.out.println("m1,a1");}@Overridepublic void a2() {System.out.println("m1,a2");}}//创建一个实现接口A类的对象InterfaceImpl in = new InterfaceImpl();in.a1();//这样就可以调用实现类接口A里重写的抽象方法in.a2();}//2.匿名内部类——>优化局部内部类public void m2(){//InterfaceImpl in = new InterfaceImpl();//多态  InterfaceA in = new InterfaceImpl();//下面这样的写法优化了局部内部类,称之为匿名内部类,因为class名不见了//接口是不能new对象的,但 InterfaceA in = new InterfaceA() {}; 不是new对象,new对象没有{};//它是对实现这个接口的实现类new的对象//可以理解成是个引用的实现类的方法InterfaceA in = new InterfaceA() {@Overridepublic void a1() {System.out.println("m2,a1");}@Overridepublic void a2() {System.out.println("m2,a2");}};in.a1();//直接调用in.a1();}//3.匿名对象public void m3(){//new InterfaceA(){//直接new接口A的实现类@Overridepublic void a1() {System.out.println("m3,a1");}@Overridepublic void a2() {System.out.println("m3,a2");}}.a1();//通过在分号前.方法名调用接口A的抽象方法,但每次只能调用一个方法,// 若想调用其他方法还需创建一个成员方法重写后调用,如 m4}public void m4(){new InterfaceA(){@Overridepublic void a1() {System.out.println("m4,a1");}@Overridepublic void a2() {System.out.println("m4,a2");}}.a2();}}public class Main {public static void main(String[] args) {Outer ou = new Outer();ou.num = 5;ou.m1();//m1,a1//m1,a2ou.m2();//m2,a1//m2,a1ou.m3();//m3,a1ou.m4();//m4,a2}
}

JAVA day09 内部类(成员内部类,静态内部类,局部内部类,匿名内部类)相关推荐

  1. java中局部内部类_Java内部类详解--成员内部类,局部内部类,匿名内部类,静态内部类...

    一.内部类基础 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.广泛意义上的内部类一般来说包括这四种:成员内部类.局部内部类.匿名内部类和静态内部类.下面就先来了解一 ...

  2. Java内部类详解(含:成员内部类、局部内部类、匿名内部类、静态内部类)

    内部类是什么? 字面意思,在类的内部编写的类就叫内部类!即一个类的内部又完整的嵌套了另一个类结构,被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class). ...

  3. java中final关键字、权限修饰符、内部类(成员内部类、局部内部类、匿名内部类)

    final关键字: final表示最终的不可变的,在java中可以用来修饰类或方法.局部变量.成员变量. // 1.final关键字修饰类需要放在class关键字前面,表示不可变的类,需要注意,这里表 ...

  4. java内部类之成员内部类、局部内部类和匿名内部类

    内部类概念 一个类中包含另外一个类. 分类 成员内部类. 局部内部类(包含匿名内部类). 成员内部类 定义格式: 修饰符 class 类名称 {修饰符 class 类名称 {//...}//... } ...

  5. 三种内部类的使用(成员内部类、局部内部类、匿名内部类)

    三种内部类的使用 内部类是什么? 成员内部类 什么是成员内部类? 如何调用内部类中的public方法? 如何调用内部类中的private方法? 局部内部类 什么是局部内部类? 怎么使用局部内部类? 匿 ...

  6. 内部类详解————局部内部类

    内部类三连击: <内部类详解----匿名内部类> <内部类详解----局部内部类> <内部类详解----静态嵌套类> 定义 在方法或某个作用域内的内部类,称为局部内 ...

  7. 内部类(成员内部类、局部内部类、匿名内部类、静态内部类)

    外部类:单独定义的一个类,不在其他类的内部,只能用 public 和 缺省 权限修饰符 内部类:在类的内部再定义一个类,根据内部类的定义位置和修饰符的不同,可以分为: 1. 成员内部类: 语法格式: ...

  8. java局部内部类 final_Java的局部内部类以及final类型的参数和变量

    Thinking In Java里面的说法(***正确的说法): 如果定义一个匿名内部类,并且希望它使用一个在其外部定的对象,那么编译器会要求其参数引用是final 的.publicclassTest ...

  9. JAVA入门级教学之(局部内部类)

    package com.lbj.javase21; /**  *     局部内部类等同于局部变量  *   *     重点:局部内部类在访问局部变量的时候,局部变量必须使用final修饰,据说在J ...

  10. JAVA基础——内部类(成员内部类、静态内部类、局部内部类、匿名内部类)

    成员内部类 静态内部类 局部内部类 匿名内部类 1.成员内部类(实例内部类.非静态内部类) 成员内部类中不能写静态属性和方法 实例化内部类,首先需要实例化外部类,通过外部类去调用内部类   作用 要想 ...

最新文章

  1. 这些神经网络,还可信吗?
  2. == Equals ReferenceEquals 的区别
  3. 夏意秋尽-08年1月
  4. 【转】SharePoint 2010 Search Service -- 管理中心配置
  5. matlab multithreading spyder,spyder和python的关系是什么
  6. Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数
  7. Real Vision CEO预测以太坊币价将在今年年初达到2万美元
  8. Rancher体系下容器日志采集
  9. 基于邻接表建图的几种方法
  10. Android9.0 PM机制系列(一)PackageInstaller初始化解析
  11. 通过phpstudy(小皮面板)搭建DVWA靶场教程
  12. android 热修复阿里,Android热修复(阿里热修复)
  13. html设置超链接位置,怎么调超链接的位置html
  14. 升级IOS百度人脸SDK4.0采坑记录
  15. Excel中提取单元格中的部分内容或单元格中的数字公式大全(提取数字,提取前几位,提取指定文字之间的内容等等)
  16. vagrant 修改配置文件后,window 系统报错 0x80004005
  17. springboot整合mail邮箱
  18. 解决MAC 安装绿联网卡驱动无效问题
  19. CentOS 7 从下载到安装
  20. 邮箱开启授权码(配置邮件客户端)

热门文章

  1. 中国连续纤维毡行业市场供需与战略研究报告
  2. window和linux下Redis 安装和使用
  3. C++之父Bjarne Stroustrup:程序员在数学上付出的努力,永远也不会白费
  4. Kaggle 年度报告出炉:数据科学家年轻高学历,薪资近百万
  5. 长文剖析经典论文,揭晓 Facebook 广告排序模型!
  6. SolarWinds与安稳特加强合作关系,携手助力中国IT专业人士应对挑战
  7. 如何快速在 Springboot 中集成拦截器? | 原力计划
  8. 华为百度美团驰援抗击疫情;自由软件基金会建议开源 Windows 7;印度超越美国成第二大智能手机市场 | 极客头条...
  9. 车票?工作?对象?Python 教你优雅解决年关三大难题!
  10. 微软斥资 260 亿美元收购了 LinkedIn 后却无所作为?