java object-oriented inner class, an abstract class, interface class

一、内部类
        1、内部类概述
            (1)把类定义在另一个类的内部,该类就被称为内部类。
                举例:把类B定义在类A中,类B就被称为内部类。

        2、访问规则
                    内部类的访问规则
            A:可以直接访问外部类的成员,包括私有
            B:外部类要想访问内部类成员,必须创建对象

        3、内部类的分类
                (1)内部类的分类
                    A:成员内部类
                    B:局部内部类
                (2)成员内部类
                    A:private 为了数据的安全性
                    B:static 为了访问的方便性

                    成员内部类不是静态的:
                        外部类名.内部类名 对象名 = new 外部类名.new 内部类名();
                    成员内部类是静态的:
                        外部类名.内部类名 对象名 = new 外部类名.内部类名();
        4、局部内部类
                局部内部类
                A:局部内部类访问局部变量必须加final修饰。
                B:为什么呢?
                    因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。
                    所以,堆内存还是用该变量,而改变量已经没有了。
                    为了让该值还存在,就加final修饰。
                    通过反编译工具我们看到了,加入final后,堆内存直接存储的是值,而不是变量名。

        5、匿名内部类
                        匿名内部类(掌握)
                A:是局部内部类的简化形式
                B:前提
                    存在一个类或者接口
                C:格式:
                    new 类名或者接口名() {
                        重写方法;
                    }
                D:本质:
                    其实是继承该类或者实现接口的子类匿名对象

        6、开发中的使用
匿名内部类在开发中的使用
        我们在开发的时候,会看到抽象类,或者接口作为参数。
        而这个时候,我们知道实际需要的是一个子类对象。
        如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式简化。

        interface Person {
            public abstract void study();
        }

        class PersonDemo {
            public void method(Person p) {
                p.study();
            }
        }

        class PersonTest {
            public static void main(String[] args) {
                PersonDemo pd = new PersonDemo();
                pd.method(new Person() {
                    public void study() {
                        System.out.println("好好学习,天天向上");
                    }
                });
            }
        }
        7、面试题
interface Inter
{
    void method();
}

class Test
{
    //补足代码,通过匿名内部类。
    /*
    static class Inner implements Inter
    {
        public void method()
        {
            System.out.println("method run");
        }
    }
    */
    static Inter function()
    {
        return new Inter()
        {
            public void method()
            {
                System.out.println("method run");
            }
        };
    }

}

class  InnerClassTest
{
    public static void main(String[] args) 
    {
        //Test.function():Test类中有一个静态方法function
        //.method():function这个方法运算后的结果是一个对象。而且是一个Inter类型的对象。
        Test.function().method();

//其实就是Inter in = Test.function();
        //in.method();
    }
}
二、抽象类
        1、概述
                (1)把多个共性的东西提取到一个类中,这是继承的做法。
           但是呢,这多个共性的东西,在有些时候,方法声明一样,但是方法体具体实现不一样。
           也就是说,方法声明一样,但是每个具体的对象在具体实现的时候内容不一样。
           所以,我们在定义这些共性的方法的时候,就不能给出具体的方法体。
           而一个没有具体的方法体的方法是抽象的方法,需要被指定关键字abstract所标示。
           在一个类中如果有抽象方法,该类必须定义为抽象类。
        2、抽象类的特点
                    抽象类的特点
            A:抽象类和抽象方法必须用关键字abstract修饰
            B:抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
            C:抽象类不能实例化
            D:抽象类的子类
                a:是一个抽象类。
                b:是一个具体类。这个类必须重写抽象类中的所有抽象方法。
        3、抽象类的成员特点
                    A:成员变量
                        有变量,有常量
                    B:构造方法
                        有构造方法
                    C:成员方法
                        有抽象,有非抽象
        4、抽象类的几个小问题
                抽象类的几个小问题
            A:抽象类有构造方法,不能实例化,那么构造方法有什么用?
                用于子类访问父类数据的初始化
            B:一个类如果没有抽象方法,却定义为了抽象类,有什么用?
                为了不让创建对象
            C:abstract不能和哪些关键字共存
                a:final 冲突
                b:private 冲突
                c:static 无意义
三、接口类
        接 口(掌握)
        1:是用关键字interface定义的。
        2:接口中包含的成员,最常见的有全局常量、抽象方法。注意接口没有构造方法
        注意:接口中的成员都有固定的修饰符。
            成员变量:public static final 
            成员方法:public abstract 
        interface Inter{
            public static final int x = 3;
            public abstract void show();
        }
        3:接口中有抽象方法,说明接口不可以实例化。接口的子类必须实现了接口中所有的抽象方法后,
        该子类才可以实例化。
            否则,该子类还是一个抽象类。
        4:类与类之间存在着继承关系,类与接口中间存在的是实现关系。
            继承用extends  ;实现用implements ;
        5:接口和类不一样的地方,就是,接口可以被多实现,这就是多继承改良后的结果。java
            将多继承机制通过多现实来体现。 
        6:一个类在继承另一个类的同时,还可以实现多个接口。所以接口的出现避免了单继承的局限性。
            还可以将类进行功能的扩展。
        7:其实java中是有多继承的。接口与接口之间存在着继承关系,接口可以多继承接口。

        回顾猫狗案例,它们仅仅提供一些基本功能。
           比如:猫钻火圈,狗跳高等功能,不是动物本身就具备的,
           是在后面的培养中训练出来的,这种额外的功能,java提供了接口表示。

        接口都用于设计上,设计上的特点:(可以理解主板上提供的接口)
        1:接口是对外提供的规则。
        2:接口是功能的扩展。
        3:接口的出现降低了耦合性。

抽象类&接口区别
    抽象类与接口:

            抽象类:一般用于描述一个体系单元,将一组共性内容进行抽取,特点:可以在类中定义
            抽象内容让子类实现,
            可以定义非抽象内容让子类直接使用。它里面定义的都是一些体系中的基本内容。
            接口:一般用于定义对象的扩展功能,是在继承之外还需这个对象具备的一些功能。

        抽象类和接口的共性:都是不断向上抽取的结果。

        抽象类和接口的区别:

            1:抽象类只能被继承,而且只能单继承。
            接口需要被实现,而且可以多实现。 
            2:抽象类中可以定义非抽象方法,子类可以直接继承使用。
            接口中都有抽象方法,需要子类去实现。
            3:抽象类使用的是  is a 关系。
            接口使用的 like a 关系。 
            4:抽象类的成员修饰符可以自定义。
            接口中的成员修饰符是固定的。全都是public的。

        在开发之前,先定义规则,A和B分别开发,A负责实现这个规则,B负责使用这个规则。至于
        A是如何对规则具体实现的,
        B是不需要知道的。这样这个接口的出现就降低了A和B直接耦合性。 
Published 26 original articles · won praise 19 · views 40000 +

Guess you like

Origin blog.csdn.net/a23006239/article/details/47440861