常见的3大内部类,其实还有其他内部类,其他更更少用
成员内部类
特点:不对外开放,高内聚的 {只能去本类new xx调用内部的功能}
不需要外部知道我里面的实现(例生活例子:我买药品,不需要药是哪个农户提供给生产厂家的)
如果是外部强制要调用,也是可以的,不建议
这个也是可以禁用,把内部类Bb的构造方法设置为private就不可以调用了。
(new Aa()).new Bb().xxx方法名() ;
方法内部类
特点:不对外开放,短暂性的,方法执行完了就是没有的了。
通常方法内部类是继承某个抽象类,或是类,或是实现接口来体现的方法内部类。
匿名内部类{经常用的}
特点:不对外公开,进行实现功能,继承类,继承抽象类,实现某个接口的匿名内部类,实现相应的方法。
特别注意:匿名内部类,匿名指的是 ,new 关键字右边的那个对象--如继承,或是接口 {忌:一定不是一个具体实际的类}
IYeYou yy = new IYeYou()
步骤:
1:new 一个抽象类或是接口 new Pc() --new 的是不具体的所用说是匿名 【具体的是普通的类了】
2:加入一个大括号 {}
3:现在未实现的方法
--------------------------------------------------------------------------------------------------------------------------------------------------
下面依依分析代码
成员内部类:
特点:不对外开放,高内聚性
package com.test.memberinnerclass; public class MyMemberClass { class Aa{ public void xingQing(){ System.out.println("我的是内部类----功能提供高兴的 心情!"); } } public void play(){ System.out.println("我在高兴的玩撒!"); new Aa().xingQing() ; } }
进行调用一下
1 package com.test.memberinnerclass; 2 3 4 public class MemberClassTest { 5 6 /** 7 * @param args 8 */ 9 public static void main(String[] args) { 10 11 MyMemberClass mst = new MyMemberClass() ; 12 mst.play() ; 13 //现在是尝试的调用内部的类,很明显的是调用不了的。 14 //Aa s = new Aa() ; //报错的 15 //mst.Aa ma = new mst.Aa() ; //报错 16 17 //这个就是可以的但是不建议这样用,说好了,内部类,不可以这样调用的 18 //new MyMemberClass().new Aa().xingQing() ; 19 20 21 } 22 23 }
-----------------------------------------------------------------------------------------------------------------------------------------
方法内部类
特点:对外不公开,短暂性的,当方法执行完了就没有了的。
首先我先定义一个外部类做辅助:
定义这个类:
BanLiDuanZhanJingShengZheng
package com.test.methodinnerclass; /** * 颁发精神病证书类 * @author Administrator * */ public class BanLiDuanZhanJingShengZheng { public void noProblem(){ System.out.println("颁发精神病证,我杀人也是没问题的----我背景'有人'"); } }
定义第二个类含义方法内部类的
package com.test.methodinnerclass; public class MethodInnerClass { /** * 方法内部的特点:不对外开放,短暂性有效的,当方法执行完就是没有校的了,也是符合业务流程功能, * 因为我开车的时候,撞到了人,此时我才要颁发那个证书的。 * * ???? * 问题来了:疑问,老师为什么要定义一个匿名内部类Cc来呢,然后再次继承一个颁发精神病的类。 * 我的观点:干脆就是new 一下那个颁发精神病的类进行调用不就可以实现相同的效果功能吗? * 老师说:有时那个类是-----抽象类,必须需要继承类或是实现接口才能达到那个实际的 * 感悟:有道理,没错。 */ //定义一个方法实现开车 public void driverCar(){ System.out.println("我在以150km/h的速度在开车!"); System.out.println("撞坏了人"); //此时定义了一个方法内部类为Cc {内部类可以继承某个类,抽象类,或实现接口} class Cc extends BanLiDuanZhanJingShengZheng{ //须知此时我就时继承了一个颁发精神病的类,方法就是进行了继承过来的了 } new Cc().noProblem() ; System.out.println("以前事情都是没有问题的了!"); } }
我们进行测试运行
package com.test.methodinnerclass; public class MethodTest { public static void main(String[] args) { MethodInnerClass mend= new MethodInnerClass() ; //此时我调用的饿是开车方法(内部有个匿名内部类) mend.driverCar() ; } }
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
匿名内部类:
特点:
不对外公开,进行实现功能,继承类,继承抽象类,实现某个接口的匿名内部类,实现相应的方法。
特别注意:匿名内部类,匿名指的是 ,new 关键字右边的那个对象--如继承,或是接口 {忌:一定不是一个具体的类}
IYeYou yy = new IYeYou()
实现步骤:
1:new 一个抽象类或是接口 new Pc() --new 的是不具体的所用说是匿名 【具体的是普通的类了】
2:加入一个大括号 {}
3:现在未实现的方法
package com.test.anonymousinnerclass; public class AnonymousTest { //测试 public static void main(String[] args) { //抽象类是不可以来进行创建对象的。 //Doctor docs = new Doctor() ; //报错 //这个是普通进行创建的实际类 DoctorOne done = new DoctorOne() ; done.workdaycase() ; done.workNight() ; System.out.println("--------------------------------") ; //此时我这里是个匿名的内部类 new 抽象类 Doctor dess = new Doctor(){ public void workNight() { System.out.println("我是个第三个教授3号,我晚上是溜冰玩耍的!"); } } ; dess.workdaycase() ; dess.workNight() ; System.out.println("--------------------------------") ; //此时我这里是个匿名的内部类 new 接口 IYeYou yy = new IYeYou(){ public void workNight() { System.out.println(""); } } ; yy.workNight() ; } }
-----------------------------------------------------------------以上就是常见的3大内部类--------------------------------------------------------------
---------------------------------------------------------------------------
感悟:
内部类有有点也是有缺点,其中,匿名内部类是用的最多的,其他的比较少用。
内部类的也有优点和缺点,但是我们在Android中是经常用的。
优点:我需要实现一个功能,只需在内部进行创建new就是可以实现了,不需要外部进行的创建。
缺点:不好管理维护,耦合度很高。
-----------------------------------------------------
感谢你光临!