黑马程序员——匿名内部类

---------------------- 黑马程序员 Android培训、期待与您交流! ----------------------

 内部类访问规则:

 * 1内部类可以直接访问外部类中的成员,包括私有。

 *    之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用

 *    (格式:外部类外.this

       相当于孙悟空要访问牛摩王的心脏,如果孙悟空在牛魔王的身体里,就可以直接访问了

 * 2,外部类要访问内部类,必须建立内部类对象。

 *   

 *    访问格式:

 *    1.当内部类定义在外部类的成员位置上,而且非私有,可以在外部其它类中。

 *    可以直接建立内部类对象。

 *    格式:

 *    外部类外.内部类名  变量名  new外部类().new内部类();

 *   Outer.Inner in = new Outer().new Inner();

 *    解析上面代码:Outer.Inner就是访问Outer对象的内部类

 

 *    2.当内部类在成员位置上,就可以被成员修饰符所修饰

 *    比如,private:将内部类在外部类中封装。

 *   Static:内部类就具备static特性。

 *    当内部类被static修饰后,只能直接访问外部类中的static成员。出现了访问局限

 *   

 *    在外部其他类中,如何访问内部类的非静态成员呢?

 *    newOuter.Inter().Show();

 *   

 *    在外部其他类中,如何访问内部类的静态成员呢?

 *   Outer.Inter().Show();

 *   

 *    注意:当内部类中有static定义了静态成员变量,该内部类也必须是静态的。static

*          当外部类中静态方法访问内部类时,内部类也必须是static静态的。

 */

class Outer
{
    private int x = 3;
   
    class Inner
    {
       void Show()
       {
           int x = 3;
           System.out.println("内部类"+Outer.this.x);
       }
    }
    static class Inter   //静态内部类
    {
       void Show()
       {
           int x = 3;
           System.out.println("静态内部类"+x);
       }
    }
    void method()
    {
       Inner in = new Inner();
       in.Show();
    }
   
    //访问内部类的方法:失败
    public void Insert()
    {
       new Outer().Insert();
       System.out.println("当外部类中静态方法访问内部类时,内部类也必须是static静态的。");
    }
}
public class _01内部类 {
   
    public static void main(String[]args)
    {
       Outer o = new Outer();
       o.method();
      
       //直接访问内部类中的成员
       Outer.Inner in = new Outer().new Inner();
       in.Show();
      
       //静态访问内部类方法(因为没有访问具体成员变量,所以可以直接通过类名调用)
       new Outer.Inter().Show();
      
       //---------------------------------
       o.Insert();//访问内部类时,内部类也必须是static静态的。
    }
   
   
 
}


内部类定义规则

/*

 *当描述事物时,事物的内部还有事物,该事物用内部类来描述。

 * 因为内部事物可以直接访问外部事物的内容。

 *

 * 举例:人体

 * 人体里面包含心肝脾肺肾

 *

 * 人体:是一个外部类

 * |--包含心脏跳动的方法

 *  |--包含肺的活动方法

 * 

 *      心脏:是一个内部类

 *      |--包含左心房的方法

 *         |--包含右心房的方法

 * 

 * 

 * class Body

 * {

 *      privateclass XinZang  //内部类定义时,最好将其私有,不对外暴露

 *      {

 *         voidshow TiaoDong(){}

 *      }

 *

 *      //对钱提供方法,来访问内部事物

 *      publicvoid show()

 *      {

 *         newXinZhang().TiaoDong();  创建心脏对象,并访问跳动方法

 *      }

 * }

 * ---------------------------------------

 * 把心脏定义在人体里面,这样符合自然规律。心脏可以直接在内部访问人体内的方法。

 * 如果定义在外面,心脏还要创建人体的对象,然后才可以访问人体的方法,

 *

 * 为什么要把内部类私有呢?

 * 心脏如果直接被别人访问,就会很受伤。所以将其封装,只能让大夫访问,并判断是不是大夫

 * ---------------------------------------

 */


匿名内部类

/*

 * 内部类定义在局部时(就是:类中的方法中)

 * 1,不可以被成员修饰符修饰

 * 2,可以直接访问外部类中的成员。因为还持有外部类中的引用。

 *    但是,不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量

 *   

 */

 

class Out
{
    int x=3;
    void method(final int num)
    {
       final int y=4;
       //定义内部类:方法中的内部类,不可以加static静态变量修饰
       class Inner
       {
           void function()
           {
              System.out.println("x="+x);
              System.out.println("y="+y);
           }
       }
       new Inner().function();
      
       System.out.println("final="+num);
    }
}
public class _02匿名内部类 {
   
    public static void main(String[]args)
    {
       Out o = new Out();
       o.method(5);
       o.method(7);
      
    }
 
}


匿名内部类2

/*

 * 匿名内部类:

 * 1,匿名内部类其实就是内部类的简写格式

 * 2,定义匿名内部类的前提:

 *    内部类必须是继承一个类或者实现接口

 * 3,匿名内部类的格式(new父类或者接口(){定义子类的内容}

 * 4,其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。可以理解为带内容的对象

 *   (注意:匿名类:是把定义类,调用对象封装为一体的表现形式)

 * 5,匿名内部类中定义的方法最好不要超过3 

 *

 */

abstract class Demo
{
    abstract void show();
}
class OutOne
{
    int x = 3;
    /*
    class Nei extends Demo
    {
       void show()
       {
           System.out.println("内部类:"+x);
       }
    }
    */
   
    public void function()
    {
       //new Nei().show();
      
       //上面绿色代码的简写方式:简称匿名内部类
       //因为没有类名,所以调用父类的类名,然后将父类的方法赋写,最后调用父类的方法体.show
       new Demo()
       {
           void show()
           {
              System.out.println("x==="+x);
           }
           void abc()
           {
              System.out.println("xbs");
           }
       }.abc();
    }
}
public class _03_匿名内部类 {
   
    public static void main(String[]args)
    {
       new OutOne().function();
    }
 
}


---------------------- 黑马程序员 Android培训、期待与您交流! ----------------------

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值