内部类
来源:互联网 发布:机械行业erp软件哪家好 编辑:程序博客网 时间:2024/06/05 12:04
将一个类的定义放在另一个类的内部,称为内部类。编写一个名为outer的外部类,它包含一个Inner内部类。在outer中添加一个方法他返回inner类型对象。在main中创建并初始化一个指向inner的引用。程序编译后,会产生两个class文件,分别是Outer.class和Outer$Inner.class,其中$代表了下面程序中Outer.Inner中的那个。Outer.Inner inner2=outer.new Inner();可以用来产生内部类对象,需要注意两点:1.开头的Outer是为了标明需要生成的内部类对象在哪个外部类中2.必须先有外部类对象才能生成内部类对象,因为内部类的作用就是为了访问外部类中的成员变量package com.htxx.action.business;public class Outer { class Inner{ } Inner getInner(){ return new Inner(); } public static void main(String[] args) {Outer outer=new Outer();Inner inner=outer.getInner();//Inner inner2=new Inner(); Inner inner2=outer.new Inner(); Outer.Inner inner2=outer.new Inner();}}当生成一个内部类对象,此对象与生成他的外部类对象产生某种联系,使得内部类对象可以访问外部类的成员变量。package com.htxx.action.business;public class Outer {private String hello="555"; class Inner{ private String hello="444"; void say(){ String hello="333"; System.out.println(hello); System.out.println(this.hello); System.out.println(Outer.this.hello); } } Inner getInner(){ return new Inner(); } void say(){ System.out.println("hello"); } public static void main(String[] args) {Outer outer=new Outer();Inner inner=outer.getInner();//Inner inner2=new Inner();Outer.Inner inner2=outer.new Inner();//inner2.say//不能访问外部类成员函数inner2.say();}} 输出结果:333 444 555内部类想生成对外部类对象的引用,可以使用外部类的名字.this;package com.htxx.action.business;public class Outer {private String hello="555"; class Inner{ private String hello="444"; void say(){ String hello="333"; System.out.println(hello); System.out.println(this.hello); System.out.println(Outer.this.hello); } Outer getOuter(){ return Outer.this; } } void say(){ System.out.println("hello"); } public static void main(String[] args) {Outer outer=new Outer();//Inner inner2=new Inner();Outer.Inner inner2=outer.new Inner();inner2.getOuter().say();}}在未拥有外部类对象时,是不能创建内部类对象的。这是因为内部类对象会暗暗连接到创建他的外部类对象。但是如果你创建的是嵌套类(静态内部类),那么他不需要外部对象的引用。package com.htxx.action.business;class Outer{static class Inner{void say(){System.out.println("hello");}}Inner getInner(){return new Inner();}}public class A {public static void main(String[] args) { Outer.Inner inner=new Outer.Inner(); inner.say();}}创建一个包含内部类的类,在另一个独立的类内,创建此内部类实例。package com.htxx.action.business;import com.htxx.action.business.Outer.Inner;class Outer{class Inner{void say(){System.out.println("hello");}}}public class A {public static void main(String[] args) { Outer outer=new Outer(); Outer.Inner inner=outer.new Inner(); inner.say();}}私有内部类:这时只能由外部类操作package com.htxx.action.business;import javassist.runtime.Inner;//import com.htxx.action.business.Outer.Inner;class Outer{private class Inner{void say(){System.out.println("helloa ");}}void getInner(){ new Inner().say();}}public class A {public static void main(String[] args) { Outer outer=new Outer(); //因为是private,对于非外部类是不可见的 Outer.Inner inner=outer.new Inner(); inner.say(); //The type Outer.Inner is not visible Outer.Inner inner2=outer.getInner(); //The type Outer.Inner is not visible outer.getInner();//外部类调用方法使用内部类}}在方法和作用域内的内部类(在定义该内部类域以外,内部类是不可用的):package com.htxx.action.business;import com.sun.swing.internal.plaf.basic.resources.basic;public class A { void sayA(){ class B{ void sayB(){ System.out.println("haha"); } } B b=new B(); b.sayB(); } public static void main(String[] args) {A a=new A();A.B b=b.new B();//A.B cannot be resolved to a type}}创建一个至少有一个方法的接口。在某个方法内定义内部类实现该接口,这个方法返回对此接口的引用。package com.htxx.action.business;interface JieKou{void m1();}public class A {JieKou sayA(){ class B implements JieKou{@Overridepublic void m1() {// TODO Auto-generated method stubSystem.out.println("m1");} } return new B(); } public static void main(String[] args) {}}重复前一个练习,但将内部类定义在某一个方法的作用域内。package com.htxx.action.business;interface JieKou{void m1();}public class A {void sayA(){if(2>1){ class B implements JieKou{@Overridepublic void m1() {// TODO Auto-generated method stubSystem.out.println("m1");} } B b= new B(); b.m1();} } public static void main(String[] args) { A a =new A(); a.sayA();}}匿名内部类:http://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.htmlhttp://blog.sina.com.cn/s/blog_62ea4cf40100mubj.html接口内部的类:正常情况下,不能再接口内部防止任何代码,但是嵌套类可以作为接口的一部分。放到接口中的任何类自动是public和static的。因为类是static的,只是将嵌套类置于接口的命名空间内,这并不违反接口的规则。甚至可以再内部类中实现外围接口。创建一个包含嵌套类的接口,实现此接口并创建嵌套类的实例。package com.htxx.action.business;public interface Inter1 {void say(); static class SAS implements Inter1{@Overridepublic void say() {// TODO Auto-generated method stubSystem.out.println("111");} public static void main(String[] args) {new SAS().say();} } }-----------------------------------------参考文档-----------------------------http://www.cnblogs.com/nerxious/archive/2013/01/24/2875649.html
阅读全文
0 0
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- UGUI动态滑动列表
- linux系统启动流程详解
- Python从list删除元素
- FastJson基本使用
- 关于在Spring Cloud Feign工程中使用Ribbon配置不生效的问题
- 内部类
- Spring 框架的理解
- HDU-1257--最少拦截系统--最长上升子序列
- sqlalchemy使用SQLite时BIGINT不支持自增
- 2017.8.9
- 理想放大器模型建立
- 继承, 虚函数
- python之迭代器和生成器
- poj 2443 Set Operation(bitset)