zoukankan      html  css  js  c++  java
  • 面对对象(接口)

     一.  接口(interface),是一种引用数据类型。

       interface 差不多= = abstract class

      1)接口是has a (继承是is a):“像”我中的一种,是继承体系之外的,用于功能扩展!想扩展就实现,不想就不用实现。
      2)接口中只能声明抽象方法和常量且声明格式都是固定的,定义的所有变量都是static final类型的,只不过可以省略。
    注意:接口中声明常量和抽象方法的格式是固定的

    1 public interface Test {
    2 /*public abstract final*/int SPEED=100;//声明常量
    3 /*public abstract 省略了,写也对*/void showInfo();//声明抽象方法
    4 }

       3)接口中的方法都是公共抽象方法

    1 public interface MyInterface {
    2     public abstract void showInfo();
    3     void showInfo3();
    4     
    5     // 推荐写法
    6     public void showInfo2();
    7 }

    二.接口的多态现象

      1)接口不能有构造器,因为不能实例化何以初始化,接口只能被“实现”。

      2)具体类实现了一个接口,则必须实现全部的抽象方法,若没有全部实现,则该类为抽象类。所以说,接口约定了具体类的方法,约定了类的外部行为。

      3)具体类可以同时实现多个接口,就是多继承现象。

      4)多重继承:实现类Student具备了驾驶能力,实现类Teacher也具备了驾驶能力,原因是都实现了Drive,两个实现类的能力得到了增强。

      5)接口用implements 表实现,实际是继承关系,可有多个接口(实现),继承用extends 只能有一个继承关系。

      6)一个类既可以继承的同时,又“实现”接口:class A extends B implements C , D;

      7)类与类之间是继承关系,类与接口之间是实现关系,接口与接口之间是继承关系,且只有接口之间可以多继承,即:interface A{},interface B{},interface C extends A , B 但接口多继承时要注意,要避免A、B接口中有方法名相同、参数列表相同,但返回值类 型不相同的情况,因为被具体类实现时,不确定调用哪个方法。

    三. 抽象类和接口的异同比较

     1.abstract class和interface有什么区别?

      1)从编程的角度:abstract class在java语言中表示的是一种继承关系,一个类只能使用一次继承关系。而一个类可以实现多个interface。
      2)从问题域角度:abstract class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的约定(协议)而已。

    2.抽象类和接口的异同

      1)抽象类和接口都是引用数据类型,他们都不能创建对象,都可以定义抽象方法,都可以实现多态;但是抽象类可以定义非抽象方法,而接口中定义的都是抽象方法。

      2)抽象类和接口都具有传递性。抽象类是单根性(单继承),而接口是多继承;重要的是:抽象类和子类解决的是模块内的问题(代码重用,重写,多态)而接口解决的是模块间的问题。

    四.内部类

     在类内部定义的类为成员内部类,在方法里定义的类为局部内部类,被static修饰的为静态内部类。一个类中可有多个内部类。

    1)内部类主要用于,封装一个类的声明在类的内部,减少类的暴露。
    2)内部类的实例化:实例化时不需要出写对象,非要写的话为:new 外部类名.内部类名();而不是外部类名.new 内部类名()。

    当内部类定义在外部类的成员位置上,而且非私有,则在外部其他类中可以直接建立内部类对象。格式:外部类名.内部类名变量名= 外部类对象.内部类对象;
    Outer.Inner in = new Outer().new Inner();

     1 public class Test01 {
     2     public static void main(String[] args) {
     3         
     4         // 【1】创建外部类对象
     5         Outer outer = new Outer();
     6         // 【2】创建内部类对象
     7         Inner inner = outer.new Inner();
     8         inner.showInfo();
     9     }
    10 }

    3)内部类中可以访问外部类的私有变量

     1 public class Outer {
     2     
     3     private String name = "Outer";
     4     
     5     class Inner{
     6         
     7         public void showInfo() {
     8             System.out.println(name);
     9         }
    10         
    11     }
    12 }

    特殊情况:重名,外部类和内部类的变量同名

     1 public class Outer {
     2     
     3     private String name = "Outer";
     4     
     5     class Inner{
     6         
     7         private String name = "Inner";
     8         
     9         public void showInfo() {
    10             // String name = "show info";
    11             
    12             // 访问外部类的私有成员
    13             System.out.println(this.name);
    14             
    15             // 访问外部类的私有成员
    16             System.out.println(Outer.this.name);
    17             
    18         }
    19     }
    20 }

    注意事项:
      当内部类中定义了静态成员,该内部类必须是static的。
      当外部类中的静态方法访问内部类时,内部类也必须是static的。
    4)内部类想调用外部类的成员,需要使用:外部类名.this.成员,即Outter.this表示外部类的对象。如果写this.成员= =成员,调用的还是内部类的成员(属性或方法)。

  • 相关阅读:
    nginx源码分析:module机制
    Linux源码分析之:malloc、free
    shell格式化字符串
    shell执行字符串中的命令
    docker安装并运行mongo
    docker安装并运行kibana
    docker安装并运行elasticsearch
    docker安装并运行rabbitmq
    docker安装并运行ngnix
    docker安装并运行redis
  • 原文地址:https://www.cnblogs.com/abcdjava/p/10770425.html
Copyright © 2011-2022 走看看