JAVA day09 内部类(成员内部类,静态内部类,局部内部类,匿名内部类)
一、内部类
将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。
1.成员内部类
定义在类中的方法外的类。
- 作为成员存在,可以被权限修饰符修饰。
- 内部类可以直接访问外部类的成员,包括私有成员。
- 外部类要访问内部类的成员,必须要建立内部类的对象。
//外部类
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关键词修饰的类。
- 作为静态成员属性存在,可以被任意权限修饰符修饰。
- 可以直接访问外部类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.局部内部类
定义在类中方法中的类。
- 存在方法之中,只能在方法中使用,类前不能有访问权限。
- 局部内部类只在当前方法中有效。
- 不能定义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语句来声明类。
- 匿名类和局部内部类一样,存在方法中,可以访问外部类的所有成员。
- 重写父类/接口中的抽象方法。
- 匿名类中允许使用非静态代码块进行成员初始化操作。
- 匿名类的非静态代码块会在父类的构造方法之后被执行。
代码说明(接口举例)
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 内部类(成员内部类,静态内部类,局部内部类,匿名内部类)相关推荐
- java中局部内部类_Java内部类详解--成员内部类,局部内部类,匿名内部类,静态内部类...
一.内部类基础 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.广泛意义上的内部类一般来说包括这四种:成员内部类.局部内部类.匿名内部类和静态内部类.下面就先来了解一 ...
- Java内部类详解(含:成员内部类、局部内部类、匿名内部类、静态内部类)
内部类是什么? 字面意思,在类的内部编写的类就叫内部类!即一个类的内部又完整的嵌套了另一个类结构,被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class). ...
- java中final关键字、权限修饰符、内部类(成员内部类、局部内部类、匿名内部类)
final关键字: final表示最终的不可变的,在java中可以用来修饰类或方法.局部变量.成员变量. // 1.final关键字修饰类需要放在class关键字前面,表示不可变的类,需要注意,这里表 ...
- java内部类之成员内部类、局部内部类和匿名内部类
内部类概念 一个类中包含另外一个类. 分类 成员内部类. 局部内部类(包含匿名内部类). 成员内部类 定义格式: 修饰符 class 类名称 {修饰符 class 类名称 {//...}//... } ...
- 三种内部类的使用(成员内部类、局部内部类、匿名内部类)
三种内部类的使用 内部类是什么? 成员内部类 什么是成员内部类? 如何调用内部类中的public方法? 如何调用内部类中的private方法? 局部内部类 什么是局部内部类? 怎么使用局部内部类? 匿 ...
- 内部类详解————局部内部类
内部类三连击: <内部类详解----匿名内部类> <内部类详解----局部内部类> <内部类详解----静态嵌套类> 定义 在方法或某个作用域内的内部类,称为局部内 ...
- 内部类(成员内部类、局部内部类、匿名内部类、静态内部类)
外部类:单独定义的一个类,不在其他类的内部,只能用 public 和 缺省 权限修饰符 内部类:在类的内部再定义一个类,根据内部类的定义位置和修饰符的不同,可以分为: 1. 成员内部类: 语法格式: ...
- java局部内部类 final_Java的局部内部类以及final类型的参数和变量
Thinking In Java里面的说法(***正确的说法): 如果定义一个匿名内部类,并且希望它使用一个在其外部定的对象,那么编译器会要求其参数引用是final 的.publicclassTest ...
- JAVA入门级教学之(局部内部类)
package com.lbj.javase21; /** * 局部内部类等同于局部变量 * * 重点:局部内部类在访问局部变量的时候,局部变量必须使用final修饰,据说在J ...
- JAVA基础——内部类(成员内部类、静态内部类、局部内部类、匿名内部类)
成员内部类 静态内部类 局部内部类 匿名内部类 1.成员内部类(实例内部类.非静态内部类) 成员内部类中不能写静态属性和方法 实例化内部类,首先需要实例化外部类,通过外部类去调用内部类 作用 要想 ...
最新文章
- 这些神经网络,还可信吗?
- == Equals ReferenceEquals 的区别
- 夏意秋尽-08年1月
- 【转】SharePoint 2010 Search Service -- 管理中心配置
- matlab multithreading spyder,spyder和python的关系是什么
- Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数
- Real Vision CEO预测以太坊币价将在今年年初达到2万美元
- Rancher体系下容器日志采集
- 基于邻接表建图的几种方法
- Android9.0 PM机制系列(一)PackageInstaller初始化解析
- 通过phpstudy(小皮面板)搭建DVWA靶场教程
- android 热修复阿里,Android热修复(阿里热修复)
- html设置超链接位置,怎么调超链接的位置html
- 升级IOS百度人脸SDK4.0采坑记录
- Excel中提取单元格中的部分内容或单元格中的数字公式大全(提取数字,提取前几位,提取指定文字之间的内容等等)
- vagrant 修改配置文件后,window 系统报错 0x80004005
- springboot整合mail邮箱
- 解决MAC 安装绿联网卡驱动无效问题
- CentOS 7 从下载到安装
- 邮箱开启授权码(配置邮件客户端)
热门文章
- 中国连续纤维毡行业市场供需与战略研究报告
- window和linux下Redis 安装和使用
- C++之父Bjarne Stroustrup:程序员在数学上付出的努力,永远也不会白费
- Kaggle 年度报告出炉:数据科学家年轻高学历,薪资近百万
- 长文剖析经典论文,揭晓 Facebook 广告排序模型!
- SolarWinds与安稳特加强合作关系,携手助力中国IT专业人士应对挑战
- 如何快速在 Springboot 中集成拦截器? | 原力计划
- 华为百度美团驰援抗击疫情;自由软件基金会建议开源 Windows 7;印度超越美国成第二大智能手机市场 | 极客头条...
- 车票?工作?对象?Python 教你优雅解决年关三大难题!
- 微软斥资 260 亿美元收购了 LinkedIn 后却无所作为?