黑马程序员-内部类

 黑马程序员-内部类

 

一,内部类:书写在类内部成员位置或方法内部的类

 

(注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。)

 

 

 

 

一,成员内部类特点

 

1,成员内部类;成员内部类就是作为外部类的成员出现的类,它可以访问外部类的一切,即时是用private修饰的方法或变量,

2,外部类在访问内部类的成员方法和变量时要用new Inner()

3,成员内部类的成员不能用static修饰成静态的,因为内部类在外部类加载后才加载.

4,成员内部类引用外部类对象是用OutterClass.this

5,在其他外部类创建内部类对象是要用:外部类名.内部类名   引用变量 = new 外部类().new 内部类();

例子:

 

  
  
  
  
  1. public class Main  
  2.     public static void main(String[] args)  
  3.     { 
  4.         Outer out = new Outer();//外部类对象 
  5.         Outer.Inner oi = out.new Inner();//内部类对象创建方法 
  6.         oi.print(); 
  7.     } 
  8.  
  9.  class Outer { 
  10.  
  11.     public Outer() { 
  12.         System.out.println("OutClass----print"); 
  13.     } 
  14.     public class Inner //extends Outer//可以继承外部类,但没什么意义 
  15.     { 
  16.         public Inner(){//构造方法 
  17.              System.out.println("Inner-----print"); 
  18.             } 
  19.          
  20.         public void print() {  
  21.             System.out.println("The Function of Inner"); 
  22.            // super.outPrint(); 
  23.         }  
  24. //      public void outPrint() 
  25. //      {//重写外部类该方法 
  26. //          System.out.println("The function of Innerqqqqqqqqqq"); 
  27. //      } 
  28.     } 
  29.     public void outPrint() 
  30.     { 
  31.         System.out.println("The function of Outer"); 
  32.     } 
  33.      
  34.     // 个人推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时  
  35.     public Inner getInner() { //获取内部类对象 
  36.         return new Inner();  
  37.     }  
  38. ////////////////////////////////////////////////////////////////////////////////////////

二,局部内部类--定义在类内部和作用域内的类,或叫方法内部类

特点:1,方法内部类只能在该方法内部实例化

2,方法内部类不能是用所在方法的非final变量---------原因:因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除, 局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中! 例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。 正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。

3,在外部访问方法内部类实例:可以让方法内部类实现一个外部的接口,利用多态调用其对象,和其中成员方法和成员变量

例子:

 

   
   
   
   
  1. public class Main  
  2.     public static void main(String[] args) { 
  3.          
  4.          
  5.         ///////////////////////////////////方法内部类///////////////////// 
  6.         print("方法内部类"); 
  7.         MethodClass mdc = new  MethodClass(); 
  8.         Destination d = mdc.function("dddd");//调用外部类方法得到内部类的对象 
  9.         Destination d1 = mdc.function("aaa"); 
  10.         d.print();//调用内部类方法 
  11.         String str = d1.getStr();//调用内部类方法 取得方法内部类成员值 
  12.         System.out.println("Main:"+str); 
  13.  
  14.  class MethodClass { 
  15.  
  16.     private String outStr = "外部成员"
  17.     public MethodClass() { 
  18.         // TODO Auto-generated constructor stub 
  19.     } 
  20.     public Destination function(final String s) 
  21.     { 
  22.         class PDestination implements Destination//可以实现接口 
  23.         {//方法内部类 
  24.             private String str; 
  25.              
  26.             private PDestination (String str) 
  27.             { 
  28.                 this.str = str;//初始化 
  29.             } 
  30.             @Override 
  31.             public void print() { 
  32.                 // TODO Auto-generated method stub 
  33.                 System.out.println("方法内部类方法"+str); 
  34.                 System.out.println("方法中的局部变量:"+s); 
  35.                 System.out.println(outStr); 
  36.             } 
  37.             public String getStr() 
  38.             { 
  39.                 return this.str; 
  40.             } 
  41.         } 
  42.          
  43.         return new PDestination(s); 
  44.     } 
  45. interface Destination 
  46.     public void print(); 
  47.     public String getStr(); 
  48.      

三,静态内部类又称为嵌套内部类,静态嵌套类 静态内部类特点: 嵌套内部类,就是修饰为static的内部类。声明为static的内部类,不需要内部类对象和外部类对象之间的联系, 就是说我们可以直接引用outer.inner,即不需要创建外部类,也不需要创建内部类。 嵌套类和普通的内部类还有一个区别:普通内部类不能有static数据和static属性, 也不能包含嵌套类,但嵌套类可以。而嵌套类不能声明为private,一般声明为public,方便调用。

 

    
    
    
    
  1. public class Main  
  2.     public static void main(String[] args) { 
  3.          
  4.          
  5.         /////////////静态内部类//////////////////// 
  6.         print("静态内部类"); 
  7.         StaticClass.Inner si = new StaticClass.Inner();//创建静态内部类对象:new 外部类.静态内部类(); 
  8.         si.function_2();//调用静态内部类的非静态方法,要用对象调用 
  9.         StaticClass.Inner.function_1();//调用静态内部类的静态方法; 
  10.  
  11. public class StaticClass { 
  12.  
  13.     public StaticClass() { 
  14.         // TODO Auto-generated constructor stub 
  15.         System.out.println("有静态内部类的外部类");//因为这是构造含是所以在没创建对像不会执行的 
  16.     } 
  17.     public static class Inner 
  18.     { 
  19.         public Inner() 
  20.         { 
  21.             System.out.println("静态内部类构造函数"); 
  22.         } 
  23.         public static void function_1() 
  24.         {//静态内部类的静态方法 
  25.             System.out.println("静态内部类的静态方法"); 
  26.         } 
  27.         public void function_2() 
  28.         { 
  29.             System.out.println("静态内部类的非静态方法"); 
  30.         } 
  31.     } 

四,匿名内部类-----必须是一个类的子类 * 在创建匿名内部类是,这个匿名内部类必须是某个类的子类或实现了某个接口

例子:

 

     
     
     
     
  1. public class Main  
  2.     public static void main(String[] args) { 
  3.          
  4.          
  5.         ///////匿名内部类/////////////////////////////////////// 
  6.         print("匿名内部类"); 
  7.         Anonymous as = new Anonymous(); 
  8.         Inner ir = as.getInner("lantian""hebei"); 
  9.         System.out.println("匿名内部类:"+ir.getName()); 
  10.  
  11. public class Anonymous { 
  12.  
  13.      
  14.     public Anonymous() { 
  15.         // TODO Auto-generated constructor stub 
  16.     } 
  17.     public Inner getInner(final String name,String city) 
  18.     { 
  19.         Inner in = new Inner(name,city) 
  20.         { 
  21.             private String namestart = name; 
  22.              
  23.             @Override 
  24.             String getName() { 
  25.                 // TODO Auto-generated method stub 
  26.                 System.out.println("匿名内部类函数getName()"); 
  27.                 return namestart; 
  28.             } 
  29.  
  30. //          @Override 
  31. //          String getCity() { 
  32. //              // TODO Auto-generated method stub 
  33. //              return null; 
  34. //          } 
  35. //           
  36.         }; 
  37.         return in; 
  38.     } 
  39.  

 

你可能感兴趣的:(黑马程序员――内部类)