<<内部类>>--黑马程序员

------- android培训java培训、期待与您交流! ----------

1. 内部类的概括。

   把一个类中定义在另一个类,这个类就叫做:内部类,或者是嵌套类,内置类.

    定义内部类的原则:描述事物的同时还有内部事物,此事物内部类,内部事物访问外部事物。

2. 内部类之间的调用关系

      2-1.内部类和外部类之间的理论调用

                  1.  内部类访问外部类的成员,可以直接访问,包括私有成员----因为内部类中持有一个外部类的引用,格式:外部类名.this

            2.外部类访问内部类必须通过内部类的对象进行访问内部类的成员。

            3.要是在其他的类中调用内部类成员切内部类不是私有,先获得内部类对象,内部类对象获得的方式:外部类.内部类 名称=外部类对象.内部类对象,例如:(Outer.Innerin=new Outer().new Inner())

       2-2.内部类与外部类之间公共变量,局部变量之间的调用

                         1.外部类和内部类调用的是名称不相同的变量

public class Outer {
  private int x = 3;
  class Inner {
    private String name="zhangsan";
    /**
     * 内部类之间方法外部类的私有成员变量
     */
    public void show() {
      System.out.println("这是内部类中的方法");
      System.out.println("直接方法外部类中的成员变量:"+x);
    }
  }
  /**
   * 在外部类访问内部类的成员
   */
  public void function(){
    Inner inter=new Inner();
    System.out.println("在外部类调用内部类的私有属性:"+inter.name);
  }
}
public class Text {
  public static void main(String[] args) {
    Outer.Inner in=new Outer().new Inner();//在其他类中实例化内部类对象
         in.show();
         new Outer().function();//调用外部类方法      
  }
}



结果:这是内部类中的方法

直接方法外部类中的成员变量:3

在外部类调用内部类的私有属性:zhangsan

 

                     2.内部类和外部类调用相同名称的变量。(内部类默认权限)


public class Outer {
  private int x = 3;
  class Inner {
    private int x=10;
    /**
     * 内部类和外部类有相同名称的变量,和方法中的局部变量的名称相同
     */
    public void show() {
      int x=20;//局部变量
      System.out.println("直接方法局部变量:"+x);
      System.out.println("访问内部类的相同名称的成员:"+this.x);
      System.out.println("访问外部类的相同名称的成员:"+Outer.this.x);
    }
  }
 
}
public class Text {
  public static void main(String[] args) {
    Outer.Inner in=new Outer().new Inner();//在其他类中实例化内部类对象
         in.show();  
  }
}





   

结果:

直接方法局部变量:20

访问内部类的相同名称的成员:10

访问外部类的相同名称的成员:3


 

3.静态内部类(用static修饰内部类)。

     3-1.静态内部类只能调用外部类的静态成员(static修饰的)。

     3-2.外部其他类访问静态内部类的非静态成员,

        New 外部类.内部类().非静态成员

      外部类其他类访问静态内部类的静态成员

      New 外部类.内部类.静态成员

public class Outer {
  static class Inner {
    public static String name = "张三";
    public void show() {
      System.out.println("静态内部类的非静态成员");
    }  
  }
}
public class Text {
  public static void main(String[] args) {
    new Outer.Inner().show();// 外部类其他类访问静态内部类的非静态成员
    System.out.println(Outer.Inner.name);// 外部类其他类访问静态内部类的静态成员
  }
}



     3-3.当内部类中定义了静态成员,该内部类必须是静态的。

     当外部类中的静态方法调用内部类的时候,内部类必须是静态的。

   

public class Outer {
   static class Inner {  
    public void show() {
      System.out.println("show()");
    }  
  }
   public static void function(){
     new Inner().show();//这里会编译出错,
     //因为,此静态的方法只要是类一加载,那么此方法就会生成,
     //但是内部类是默认权限,不是外部类的静态成员,此时外部类一加载,
     //此内部类不会加载,但是外部类的静态方法却调用了此内部类,所以会出错,
     //解决方法是:把内部类定义成静态的
   }
}


     

         3-4:内部类定义在局部时。

不能被成员修饰符修饰(static ),因为方法中不能定义成员,只能定义局部变量,同时此时的内部类就不能定义静态的变量。

 不能访问他所在的局部中的的成员,但是此成员必须被final修饰。

public class Outer {
   class Inner {  
    public void show() {
      final int x=1;
      class aa{
         public void func(){
           System.out.println(x);
         }
      }
      new aa().func();
    }  
  }
   
}



 


4.匿名内部类。

      4-1.匿名内部类的概念

    匿名内部类就是内部类的一种简化书写。

     4-2.匿名内部类的书写和前提。

             1.要向书写内部类,此类必须继承一个类或者是接口。

    2.内部类的格式:new 父类或者是接口(){子类的内容}

    3.其实匿名内部类其实就是一个子类的对象。

    4.一个内部类中最多重写三个方法,多了最好定义一个类,然后继承父类。

     4-3.匿名内部类的优点和缺点。

   匿名内部类简化了代码,但是代码的阅读性比较差。

    4-4.匿名内部类的结构图。

 



  带名字的匿名内部类

abstract class ABC {
  public abstract void show();
}
 
public class Outer {
  public void method() {
    ABC news=new ABC() {
      public void show() {// 重新show()方法
         System.out.println("show");
      }
    };
    news.show();// 调用show()方法
  }
}



    4-5.匿名内部类小测试

interface Inter {
  void method();
}
class Test {
  static Inter function(){
    return new Inter(){
         public void method(){
         System.out.println("method");          //这是补充的代码
      }
    };
  }
}
 
public class InnterClassText {
 
  public static void main(String[] args) {
    Test.function().method();
 
  }
 
}



   4-6.匿名内部类的常见形式。

interface Inter {
  void method();
}
public class InnterClassText {
 
  public static void main(String[] args) {
    show(new Inter(){
      public void method(){
         System.out.println("show run");
      }
    });//使用匿名内部类作为show方法的传入的参数
 
  }
   public static void show(Inter in){
     in.method();
   }
}



   4-7.小转脑筋题。

 假如一个类没有父类也没有实现接口,那么它可以定成内部类吗?请思考!

首先答案是肯定的,可以这样写。使用Object类。

public class InnterClassText {
  public static void main(String[] args) {
    new Object() {
      public void function() {
         System.out.println("helloworld");
      }
    }.function();
  }
}




但是如果是这样的话,就不正确了!

public class InnterClassText {
	public static void main(String[] args) {
		Object oo=new Object() {
			public void function() {
				System.out.println("hello world");
			}
		};
		oo..function();//在这里会出错,因为在java虚拟机中没有给Object类中没有funtion()方法
	}
}


  

 

------- android培训java培训、期待与您交流! ----------

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值