java设置一个内部类child_java的内部类及匿名内部类
在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类
内部类和外层封装它的类之间存在逻辑上的所属关系
Inner class一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。 Inner class的名字不能与包含它的类名相同;
Inner class可以使用包含它的类的静态和实例成员变量,也可以使用它所在方法的局部变量;
内部类跟方法和成员变量一样,都是类的一个成员。所以像final,abstract,private,static,protected可以用来修饰内部类(比如外部类不能声明为private)。内部类享有和内部成员同样的待遇。
为什么使用内部类?
如果这个类没有定义在外部的必要,即使此类仅供外部类的方法来调用,而不会被其他外部类调用。
packagecom.atguigu.java;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;/*** 内部类:
* 1. 在类的内部定义的类成为内部类
* 2. 内部类相当于类的一个成员, 可以修饰类的成员的 private, static, final, abstract 都可以修饰内部类
* 3. 声明、使用内部类的实例.
* 3.1 非静态内部类的创建, 先创建外部类的实例, 再通过 外部类名.new 创建内部类的实例.
* OuterClass oc = new OuterClass();
* OuterClass.InnerClass in = oc.new InnerClass();
*
* 3.2 静态内部类的创建: 不再需要外部类的实例.
* OuterClass.StaticInnerClass sic = new OuterClass.StaticInnerClass();
*
* 4. 内部类引用外部类的成员:
*
* 5. ** 匿名内部类对象: 使用某一个接口通常是 先创建接口的实现类, 再创建其实现类的对象.
* 还可以, 直接创建其实现类对象.
*
* InvocationHandler invocationHandler = new InvocationHandler() {
* @Override
* public Object invoke(Object proxy, Method method, Object[] args)
* throws Throwable {
* return null;
* }
* };
*
**/
public classOuterClass {intage;static classStaticInnerClass{voidtest(){//System.out.println(age);
}
}static String name = "-1";//内部类
classInnerClass{
String name= "0";public voidtest(){
String name= "1";
System.out.println(name);//1
System.out.println(this.name); //0
System.out.println(OuterClass.this.name); //-1
}
}
}
packagecom.atguigu.java;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.lang.reflect.Proxy;public classTestInnerClass {public static voidmain(String[] args) {
OuterClass.StaticInnerClass sic= newOuterClass.StaticInnerClass();
OuterClass oc= newOuterClass();
OuterClass.InnerClass in= oc.newInnerClass();
in.test();
Proxy.newProxyInstance(null, null, newInvocationHandler() {
@OverridepublicObject invoke(Object proxy, Method method, Object[] args)throwsThrowable {//TODO Auto-generated method stub
return null;
}
});
InvocationHandler invocationHandler= newInvocationHandler() {
@OverridepublicObject invoke(Object proxy, Method method, Object[] args)throwsThrowable {return null;
}
};
}
}
匿名内部类
使用匿名内部类课使代码更加简洁、紧凑,模块化程度更高。内部类能够访问外部内的一切成员变量和方法,包括私有的,而实现接口或继承类做不到。
就是匿名内部类的两种实现方式:
第一种,继承一个类,重写其方法;
第二种,实现一个接口(可以是多个),实现其方法。下面通过代码来说明:
不使用内部类
abstract classPerson {public abstract voideat();
}classChild extends Person {public voideat() {
System.out.println("eat something");
}
}public classDemo {public static voidmain(String[] args) {
Person p= newChild();
p.eat();
}
}
运行结果:eat something
可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用
但是,如果此处的Child类只使用一次,那么将其编写为独立的一个类岂不是很麻烦?
这个时候就引入了匿名内部类
abstract classPerson {public abstract voideat();
}public classDemo {public static voidmain(String[] args) {
Person p= newPerson() {public voideat() {
System.out.println("eat something");
}
};
p.eat();
}
}
运行结果:eat something
可以看到,我们直接将抽象类Person中的方法在大括号中实现了
这样便可以省略一个类的书写
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口。匿名内部类就是重写父类或接口的方法。
匿名内部类是没有名字的,所以我们没办法获得其类型,而只能把它当作超类或接口类型来使用。
java设置一个内部类child_java的内部类及匿名内部类相关推荐
- java new 一个内部类_java内部类
java内部类的几种类型:成员内部类,静态内部类,方法内部类,匿名内部类. 成员内部类:成员内部类是类内部的非静态类.成员内部类不能定义静态方法和变量(final修饰的除外).这是因为成员内部类是非静 ...
- java内部类写法_java内部类怎么写
一.内部类基础 二.深入理解内部类 三.内部类的使用场景和好处 四.常见的与内部类相关的笔试面试题 若有不正之处,请多谅解并欢迎批评指正. 一.内部类基础 在Java中,可以将一个类定义在另一个类里面 ...
- java 内部类 返回值_Java基础第10天+形式参数和返回值的问题、包、导包、权限修饰符、常见的修饰符、内部类(局部内部类,成员内部类,匿名内部类)...
1:形式参数和返回值的问题(理解) (1)形式参数: 类名:需要该类的对象 抽象类名:需要该类的子类对象 接口名:需要该接口的实现类对象 (2)返回值类型: 类名:返回的是该类的对象 抽象类名:返回的 ...
- Java编程思想 第十章:内部类
可以将一个类的定义放在另一个类的定义内部,这就是内部类 内部类远不止如此,它就像是一个外围类:并能与之通信:而且你用内部类写出来的代码更加优雅清晰. 1. 创建内部类 将一个类定义在另一个类的内部,这 ...
- java提高篇(八)----详解内部类
可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...
- java handler的用法_Handler和内部类的正确用法
PS:本文摘抄自<Android高级进阶>,仅供学习使用 Android代码中涉及线程间通信的地方经常会使用Handler,典型的代码结构如下. 1 2 3 4 5 6 7 8 9 pub ...
- 在 Java 中,为什么需要创建内部类对象之前需要先创建外部类对象
在 Java 中,为什么需要创建内部类对象之前需要先创建外部类对象 我们知道,在 Java 中,创建一个内部类对象之前,需要它的一个外部类对象.这是因为内部类可能使用外部类的数据. 在内部类中 ...
- java 匿名 异常_JAVA类(内部类、匿名内部类、异常、自定义异常)
内部类 package AA;public class类 {int de=123; StringBuffer dee=newStringBuffer();public class成员内部类{publi ...
- java提高篇之详解内部类
转载自 java提高篇之详解内部类 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面看是非常容易理解的,无 ...
- java中常见的几种内部类,你会几个?(未完)
点击上方蓝色关注我们! 大家好,我是雄雄,今天给大家介绍的是java中的几种内部类. java中常见的几个内部类,你会几个?我会四个! 在看每个新知识点时,我们不禁有这样或者那样的疑问,比如它是什么? ...
最新文章
- Flutter Hero 实现组件跨界面跳动效果
- LeetCode 454 4Sum II(哈希法)
- 1.0 深度学习回顾与PyTorch简介 - PyTorch学习笔记
- byte转换int时为何与0xff进行与运算
- 给页面字段中添加一个按钮,点击按钮实现弹窗效果
- datetimepicker控件怎么改变hover颜色_VBA入门课程,ActiveX控件系列知识,复合框的属性与常见VBA代码...
- django3.2.8使用simpleui注意事项
- [机器学习笔记] Note2--单变量线性回归
- JAR——pinyin4j-2.5.0
- UE4手册中文翻译速查表
- 有关计算机编程论文,有关计算机程序的论文范文
- 制作u盘winpe启动盘_u盘启动盘制作工具软件哪个好?
- Java 他们每人单独过桥的时间是_java实现 n人过桥问题
- 自己封装一个v-model指令
- 单片机串口连接电脑,USB转TTL线的使用
- Python环境搭建系列
- LogExplore简介
- (java)密码加密。某系统的数字密码,比如1983,采用加密方式进行传输,规则如下:先得到每位数,然后每位数都加上5,再对10求余,最后将所有数字反转,得到一串新数。
- QGis二次开发基础 -- 构建图层管理器
- mysql中设计suk表_电商项目-商品表(spu)、规格表(sku)设计
热门文章
- 超声广义相干因子( Generalized Coherence Factor,GCF)波束合成仿真
- 掌握企业邮箱3个好用的技巧,商务沟通安全又轻松!
- melp算法matlab,svpwm过调制算法研究与实现 [MELP声码器的算法研究及实现]
- VsCode使用笔记【2】Ubuntu+.deb文件安装VScode
- 如何申请163邮箱账号
- Index.ANALYZED in lucene4 is deprecated
- 计算机硬盘格式化与储存原理
- ZZULIOJ:1044: 不及格率
- 参考文献格式(含文献标识码说明)
- Docker中文文档 分享