首页 / JAVA / (转载)Java内部类的使用小结
(转载)Java内部类的使用小结
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了(转载)Java内部类的使用小结,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5602字,纯文字阅读大概需要9分钟。
内容图文
原文摘自:http://android.blog.51cto.com/268543/384844/
1. 成员内部类
public class Outer { public static void main(String[] args) { Outer outer = new Outer(); Outer.Inner inner = outer.new Inner(); inner.print("Outer.new"); inner = outer.getInner(); inner.print("Outer.get"); } // 个人推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时 public Inner getInner() { returnnew Inner(); } publicclass Inner { publicvoid print(String str) { System.out.println(str); } } }
2. 局部内部类
public class Parcel4 { public Destination destination(String s) { class PDestination implements Destination { private String label; private PDestination(String whereTo) { label = whereTo; } public String readLabel() { return label; } } returnnew PDestination(s); } publicstaticvoid main(String[] args) { Parcel4 p = new Parcel4(); Destination d = p.destination("Tasmania"); } }
定义在作用域里:
public class Parcel5 { private void internalTracking(boolean b) { if (b) { class TrackingSlip { private String id; TrackingSlip(String s) { id = s; } String getSlip() { return id; } } TrackingSlip ts = new TrackingSlip("slip"); String s = ts.getSlip(); } } publicvoid track() { internalTracking(true); } publicstaticvoid main(String[] args) { Parcel5 p = new Parcel5(); p.track(); } }
局部内部类也像别的类一样进行编译,但只是作用域不同而已,只在该方法或条件的作用域内才能使用,退出这些作用域后无法引用的。
3. 嵌套内部类
4. 匿名内部类
有时候我为了免去给内部类命名,便倾向于使用匿名内部类,因为它没有名字。例如:
((Button) findViewById(R.id.start)).setOnClickListener(new Button.OnClickListener() { @Override publicvoid onClick(View v) { new Thread() { @Override publicvoid run() { // TODO Auto-generated method stub } }.start(); } });
匿名内部类是不能加访问修饰符的。要注意的是,new 匿名类,这个类是要先定义的,看下面例子:
public class Outer { public static void main(String[] args) { Outer outer = new Outer(); Inner inner = outer.getInner("Inner", "gz"); System.out.println(inner.getName()); } public Inner getInner(final String name, String city) { returnnew Inner() { private String nameStr = name; public String getName() { return nameStr; } }; } } //注释后,编译时提示类Inner找不到 /* interface Inner { String getName(); } */
public void dosome(final String a, finalint b) { class Dosome { publicvoid dosome() { System.out.println(a + b) } }; Dosome some = new Dosome(); some.dosome(); }
从代码来看好像是那个内部类直接调用的a参数和b参数,但是实际上不是,在java编译器编译以后实际的操作代码是
class Outer$Dosome { public Dosome(final String a, finalint b) { this.Dosome$a = a; this.Dosome$b = b; } publicvoid dosome() { System.out.println(this.Dosome$a + this.Dosome$b); } }
因为匿名内部类,没名字,是用默认的构造函数的,无参数的,那如果需要参数呢?则需要该类有带参数的构造函数:
public class Outer { public static void main(String[] args) { Outer outer = new Outer(); Inner inner = outer.getInner("Inner", "gz"); System.out.println(inner.getName()); } public Inner getInner(final String name, String city) { returnnew Inner(name, city) { private String nameStr = name; public String getName() { return nameStr; } }; } } abstractclass Inner { Inner(String name, String city) { System.out.println(city); } abstract String getName(); }
注意这里的形参city,由于它没有被匿名内部类直接使用,而是被抽象类Inner的构造函数所使用,所以不必定义为final。
而匿名内部类通过实例初始化,可以达到类似构造器的效果:
public class Outer { public static void main(String[] args) { Outer outer = new Outer(); Inner inner = outer.getInner("Inner", "gz"); System.out.println(inner.getName()); System.out.println(inner.getProvince()); } public Inner getInner(final String name, final String city) { returnnew Inner() { private String nameStr = name; private String province; // 实例初始化 { if (city.equals("gz")) { province = "gd"; }else { province = ""; } } public String getName() { return nameStr; } public String getProvince() { return province; } }; } } interface Inner { String getName(); String getProvince(); }
5.内部类的继承
内部类的继承,是指内部类被继承,普通类 extents 内部类。而这时候代码上要有点特别处理,具体看以下例子:
public class InheritInner extends WithInner.Inner { // InheritInner() 是不能通过编译的,一定要加上形参 InheritInner(WithInner wi) { wi.super(); } publicstaticvoid main(String[] args) { WithInner wi = new WithInner(); InheritInner obj = new InheritInner(wi); } } class WithInner { class Inner { } }
原文:http://www.cnblogs.com/lichmama/p/3966818.html
内容总结
以上是互联网集市为您收集整理的(转载)Java内部类的使用小结全部内容,希望文章能够帮你解决(转载)Java内部类的使用小结所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。