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

来源:互联网 发布:淘宝数据中心没有 编辑:程序博客网 时间:2024/04/29 08:33

---------------------- 黑马程序员 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