1.内部类的基本定义结构
2.使用static定义内部类
3.在方法中定义内部类
从开发的角度内部类能少用就少用
一. 概念:在一个类的下面有另一个类。
class Outer{ private String msg = "Hello word" ; class Inner{ //定义一个内部类 public void print(){ System.out.println(msg) ; } } public void fun () { new Inner() . print() ; } } public class Test{ public static void main(String args[]){ Outer out = new Outer() ; out.fun() ; } }
最大的感受:结构上不是很合理。
从类的结构本身是属性与方法组成,可是一个类里面定义一个类,结构不是很合理。
一个很重要的目的,将这个类拿到外面去实现一个一样的功能。
此时产生了两个Outer对象,所以想将第一个实例化对象传过去。
class Outer{ private String msg = "Hello word" ; public String getmsg(){ return this.msg ; } public void fun(Outer out){ new Inner (out).print() ; } } class Inner{ public Outer out ; public Inner(Outer out){ this.out = out ; } public void print(){ System.out.println(new Outer().getmsg()) ; } } public class Test{ public static void main(String args[]){ Outer out = new Outer(); out.fun(out); } }
最终目的是内部类可以访问外部类的私有属性。。
同理外部类也可以轻松访问内部类的私有属性。
class Outer{ private String msg = "Hello word" ; class Inner{ private String info = "helo zhuopeng" ; } public void fun(){ Inner in = new Inner () ; System.out.println(in.info) ; } } public class Test{ public static void main(String args[]){ Outer out = new Outer() ; out.fun() ; } }
以上都是用外部类的fun方法访问内部类的对象。
内部类能不能像外部对象一样直接产生实例化对象调用呢。此时发现有这么一个文件
此时可以给出内部类对象的实例化语法::
外部类。内部类 对象 =new 外部类()。内部类() ;
class Outer{ private String msg = "Hello word" ; class Inner{ public void print(){ System.out.println(Outer.this.msg); } } } public class Test{ public static void main(String args[]){ Outer.Inner in = new Outer().new Inner(); in.print() ; } }
如果一个内部类只是希望能够被外部类访问而不希望被外部访问,则可以在前面加上private修饰
private class Inner{};
new 外部类() 。内部类() ;
二。使用static定义内部类
如果一个内部类使用static定义,则这个内部类只能访问外部类的static修饰的成员变量。
class Outer{ private String msg = "hello world" ; static class Inner{ public void print() { System.out.print(msg); } } } public class Test{ public static void main(String args[]){ } }
以上程序错误,不能编译通过。只能访问static修饰的属性
如果想要直接实例化内部类对象则语法:
外部类。内部类 对象 = new 外部类。内部类() ;
仿佛就变成了一个独立的类。
class Outer{ private String msg = "hello world" ; static class Inner{ public void print() { System.out.println("hello") ; } } } public class Test{ public static void main(String args[]){ Outer.Inner in = new Outer.Inner() ; in.print() ; } }
三。在方法中定义内部类
这个是比较常见的形式
范例:
class Outer{ private String msg = "hello world" ; public void fun(){ class Inner{ public void print(){ System.out.println(Outer.this.msg); } } new Inner().print(); } } public class Test{ public static void main(String args[]){ new Outer().fun() ; } }
方法内部类也是可以访问方法的参数和方法的变量,,在JDk1.7及其之前的版本中必须要在变量和方法前面加上“final”一词;
范例:
class Outer{ private String msg = "hello world" ; public void fun(){ final double num = 100 ; //final class Inner{ public void print(){ System.out.println(Outer.this.msg); System.out.println(num) ; } } new Inner().print(); } } public class Test{ public static void main(String args[]){ new Outer().fun() ; } }
原文:http://www.cnblogs.com/da-peng/p/5119674.html