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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

且听风语

中级黑马

  • 黑马币:16

  • 帖子:29

  • 精华:0

© 且听风语 中级黑马   /  2014-6-26 14:15  /  814 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 且听风语 于 2014-6-26 22:55 编辑

内部类
可以划分为
四种类型
第一种:非静态成员内部类
第二种:静态成员内部类
第三种:非静态局部内部类
(想使用局部内部类时需要生产对象,对象调用方法,在方法中才能调用局部内部类,所以不可能有静态的局部内部类。)
第四种:匿名内部类

下面介绍第一种类型:非静态成员内部类
优点:
A. 作为外部类的成员存在,跟成员变量和方法并列
B. 能够访问外部类的成员变量和方法,哪怕外部类的成员是私有的也一样能访问
C. 也能够被外部类随意访问和创建对象

以下代码揭示了其访问规则:
  1. class outer{
  2.         private static int i=100;
  3.         private int j=20;
  4.         private int k=30;
  5.         public static void outer_o1(){
  6.                
  7.         }
  8.         public void outer_o2(){
  9.                
  10.         }
  11.         public void outer_o3(){
  12.                 Inner in=new Inner();//外部类创建内部类对象的引用
  13.                 in.inner_i1();//调用内部类的方法
  14.         }
  15.         public static void outer_o4(){//静态成员方法调用非静态内部类成员时
  16.                 //Inner inner=new Inner();不能直接创建必须按照下述步骤完成
  17.                 //step1 建立外部类对象  
  18.         outer outer=new outer();  
  19.         //step2 根据外部类对象建立内部类对象  
  20.         Inner in=outer.new Inner();  
  21.         //step3 访问内部类方法
  22.          
  23.         in.inner_i1();  
  24.         }
  25.         class Inner{
  26.                 //static int inner_i=1;非静态内部类无法建立静态成员变量
  27.          private int inner_i=1;
  28.          int j=200;//可以和外部类同名的变量
  29.          void inner_i1(){
  30.                  System.out.println(inner_i);//正常访问自己的成员
  31.                  System.out.println(j);//在访问内部类的成员直接写变量名就可以了
  32.                  System.out.println(this.j);//访问本类的成员
  33.                  System.out.println(outer.this.j);//内部类访问于外部类同名的实例变量
  34.                                                   //用外部类名.this.变量名
  35.                  System.out.println(i);//不同名的变量直接访问
  36.                  outer_o1();
  37.                  outer_o2();//直接访问外部类的静态和非静态成员
  38.          }
  39.         }
  40.         
  41.         
  42. }



  43. public class InnerClass {

  44.         public static void main(String[] args) {
  45.         outer.Inner in=new outer().new Inner();//创建内部的对象的引用
  46.         in.inner_i1();
  47.         }  

  48. }
复制代码



1 个回复

倒序浏览
第二种静态成员内部类
  1. class outer{
  2.         private static int i=100;
  3.         private  int j=20;
  4.         private int k=30;
  5.         public static void outer_o1(){
  6.                
  7.         }
  8.         public void outer_o2(){
  9.                
  10.         }
  11.         public void outer_o3(){
  12.                 //外部内访问内部类的静态成员:内部类.静态成员  
  13.         System.out.println(Inner.inner_i);  
  14.         Inner.inner_i1();  
  15.         //外部类访问内部类非静态成员:实例化内部类  
  16.         Inner inner=new Inner();  
  17.         System.out.println(inner.inner_i);  
  18.         inner.inner_i2();  
  19.         }
  20.         public static void outer_o4(){
  21.                
  22.         }
  23.         static class Inner{
  24.                  static int inner_i=1;//静态内部类可以建立静态成员和方法
  25.          static int i=300;
  26.          int j=200;//也能建立非静态成员和方法
  27.         static void inner_i1(){
  28.                  System.out.println(inner_i);//正常访问自己的成员
  29.   
  30.                 // System.out.println(outer.j);//只能访问外部类的静态变量非静态变量无法访问
  31.                  System.out.println(outer.i);//同名的变量用外部类名.变量名就可以访问了
  32.                  outer_o1();
  33.                 // outer_o2();//只能访问外部类的静态成员,无法访问外部类的非静态成员
  34.          }
  35.         void inner_i2(){
  36.                
  37.         }
  38.         }
  39.        
  40.        
  41. }



  42. public class Innerclass1 {

  43.         public static void main(String[] args) {
  44.         outer.Inner in=new outer.Inner();//创建内部的对象的引用时不需要再对外部类创建对象直接创建内部类
  45.                                          //   格式 外部类名.内部类名 = new 外部类名.内部类构造方法
  46.         in.inner_i1();
  47.         }  

  48. }
复制代码




回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马