黑马程序员_Java基础[18]_匿名对象、匿名内部类

时间:2022-10-01 00:48:07
---------- android培训 java培训、期待与您交流! ----------


/*【匿名对象练习】
 * 练习:
 */
interface Inter{
    void method();
}
class Test{
    //补齐代码。
    ///*
    static class Innter implements Inter{
        public void method(){
            System.out.println("method run");
        }
    }
    static Inter funtcion(){
        System.out.println("function");
        return new Innter();
    }
    //*/
    /*
    static Inter function(){
            //补齐代码。
        return new Inter(){
            public void method(){
                System.out.println("no name method");

            }
        };

    }
    */

}


public class Test_NoNameNeiBuLei {

    public static void main(String[] args) {
        
        //Test.function().method();
        /*
         * 1、读到test.funtcion()用类名调用,说明被调用的是一个static修饰的funtcion()方法
         * 2、点.method()    可以确定functions【运算完】返回结果是一个对象。而且是Inter类型
         *         只有返回来的是一个对象,对象才能调用method()
         *         什么对象又能调用method()呢,必然是Inter的对象,所以返回类型就是Inter
         * 这段代码其实就是:
         * Inter in=Test.function();
         * in.method()
         */
        show(new Inter(){
            public void method(){
                System.out.println("no name method");
            }
        });

    }
    /*什么时候使用匿名内部对象
     *
     * 当你使用的方法是参数类型是接口类型的时,该接口,你去查看一下,发现里面方法不超过3个
     * 两个或一个的时,你可以定义一个匿名内部类,把匿名内部类作为参数,传进去。

     */
    
    public static void show(Inter in){
        in.method();
    }
    /*面试题:
     * 在main函数中:
     * new Object();   这个是new一个【Object对象】
     * new Object(){}这个是Object的【子类对象】     (只有子类才能定义特殊方法。)
     */
}
--------------------------------------------------------------------------------------------------------------------



/*
 * 匿名内部类:                                     就为简化书写,覆盖方法。 没有名字的内部类
 * 1、其实就是内部类的简写格式。
 * 2、定义匿名内部类的前提:
 *         内部类必须是继承一个类或者实现接口。
 * 3、匿名内部类的格式:  new  父类/接口(){子类方法}  (()可以传参)
 * 3、其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖,可以理解为带内容的对象。
 * 4、匿名对象只能调用方法一次。
 * 5、匿名内部类中最好不要超过3个。              就为简化书写,覆盖方法。多了就复杂了
 */

abstract class AbsDemo{
    abstract void show();
}

class Outerr{
    int x=3;
    /*  【aa】//把该类简化为匿名内部类
    class Inner extends AbsDemo{
        public void show(){
            System.out.println("methodd"+x);
        }
    }
*/    
    

    public void function(){
        //new Inner().show();
        //就是把上面的Inner()用父类替换,并用大括号实现有名字的方法就是:
        //new 父类名(){子类内容}.show(); 就是匿名内部对象了
        //带着内容的对象。 是一个对象,AbsDemo的子类对象,已经复写AbsDemo的方法是【aa】的匿名内部写法
        new AbsDemo(){
        //AbsDemo b=new AbsDemo(){
            //int num=9;   //该句是可以的,应为是子类的特有的
            void show(){
                System.out.println("NoName"+x);
            }
            /*还可以定义子类特有方法,同非匿名对象一样的,只不过只能调用一次
             *
            void abc(){
                System.out.println("abc"+x);
            }*/
        }.show();    
        //b.show();
        //b.abc();//编译失败 父类没有该方法。
    }
    
    
}





public class Demo_NoNameNeiBulei {

    public static void main(String[] args) {
        new Outerr().function();
    }

}



---------- android培训、 java培训、期待与您交流!----------
黑马官网: http://edu.csdn.net/heima