• 接口,内部类,抽象类概念和区别


    1. 接口

    接口为我们提供了一种将接口与实现分离的更加结构化的方法。接口是一个完全的抽象类,它没有提供任何形式的具体实现,它允许创建者确定方法名,参数类表,返回类型没有任何方法体的方法。

    接口被用来建立类与类之间的协议。接口类修饰符必须是public,default(默认的,本包内有访问权限)或者前边两个和abstract组合,接口也可以包含域,但是这些域隐士地是public static final类型的,所有接口域必须初始化值。接口中方法默认访问级别都是public,如果定义访问级别小于public,编译将不能通过。

    接口是用来实现类间多重继承功能的结构.
    接口不能实例化,即不能用new运算符创建对象。
    一个类通过使用关键字implements声明自己实现一个或多个接口。
    在类体中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法
    接口中的方法是自动公有的,在实现接口时必须把方法声明为public 。接口中的方法都是抽象的。

    一个接口可以继承另一个接口。

    任何类(包括普通类,内部类,抽象类)可以实现一个接口。

    2. 抽象类

    抽象类也叫做抽象基类,抽象类是基础类和接口中间的一个中庸之道,即有基础类特性(已实现的方法体),又有接口特性(抽象方法),抽象类用abstract修饰,抽象类中可以有抽象方法也用abstract来修饰。

    抽象方法:java 中可以定义一些不含方法体的方法,它的方法体的实现交给该类的子类根据自己的情况去实现。
    抽象类:包含抽象方法的类叫抽象类。一个抽象类可以有一个或多个抽象方法。

    抽象类必须使用abstract修饰符来定义,抽象方法也必须用abstract来修饰。
    抽象类不能被实例化,不能用new关键字去产生对象。
    抽象方法只能声明,不能实现。
    含有抽象方法的类必须被声明为抽象类,抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则这个子类还是个抽象类。

    3. 内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类,内部类允许你把一些逻辑相关的类组织在一起,并控制内部类的可视性,内部类和组合是完全不同的概念,这点要注意。

    最初,内部类看起来就是一种类隐藏机制,将类置于其他类的内部,但是其实内部类用途远远不止这些,它可以和外部类进行通信,而且你用内部类写出的代码更加优美清晰。

    定义:在一个类内部定义类
    内部类的写法:class 类名{ } 
    它可以直接访问和引用他的外部类的所有变量和方法,与外部类相比,内部类可以声明为private或protected.

    用static修饰一个内部类时(嵌套类),这个类相当于是一个外部定义的类,所以static的内部类中可声明static成员
    static内部类不能使用外部类的非static成员变量

    函数的局部变量(形参也是局部变量),内部类的成员变量,外部类的成员变量重名,用以下方式来明确指定我们真正要访问的变量。

    public class Outer {
        
        private int size;
     
        class Inner {
            
            private int size;
     
            public void doStuff(int size) {
                size++; // 引用的是doStuff函数的形参
                this.size++; // 引用的是Inner类中的成员变量
                Outer.this.size++; // 引用的Outer类中的成员变量
            }
        }
    }

    内部类如何被外部类引用?

    内部类可以通过创建对象从外部类之外被调用,只要将内部类声明为public

    public class Outer {
     
        private int size;
     
        class Inner {
     
            private int size;
     
            public void doStuff(int size) {
                size++; // 引用的是doStuff函数的形参
                this.size++; // 引用的是Inner类中的成员变量
                Outer.this.size++; // 引用的Outer类中的成员变量
            }
        }
     
        public static void main(String[] args) {
            Outer outer = new Outer();
            Outer.Inner inner = outer.new Inner();
            inner.doStuff(1);
        }
    }

    方法中定义内部类?

    内部类并非只能在类里定义,也可以在几个程序块的范围之内定义内部类。例如在方法或for循环体内部,均可以.
    在方法中定义的内部类只能访问方法中的final类型的局部变量。

        public void testClassInMethod(final String arg) {
            
            class ClassInMethod {
                
                void test() {
                    System.out.println(arg);
                }
            }
        }

    匿名内部类?

    只需要为局部内部类建立一个对象,不必为该类指定一个名字。

    public Inner testAnonyClassInMethod() {
        
        return new Inner() { // 此处为一个匿名类定义,没有类名,意思为创建一个继承自Inner内部类的对象
            
            @Override
            public void doStuff(int size) {
                super.doStuff(size);
            }
        };
    }

    抽象类和接口的区别与联系。

    一个类可以实现多个接口, 而一个类只能继承一个抽象类。
    接口只定义方法,实现一个接口就是要实现接口的所有方法。而抽象类可以实现部分方法。
    多个无关的类可以实现同一个接口,一个类可以实现多个无关的接口

    转自:http://www.pianshen.com/article/213371794/

  • 相关阅读:
    C#基础(WinForm窗体的单例模式,避免窗体被实例化多次)
    NPOI基础入门(旧版本)
    SQLite数据插入异常
    EClipse开发NDK流程
    git 常用命令
    6.0权限的简单实用
    MVVM模式
    去掉所有字符里面的空格换行符等
    高逼格的实现WiFi共享,不安装第三方wifi共享软件,两种方式实现开启wifi的功能
    常用的正则表达表达式以及简单用法
  • 原文地址:https://www.cnblogs.com/feifeicui/p/10950989.html
Copyright © 2020-2023  润新知