A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© coolmiao13 中级黑马   /  2015-2-21 10:10  /  968 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

论坛活动有一个关于静态内部类的问题,发现这里比较薄弱,然后就找了好多资料巩固了一下,这里是我找到的代码实现
和关于内部类的总结。匿名内部类再开一个帖子,资料不太全,有时间再去找找,或者自己写一些。而且帖子太长估计也看不下去。:lol
以下代码:
  1. package com.abbdca.sam;
  2. /*
  3. Java 内部类
  4. 分四种:成员内部类、局部内部类、静态内部类和匿名内部类。
  5. */
  6. public class Test02 {
  7.         public static void main(String[] args){
  8.                 //Chengyuan();
  9.                 //Jubu();
  10.                 JinTai();
  11.         }
  12.         static void Chengyuan (){
  13.                 //调用外部类方法4
  14.                 Outer.outer_f4();
  15.                 //调用外部类方法3
  16.                 new Outer().outer_f3();
  17.         }
  18.         static void Jubu (){
  19.                 //访问局部内部类必须先有外部类对象
  20.                 Outer2 out = new Outer2();
  21.                 out.f(3);
  22.         }
  23.         static void JinTai (){
  24.                         new Outer3().outer_f3();
  25.         }
  26. }
  27. /*
  28. 1、成员内部类: 即作为外部类的一个成员存在,与外部类的属性、方法并列。
  29. 注意:成员内部类中不能定义静态变量,但可以访问外部类的所有成员。

  30. 成员内部类的优点:
  31. ⑴ 内部类作为外部类的成员,可以访问外部类的私有成员或属性。
  32. (即使将外部类声明为PRIVATE,但是对于处于其内部的内部类还是可见的。)
  33. ⑵ 用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的private还要小的访问权限。
  34. 注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。
  35. 对于一个名为outer的外部类和其内部定义的名为inner的内部类。
  36. 编译完成后出现outer.class和outer$inner.class两类。
  37. */
  38. class Outer{
  39.         private static int i = 1;
  40.         private int j=10;
  41.         private int k=20;
  42.         public static void outer_f1(){
  43.                 System.out.println("外部类静态方法");
  44.         }
  45.         public void outer_f2(){
  46.                 System.out.println("外部类非静态方法");
  47.         }
  48.         //成员内部类
  49.         class Inner{
  50.                 //static int inner_i =100; //内部类中不允许定义静态变量
  51.                 int j=100;//内部类中外部类的实例变量可以共存
  52.                 int inner_i=1;
  53.                 void inner_f1(){
  54.                         //外部类的变量如果和内部类的变量没有同名的,则可以直接用变量名访问外部类的变量
  55.                         System.out.println(i);
  56.                         //在内部类中访问内部类自己的变量直接用变量名
  57.                         System.out.println(j);
  58.                         //也可以在内部类中用"this.变量名"来访问内部类变量
  59.                         System.out.println(this.j);
  60.                         //访问外部类中与内部类同名的实例变量可用"外部类名.this.变量名"。
  61.                         System.out.println(Outer.this.j);
  62.                         //外部类的变量如果和内部类的变量没有同名的,则可以直接用变量名访问外部类的变量
  63.                         System.out.println(k);
  64.                         //外部方法直接调用
  65.                         outer_f1();
  66.                         outer_f2();
  67.                 }
  68.         }
  69.         //外部类的非静态方法访问成员内部类
  70.         public void outer_f3(){
  71.                 Inner inner = new Inner();
  72.                 inner.inner_f1();
  73.         }

  74.         //外部类的静态方法访问成员内部类,与在外部类外部访问成员内部类一样
  75.         public static void outer_f4(){
  76.                 //step1 建立外部类对象
  77.                 Outer out = new Outer();
  78.                 //***step2 根据外部类对象建立内部类对象***
  79.                 Inner inner=out.new Inner();
  80.                 //step3 访问内部类的方法
  81.                 inner.inner_f1();
  82.         }
  83. }

  84. /*
  85. 2、局部内部类: 即在方法中定义的内部类,与局部变量类似,
  86. 在局部内部类前不加修饰符public或private,其范围为定义它的代码块。
  87. 注意:局部内部类中不可定义静态变量,可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的。
  88.         在类外不可直接生成局部内部类(保证局部内部类对外是不可见的)。
  89.         要想使用局部内部类时需要生成对象,对象调用方法,在方法中才能调用其局部内部类。
  90.         通过内部类和接口达到一个强制的弱耦合,用局部内部类来实现接口,
  91.         并在方法中返回接口类型,使局部内部类不可见,屏蔽实现类的可见性。
  92. */
  93. class Outer2 {
  94.         private int s = 100;
  95.         private int out_i = 1;
  96.         public void f(final int k){
  97.                 final int s = 200;
  98.                 int i = 1;
  99.                 final int j = 10;
  100.                 class Inner{ //定义在方法内部
  101.                         int s = 300;//可以定义与外部类同名的变量
  102.                         //static int m = 20;//不可以定义静态变量
  103.                         Inner(int k){
  104.                                 inner_f(k);
  105.                         }
  106.                         int inner_i = 100;
  107.                         void inner_f(int k){
  108.                                 //如果内部类没有与外部类同名的变量,在内部类中可以直接访问外部类的实例变量
  109.                                 System.out.println(out_i);
  110.                                 //可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的
  111.                                 System.out.println(k);
  112.                                 //System.out.println(i);
  113.                                 //如果内部类中有与外部类同名的变量,直接用变量名访问的是内部类的变量
  114.                                 System.out.println(s);
  115.                                 //用"this.变量名" 访问的也是内部类变量
  116.                                 System.out.println(this.s);
  117.                                 //用外部"外部类类名.this.变量名" 访问的是外部类变量
  118.                                 System.out.println(Outer2.this.s);
  119.                         }
  120.                 }
  121.                 new Inner(k);//创建内部类实例
  122.         }
  123. }

  124. /*
  125. 3、静态内部类: 静态内部类定义在类中,任何方法外,用static定义。
  126. 注意:静态内部类中可以定义静态或者非静态的成员
  127. */
  128. class Outer3 {
  129.         private static int i = 1;
  130.         private int j = 10;
  131.         public static void outer_f1(){}
  132.         public void outer_f2(){}
  133.         // 静态内部类可以用public,protected,private修饰
  134.         // 静态内部类中可以定义静态或者非静态的成员
  135.         static class Inner{
  136.                 static int inner_i = 100;
  137.                 int inner_j = 200;
  138.                 static void inner_f1(){
  139.                         System.out.println("Outer.i"+i);//静态内部类只能访问外部类的静态成员
  140.                         outer_f1();//包括静态变量和静态方法
  141.                 }
  142.                 void inner_f2(){
  143.                         //System.out.println("Outer.i"+j);//静态内部类不能访问外部类的非静态成员
  144.                         //outer_f2();//包括非静态变量和非静态方法
  145.                 }
  146.          }
  147.         public void outer_f3(){
  148.                 //  外部类访问内部类的静态成员:内部类.静态成员
  149.                 System.out.println(Inner.inner_i);
  150.                 Inner.inner_f1();
  151.                 //  外部类访问内部类的非静态成员:实例化内部类即可
  152.                 Inner inner = new Inner();
  153.                 inner.inner_f2();
  154.         }
  155. }
  156. /*
  157. 对于两个类,拥有相同的方法:
  158. class People
  159. {
  160.   run();
  161. }
  162. class Machine{
  163.    run();
  164. }
  165. 此时有一个robot类:
  166. class Robot extends People implement Machine.
  167. 此时run()不可直接实现。
  168. 注意:当类与接口(或者是接口与接口)发生方法命名冲突的时候,此时必须使用内部类来实现。
  169. 用接口不能完全地实现多继承,用接口配合内部类才能实现真正的多继承。
  170. */
复制代码



评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1 很不错。加油哦

查看全部评分

3 个回复

倒序浏览
看看  顶一个。。。
回复 使用道具 举报
顶。。。。。。。。。。。。。。。。。。。
回复 使用道具 举报
huangchunwei 来自手机 中级黑马 2015-2-21 16:25:37
板凳
赞一个。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马