-
2019-08-29 10:40:32
你听说过增量上线吗?我新入公司第一次听说增量上线,所谓增量上线就是把你更改的java文件在本地编译成为.class文件,然后直接将.class文件扔到服务器上面去。这就是问题所在了,我在一个java类里面引用了一个内部类,然后增量上线的时候我只是把这个java类编译的.class文件扔到了服务器上,然后就gg了。报错缺少$..类文件。找了半天才意识到时内部类也生成了一个.class文件,但是我并没有把内部类的.class文件扔上去。所以我回到idea里面去target里面找到主java文件编译生成的.class文件的文件夹路径,发现里面并没有内部类的编译文件。后来以文件管理器打开该路径居然有内部类的.class文件!!!神奇有木有!!!然后将内部类的.class文件扔到服务器上去,问题解决!!!
附录:
匿名内部类编译时会不会生成class文件,下面来验证
我们知道 在一个类里如果有内部类,则编译是会产生两个class文件,一个类class 一个是内部类class,那么匿名内部类会不会也编译出来一个class呢,我们定义一个接口(接口会单独生成一个class),然后匿名生成这个接口的实例,再编译这个类,看看结果如何:
原始类如下:
public class MyClass { private MyInterface myInterface = new MyInterface() { @Override public void onTaskClick() { } }; public interface MyInterface { void onTaskClick(); } }
javac 编译后如下:
我们看到生成了一个接口的class文件和 MyClass$1.class文件,这个文件是系统自动为我们起了一个名字 1,也就是说即使我们没有为这个class命名,还是被系统赋予了名字
生成的内部类classMyClass$1 implements MyClass.MyInterface { MyClass$1(MyClass paramMyClass) {} public void onTaskClick() {} }
结论:匿名内部类编译后会生成class文件,名称是 1、2...数字
如果我们增加接口个数并相应增加匿名内部类,再次编译,则会相应生成 MyClass$2.classMyClass$3.class...等class文件
更多相关内容 -
匿名内部类
2020-12-22 12:07:09所谓匿名内部类(anonymous inner class),是指可以利用内部类创建没有名称的对象,它一步完成了声明内部类和创建该类的一个对象,并利用该对象访问到类内的成员,这种类不取名字,而是直接用其父类的名字或者它所... -
Java基础之匿名内部类,匿名内部类是什么?为什么要用匿名内部类,匿名内部类详解。
2021-01-28 17:55:35Java基础之匿名内部类,匿名内部类是什么?为什么要用匿名内部类,匿名内部类详解。 什么是匿名内部类? 顾名思义 匿名 就是没有名字,一个没有名字的内部类,称为匿名内部类。 下面先看一个例子,比如说你想和你的女...Java基础之匿名内部类,匿名内部类是什么?为什么要用匿名内部类,匿名内部类详解。
什么是匿名内部类?
顾名思义 匿名 就是没有名字,一个没有名字的内部类,称为匿名内部类。
下面先看一个例子,比如说你想和你的女朋友去看春节档的《唐人街探案三》这个时候我们要先定义一个接口,去看唐探3的接口
public interface MyInterface { // 看电影的抽象方法 void watchFilm(); }
OK!现在我们有了一个接口,接口里面有一个看电影的抽象方法。而现在你要去看电影了,你要实现接口里面的方法,但是接口不能直接 new 出来,所以你就要先定义一个实现类去实现这个接口,代码如下:
public class MyInterfaceImpl implements MyInterface{ public void watchFilm() { System.out.println("实现方法里带着女朋友去看电影!"); } }
现在我们实现了这个接口,也可以去看电影了,我们现在要写一个主方法;
public class GoWatchFilm { public static void main(String[] args) { MyInterfaceImpl myInterface = new MyInterfaceImpl(); myInterface.watchFilm(); } }
而这个时候,我们要先 new 一个看电影的实现类,然后调用里面看电影的方法,如图:
现在你和你心爱的女朋友成功的看到了电影…
因为我们已经知道多态,我们还可以使用多态的方式," = " 的左边时接口,右边是实现类也是没毛病的,
到这里!那么问题来了,这个电影你就看了一次,只有在 new 的时候才看了一次,没有再看第二次。所以这个时候我们就可以使用 匿名内部类 了。如果接口的实现类(或者父类的子类)只需要使用唯一一次,那么这种情况下我们就可以省略掉对该类的定义,而改为使用匿名内部类。
匿名内部类的定义格式:
上面我们有说到接口不能直接 new ,如果直接new就会报错,而这次,我们就直接new接口,但是这里的new和new对象又有一点小差别,格式如下:接口名称 对象名 = new 接口名称(){ // 覆盖重写所有抽象方法 }
那我们就代码实现一下:
如上图,我们new了一个接口,而接口下面的 { } 里面就是一个匿名内部类,所以现在我们使用匿名内部类就可以带着女朋友把电影看玩了,而之前我们定义的一个实现类就可以不用了,虽然说这样写法有点怪异,但是我们是想带着女朋友看电影,并且这个电影只需要看一次就行了,往后就不看了,却还要写一个实现类去实现它,使用匿名内部类就可以省掉一个类的单独定义,看到这想必小伙伴已经对匿名内部类了解的差不多了,不过匿名内部类也有一些注意事项,我们接着往下看。匿名内部类的注意事项:
首先对格式 “new 接口名称 () {…}” 进行解析:
1.new 代表创建对象的动作;
2.接口名称就是匿名内部类需要实现哪个接口;
3. {…} 这才是匿名内部类的内容; PS:没有class,没有名称
另外还要注意以下几点问题:
如果现在你的女朋友还想要看完电影去吃个海底捞,那么我们现在在接口里再写一个方法。并且第二天的时候你美丽的女朋友还要重复昨天做的事情,看电影,吃火锅,开始撸代码:public interface MyInterface { // 看电影的抽象方法 void watchFilm(); // 吃海底捞的抽象方法 void eatHotPot(); }
public class GoWatchFilm { public static void main(String[] args) { /* MyInterface myInterface = new MyInterfaceImpl(); myInterface.watchFilm();*/ MyInterface day01 = new MyInterface() { @Override public void watchFilm() { System.out.println("第一天在匿名内部类里面实现了带女朋友看电影了!!!!!!"); } @Override public void eatHotPot() { System.out.println("第一天看完电影我们去吃一个火锅吧!!!!"); } }; day01.watchFilm(); day01.eatHotPot(); // 来一条分割线 System.out.println("-------------------------------------------------------------------------------------------"); new MyInterface() { @Override public void watchFilm() { System.out.println("第二天在匿名内部类里面实现了带女朋友看电影了!!!!!!"); } @Override public void eatHotPot() { System.out.println("第二天看完电影我们去吃一个火锅吧!!!!"); } }.watchFilm(); new MyInterface() { @Override public void watchFilm() { System.out.println("第二天在匿名内部类里面实现了带女朋友看电影了!!!!!!"); } @Override public void eatHotPot() { System.out.println("第二天看完电影我们去吃一个火锅吧!!!!"); } }.eatHotPot(); } }
输出内容:
第一天在匿名内部类里面实现了带女朋友看电影了!!!!!! 第一天看完电影我们去吃一个火锅吧!!!! ------------------------------------------------------------------------------------------- 第二天在匿名内部类里面实现了带女朋友看电影了!!!!!! 第二天看完电影我们去吃一个火锅吧!!!!
可以看到,当我们第一天的时候,看完电影再吃火锅时是用的匿名内部类,是有对象名称的,可以直接用对象名称调用吃火锅和看电影的方法,而当第二天想再次调用的时候如果我们是用到了匿名对象,是直接new接口没有对象名称就要new两次,然后分别调用看电影和吃火锅,并且每次都要重写接口里的所有方法。
1、匿名内部类,在创建对象的时候只能使用一次,如果希望多次创建对象,而且内容一样的话,那么此时我们就要使用单独定义的实现类了。
2、匿名对象,在调用方法的时候,只能调用唯一一次,如果希望同一个对象调用多次方法,就必须给对象起一个名字。
3、匿名内部类是省略了“实现类/子类名称”,但是匿名对象是省略了“对象名称”到这里小伙伴们差不多已经知道匿名内部类的含义了吧,并且我们什么时候能用到匿名内部类,什么时候要定义一个实现类去实现接口里的方法了吧!!!!
-
Java提高篇之详解匿名内部类
2021-01-20 03:41:28在这篇博客中你可以了解到匿名内部类的使用、匿名内部类要注意的事项、如何初始化匿名内部类、匿名内部类使用的形参为何要为final。 一、使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有... -
java(1.8)字节码读例(匿名内部类)
2021-01-20 03:02:38public class ThreadDemo { public static void main(String[] args) { for(int i = 0;i<10;i++){ final int j = i; new Thread(new Runnable() { @Override public void run() { System.out.println(线程... -
Java基础 - 内部类03 - 匿名内部类详解
2022-02-10 21:49:451.什么是匿名内部类 定义 : 1.匿名内部类是定义在类的局部位置,如方法中、代码块中,且没有明确的类名; 2.是一个内部类,本质还是一个类; 3.没有类名; 4.同时还是一个对象。 2.匿名内部类的特性(关键) * 1...1.什么是匿名内部类
定义 :
1.匿名内部类
是定义在类的局部位置
,如方法中、代码块中,且没有明确的类名
;
2.是一个内部类,本质还是一个类
;
3.没有类名;
4.同时还是一个对象
。2.匿名内部类的特性(关键)
* 1.匿名内部类可以访问所有的外部类的成员,包括私有的; * 2.不能添加访问修饰符,因为匿名内部类也是一个局部变量; * 3.作用域 : 仅在定义它的方法或代码块中有效; * 4.匿名内部类 访问 外部类的成员的方式 : 直接访问; * 5.外部其他类 访问 匿名内部类的方式 : 不可以访问,匿名内部类是一个局部变量; * 6.如果 外部类 和 匿名内部类 的成员重名时,默认遵循就近原则, * 如果就是想访问 外部类的成员时,使用 【外部类名.this.成员】 的方式; * 7.匿名内部类是没有名字的,所以也无需写构造器; * 8.匿名内部类的运行时类型是 【外部类名+$+数字】
3.匿名内部类的语法
* 匿名内部类有两种实现方式:1.实现接口;2.继承一个类。 * 格式如下 : * new 接口名/类名(args...){ * //内容 * };
4.匿名内部类的示例代码
4.1 声明一个接口
package com.northcastle.B_niming_innerClass; /** * author : northcastle * createTime:2022/2/9 */ public interface InterfaceA { void sayHello(); }
4.2 声明一个抽象类
package com.northcastle.B_niming_innerClass; /** * author : northcastle * createTime:2022/2/9 */ public abstract class ClassA { abstract void sayHi(); }
4.3 真正的匿名内部类的代码(核心代码,必看)
package com.northcastle.B_niming_innerClass; /** * author : northcastle * createTime:2022/2/9 */ /** * 本案例演示 : 匿名内部类 */ public class NimingInnerClass { //1.外部类的成员 private String field01 = "外部类的私有属性field01"; public String field02 = "外部类的共有属性field02"; //2.外部类的构造器 public NimingInnerClass() { } public NimingInnerClass(String field01, String field02) { this.field01 = field01; this.field02 = field02; } //3.外部类的方法 /** * 3.1 一个普通的方法 */ public void method01(){ System.out.println("外部类的方法:method01"); } /** * 3.2 实现接口的匿名内部类 */ public void method02(){ //这个方法中包含实现接口的匿名内部类 //1.匿名内部类的定义 InterfaceA interfaceA_niming = new InterfaceA() { public String field01 = "接口+匿名内部类中的field01"; @Override public void sayHello() { System.out.println("接口+实现接口的匿名内部类对你说 : Hello"); //2.使用匿名内部类的属性 System.out.println("接口匿名内部类的field01 : "+field01); System.out.println("外部类的field01 : "+NimingInnerClass.this.field01); System.out.println("外部类的field02 : "+field02); } }; //3.判断匿名内部类类型 : 编译类型、运行时类型 System.out.println("接口+匿名内部类 的运行时类型 : "+interfaceA_niming.getClass()); //4.运行匿名内部类对象的方法 interfaceA_niming.sayHello(); } /** * 3.3. 继承类的匿名内部类 */ public void method03(){ //这个方法中包含实现类的匿名内部类 //1.匿名内部类的定义 ClassA classA_niming = new ClassA() { public String field01 = "类+匿名内部类中的field01"; @Override void sayHi() { System.out.println("类+匿名内部类对你说 : Hi"); //2.使用匿名内部类的属性 System.out.println("类+匿名内部类的field01 : "+field01); System.out.println("外部类的field01 : "+NimingInnerClass.this.field01); System.out.println("外部类的field02 : "+field02); } }; //3.判断匿名内部类类型 : 编译类型、运行时类型 System.out.println("类+匿名内部类 的运行时类型 : "+classA_niming.getClass()); //4.运行匿名内部类的对象的方法 classA_niming.sayHi(); } /** * 3.4 作为实参的匿名内部类 * @param interfaceA */ public void method04(InterfaceA interfaceA){ // 这里演示最常用的使用方式 : 匿名内部类作为实参传入方法中 interfaceA.sayHello(); } }
4.4 外部其他类对匿名内部类的使用
package com.northcastle.B_niming_innerClass; /** * author : northcastle * createTime:2022/2/9 */ public class Application { public static void main(String[] args) { //1.定义一个外部类的对象 NimingInnerClass nimingInnerClass = new NimingInnerClass(); //2.调用外部类对象的方法 nimingInnerClass.method01();//普通方法 System.out.println("=============================="); nimingInnerClass.method02();//包含匿名内部类的方法 System.out.println("=============================="); nimingInnerClass.method03();//包含匿名内部类的方法 System.out.println("=============================="); nimingInnerClass.method04(new InterfaceA() { //匿名内部类作为参数的方法 @Override public void sayHello() { System.out.println("实参中的匿名内部类向你说 Hello啦"); } }); } }
4.5 运行结果
运行结果与特性中表述的一致。
5.完成
Congratulations!
You are one step closer to success! -
JAVA内部类匿名内部类总结
2022-03-22 22:40:08JAVA匿名内部类笔记(适合初学者)个人简介
- 大家好,我是翰慧腾。一名正在努力学JAVA的大一小白,本文章为初学的笔记,希望各位多多指教。💙
- 欢迎点赞+收藏+留言💜
- 生活不止眼前的苟且,还有诗和远方🧡
一、内部类
- 内部类顾名思义就是在一个类内部声明另一个类,包含内部类的称为外部类。内部类一般用来实现一些没有通用意义的功能逻辑,可以访问外部类的成员,包括私有的成员。(TIP:外部类只可以用public 默认修饰,但是内部类可以用private protected修饰,增强了其封装性。)
- 创建的内部类都会产生class文件。
内部类分类:
1.静态内部类(了解即可)
静态内部类首先肯定要有static修饰,可以访问外部类的非静态变量、静态变量,不能访问外部类的非静态变量(需要实例化)。该类同之前学的类相同,只是在内部罢了,代码可以证明一切。如下:
package CSDN1; public class Outter { //外部类的两个成员变量 String name; int age; //内部类如下 public static class inner{ //同外部类一样,可以定义成员变量 String name; private int age;//为了其封装性,任然可以私密修饰 public inner() { }//同外部类一样的无参构造方法 public inner(String name,int age) { this.name=name; this.age=age; }//同外部类一样的带参构造方法 public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void show() { System.out.println(name+","+age); } } }
静态内部类创建对象格式:
接上述代码:
package CSDN1; public class Outter_Demo { public static void main(String[] args) { Outter.inner s=new Outter.inner("小明",19);//创建内部类对象,调用带参构造方法 s.show();//调用内部类的对象 } }
2.成员内部类: 无static修饰,属于外部类的对象(jdk16之后开始支持内部类中定义静态成员变量、方法。在jdk之前是不支持的),相当于是外部类的对象,通过创建对象来调用。内部类中的实例方法可以直接访问外部类的实例成员、静态成员。创建对象格式:
package CSDN1; public class Outter { String name; int age; public class inner{ String name; private int age; public inner() { } public inner(String name,int age) { this.name=name; this.age=age; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void show() { System.out.println(name+","+age); } } }
package CSDN1; public class Outter_Demo { public static void main(String[] args) { Outter.inner s=new Outter().new inner("小明",19);//创建内部类对象,调用带参构造方法 s.show();//调用内部类的对象 } }
此处附赠一道很有意思的面试题:
答案:
package Stickto; public class PeopleDemo { public static void main(String[] args) { // TODO 自动生成的方法存根 people.heart s=new people().new heart();//创建内部类对象 s.show();//调用内部类show方法 } } class people{ private int heartbeat=150; public class heart{ private int heartbeat=110; public void show() { int heartbeat=78; System.out.println(heartbeat);//78 System.out.println(this.heartbeat);//110 System.out.println(people.this.heartbeat);//150 //要牢记访问外部类成员对象的方法 } } }
3.局部内部类(了解即可):很多人都会认为局部内部类就是函数内部定义的类。其实并不一定在方法内,只要在局部(非外部类的成员部分)都叫做是局部内部类。
二、匿名内部类(重点,开发中常用)
- 匿名内部类本质上就是没有类名、没有class修饰的局部内部类,定义在方法中、代码块中等。方便创建子类对象,简化代码的编写。
- 抽象类不能直接创建对象,需要重写抽样方法后才可以直接创建。
废话不多说,直接上代码
package Stickto; public class AnimalDemo { public static void main(String[] args) { Animal s=new Animal() { @Override public void eat() { // TODO 自动生成的方法存根 System.out.println("猫吃老鼠"); } @Override public void sleep() { // TODO 自动生成的方法存根 System.out.println("猫睡着了"); } };//这就是一个匿名内部类,本身抽象类由于有抽象方法不能创建对象,匿名内部类就是重写抽象类内部抽象方法的,以便于直接创建抽象类对象,简化了之前创建子类的程序。特别提醒:匿名内部类后面是有分号的 s.eat(); s.sleep(); } } //创建一个抽象动物类 abstract class Animal{ String name; int age; public Animal() { } public Animal(String name,int age) { this.name=name; this.age=age; } public abstract void eat() ; public abstract void sleep(); }
总而言之,匿名内部类就是针对之前不能对抽象类、接口创建对象的情况。当然,有了匿名内部类之后也不能创建接口、抽象类的对象,而是通过创建匿名内部类对象达到了不用写子类的效果。匿名内部类就是对其抽象方法进行了重写。
-
java匿名内部类,什么是匿名内部类,如何定义匿名内部类,如何使用匿名内部类?
2019-11-12 11:37:18java匿名内部类什么是匿名内部类?匿名内部类的使用场景?匿名内部类如何创建?匿名内部类的实现和使用例1(实现接口)例2(继承类) 什么是匿名内部类? 匿名内部类,顾名思义,就是不知道这个类到底是什么名字,也... -
Java 匿名类(匿名内部类)
2020-12-25 23:41:48Java匿名类(匿名内部类) 学习的参考博文:无恨之都 1. 初识 匿名类 标准说法: 内部类包括:成员类、局部类、匿名类(匿名内部类)。 匿名类概念: 匿名类可以使你的代码更加简洁 (JDK8之后Lambda更简洁)。 你可以... -
Java中的匿名内部类
2021-01-20 03:06:23匿名内部类 Anonymous Inner Type 没有名字的类!!! 代码示例如下 /* * 匿名内部类演示 */ interface A { void test(); } /** * 非abstract修饰TypeA遵从接口A,要求强制实现接口A中的test方法 * @author ... -
Java内部类和匿名内部类的用法
2016-07-21 15:46:41Java内部类和匿名内部类的用法 【尊重原创,转载请注明出处】http://blog.csdn.net/guyuealian/article/details/51981163一、内部类: (1)内部类的同名方法 内部类可以调用外部类的方法,如果内部类有同名方法... -
什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?
2021-08-31 22:33:52一、什么是内部类?or 内部类的概念 内部类是定义在另一个类中的类;下面类TestB是类TestA的内部类。...3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。 三、 内部类的分类 成员内部 -
什么是匿名内部类,如何使用匿名内部类
2020-11-12 14:09:48匿名内部类 匿名内部类,就是没有名字的一种嵌套类。它是Java对类的定义方式之一。 为什么要使用匿名内部类 在实际开发中,我们常常遇到这样的情况:一个接口/类的方法的某个实现方式在程序中只会执行一次,但为了... -
java匿名类和匿名内部类详解
2021-03-09 06:35:27匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类。其语法形式如下:new(){//类的主体};这种形式的 new 语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。使用匿名类可使... -
Lambda表达式与匿名内部类
2019-04-24 19:27:55匿名内部类适合创建那种只需要一次使用的类,匿名内部类的语法有点奇怪,创建匿名内部类时会立即创建一个该类的实例,这个类定义立刻消失,匿名内部类不能重复使用(一次性的) 定义匿名内部类的格式如下: new... -
lambda表达式与匿名内部类
2020-08-07 14:13:01Lambda表达式类似匿名函数,简单地说,它是没有声明的方法,也即没有访问修饰符、返回值声明和方法名。 Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。 Lambda表达式的语法 (parameters) -> ... -
Javassist修改Class中的内部类(inner class)和匿名类(anonymous class)
2019-01-20 17:35:54首先来看一下官方文档给的相关信息: Inner classes or anonymous classes are not supported. Note that this is a limitation ... It cannot compile source code including an anonymous-class declaration. Ja... -
匿名内部类,最全讲解
2021-04-12 20:52:35匿名内部类讲解 1.定义 我们在使用对象的时候,假如对对象只使用一次,就定义为匿名对象。 同样,假如一个功能,单单指只靠方法是实现不了的。只能定义成一个类的形式,才能实现这个功能(就是我们所说的内部类)... -
Java:在匿名内部类中调用外部类方法
2021-03-06 18:13:39后者更明确,如果内部类中存在相同的名称,则可以调用外部类方法。class OuterClass {void foo() { System.out.println("Outer foo"); }View.OnClickListener mListener1 = new View.OnClickListener() {void foo() ... -
java中的匿名内部类总结
2021-02-28 13:24:04所以匿名内部类只能使用一次,它通常用来简化代码编写但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口实例1:不使用匿名内部类来实现抽象方法abstract class Person {public abstract void eat();... -
程序员你真的理解匿名内部类吗?
2019-10-10 22:22:30为了加深各位对匿名内部类的印象、好奇心以及求知的渴望,咋们先来看一个程序,如果提到线程你会不会立马想到接口和继承?如果提到接口和继承你会不会立马想到匿名内部类? 开篇甜点 为了加深各位对匿名内部类的... -
c++中也有java中的匿名内部类
2020-05-21 17:04:09什么是内部类 将类写在其他类的内部,可以写在其他类的成员位置或局部位置,... class 发动机 { //内部类 } } 内部类的分类 内部类分为成员内部类与局部内部类。 我们定义内部类时,就是一个正常定义类的过程... -
java内部类之成员内部类、局部内部类和匿名内部类
2018-07-15 16:13:302、局部内部类(包含匿名内部类)。 成员内部类 定义格式: 修饰符 class 类名称 { 修饰符 class 类名称 { //... } //... } 注意: 内部类使用外部,可以随意访问,但是外部类使用内部类要借助内部类的对象... -
简述内部类、静态内部类、匿名内部类的区别
2018-06-12 08:18:56内部类: 成员内部类可访问外部类所有的方法和成员变量。 不能有静态的方法和成员变量。...匿名内部类: 没有类名,没有class关键字也没有extends和implements等关键字修饰。 类的定义和实例化同时进行。... -
Java - Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?
2019-03-12 19:34:52分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!...可以继承其他类或实现其他接口,在Swing编程和Android开发中常用此方式来实现事件监听和回调。 ... -
匿名内部类方法重写(很常用)
2020-05-19 11:38:47二是使用匿名内部类的方式重写其方法,也可以达到相同的效果,并且代码更加简洁。在这里第一种方法就不说了,重点看看第二种方法是怎么个用法 。 一个NIO处理目录树的例子 目录树意味着一个目录里既有文件也有子目录... -
匿名类、内部类、匿名内部类
2019-01-04 10:49:02前端时间在写.net项目中,一直错将.cs里的两个class当作内部类,原来是一个文件里的两个类而已,这让我想起了Java中的内部类,比较内部类,那么还有两个类,那就是匿名类和匿名内部类。今天我想就Java中的这三种类...