全国咨询热线:029-62258374

Java基础内部类学习笔记
作者:芯学苑Java培训    来源:西安芯学苑   发布时间:2017-12-12 15:25  阅读:


 

内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类

如同一个人是由大脑、肢体、器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液、跳动)

显然,此处不能单方面用属性或者方法表示一个心脏,而需要一个类

而心脏又在人体当中,正如同是内部类在外部内当中

java内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类 。

内部类的共性

(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。

(2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 。

(3)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 。
 

内部类的作用


内部类其实严重破坏了良好的代码结构,但为什么还要使用内部类呢?

因为内部类可以随意使用外部类的成员变量(包括私有)而不用生成外部类的对象,这也是内部类的唯一优点

如同心脏可以直接访问身体的血液,而不是通过医生来抽血。为了加深对Java内部类的理解,多想想内部类与外部类之间怎么转换的写法,我们可以体会出,写内部类会方便很多。

内部类实例

 

  1. package 内部类异常包装器;  
  2. /** 
  3.  *  
  4.  * TODO 成员内部类 
  5.  * 
  6.  * @author qiqitrue 
  7.  * @version 1.0  
  8.  * @since 2014-6-16 
  9.  */  
  10. public class MemberOuter {  
  11.     private static int i;//静态成员变量  
  12.     private int j = 10;  
  13.     private int k =20;  
  14.       
  15.     public static void outer_f1(){  
  16.         System.out.println("内部使用外部outer_f1()方法");  
  17.     }//定义一个外部的静态方法  
  18.   
  19.     public void outer_f2(){  
  20.         System.out.println("内部使用外部outer_f2()方法");  
  21.     }  
  22.       
  23.     class Inner{  
  24. //      static int inner_i = 100;//内部不允许定义静态变量  
  25.         int j = 100;  
  26.         int inner_i =1;  
  27.         int k =10;  
  28.         void inner_f1(){//内部类与外部类方法重名  
  29.             System.out.println("可以直接访问外部类变量:  "+i);//得到初始值0  
  30.             System.out.println("在内部类中访问内部类的变量直接用变量名(也可以用this.j): "+j);  
  31.               
  32.             System.out.println("内部类使用外部类中与同类同名的实例变量用外部名.this.变量名"+MemberOuter.this.j);  
  33.             System.out.println("内部类的k: "+k);//内部类变量  
  34.             System.out.println("内部取外部类用"+MemberOuter.this.k); //取外部类则要外部类.this.变量名  
  35.             outer_f1();//不需要外部类名.this  
  36.             outer_f2();  
  37.         }  
  38.           
  39.     }  
  40.     public void outer_f3(){//外部类方法可以直接使用new对内部类的使用  
  41.         System.err.println("进入outer_f3来取内部类方法成员");  
  42.         Inner inner = new Inner();  
  43.         inner.inner_f1();  
  44.     }  
  45.        
  46.     public static void main(String[] args) {  
  47.         //MemberOuter.Inner in = new MemberOuter().new Inner();  
  48.         //in.inner_f1();  
  49.         //注释可写成  
  50.         MemberOuter m = new MemberOuter();  
  51.         m.outer_f3();  
  52.           
  53.     }  
  54. }


  1. package 内部类异常包装器;  
  2.   
  3. /** 
  4.  *  
  5.  * TODO 方法内部类:顾名思义,嵌套在方法里面的类 
  6.  * 
  7.  * @author qiqitrue 
  8.  * @version 1.0  
  9.  * @since 2014-6-16 
  10.  */  
  11. public class Out { //Out到MemberOuter为非静态成员内部类 -- Outer6开始为局部内部类  
  12.       
  13.     int i = 9;  
  14.     public static void main(String[] args) {  
  15.         new Out().new in().display();//外部类引用内部类方法  外部类实例.内部类实例.方法  
  16.      }  
  17.       class in{//内部类  
  18.         public void display(){  
  19.             System.out.println("内部类对this的引用(相当于一个外部类的引用): "+Out.this.i);//内部类调用.this.变量  
  20.         }  
  21.            
  22.     }  
  23.       
  24. }  


  1. package 内部类异常包装器;  
  2.   
  3. /** 
  4.  *  
  5.  * TODO 成员内部类2 
  6.  * 
  7.  * @author qiqitrue 
  8.  * @version 1.0  
  9.  * @since 2014-6-16 
  10.  */  
  11. public class Outer1 {  
  12.     private String name = "张三";  
  13.     class Inner1{ //内部类  
  14.         public void displayInner1(){  
  15.             System.out.println(name+"非静态内部类Inner1的displayInner1方法,可以直接访问非静态外部类的私有属性name="+name);  
  16.         }  
  17.     }  
  18.     public static void main(String[] args) {  
  19.         new Outer1().new Inner1().displayInner1();//非静态内部类Inner1的displayInner1方法,可以直接访问非静态外部类的私有属性  
  20.           
  21.     }  
  22. }


  1. package 内部类异常包装器;  
  2.   
  3. public class Outer2 {  
  4.     public static void main(String[] args) {          
  5.         new Outer2().new Inner2().display();//对内部的调用  
  6.     }  
  7.     class Inner2{  
  8.         private int age = 88;  
  9.         public void display(){  
  10.             System.out.println(age);//private私有在本类中可直接访问  
  11.             System.out.println(this.age);//也可以通过this来访问  
  12.         }  
  13.     }  
  14. }  
 
0
上一篇:Java中的注解
下一篇:Java入门必学的Java精髓

关于我们 | Java培训 | Android培训 | WEB前端培训 |在线咨询 | 常见问题 | 高薪就业

地址:西安市小寨十字东南角国贸大厦12层 邮编:712000

版权所有:陕西芯学苑信息科技有限公司 备案号:陕ICP备16018856号 咨询电话:029-62871062

在线咨询