继承&抽象类&接口

1:继承

      1:继承用关键字extends,子类继承父类所有的方法和变量并可以直接调用

      2:如果子类有重名方法(重写)和变量,那如果调用,优先使用子类自己的

      3:对于变量父类成员变量,子类成员变量,子类局部变量,可以用this.变量和super.变量进行区分

      4:方法的重写,方法名称一样,参数也一样(返回值类型和父亲一样)

        //子类方法的返回值范围必须要小于等于父类的返回值范围

                    为了方便区分,用@Override标注一下

              重载:方法名称一样,参数的个数或者类型或者不同类型的顺序不一样。

      5:子类构造方法的第一行,如果不写,系统默认有一个super(),调用父类的无参构造

      6:如果父类有多个构造,子类可以通过super调用其中任何一个

      7:super必须在子类构造的第一句,仅有一个

      8:同理:子类的构造方法调自己的另一个构造,用this()

          如果子类的一个构造方法,调自己的另一个构造方法的话,那么此构造方法不再赠送super()

示例代码:

public class Fu {

  public String name="fu";

  public int age=45;

  public void outName()

  {

      System.out.println("爸爸的名字:"+name);

  }

    public void outAge()

    {

        System.out.println("爸爸的年龄:"+age);

    }

}

public class Zi extends Fu {

  zi(){

super();

}

    public int age = 15;

    public void outAge() {

        System.out.println("儿子的:" + age);

    }

}


2:抽象类


      1:抽象方法:abstarct修饰,无方法体

      2:抽象类:也是abstract修饰,抽象类不可以直接new对象,有抽象方法的类一定是抽象类

                但是抽象类不一定有抽象方法

      3:子类如果继承抽象类,实现了父类所有的抽象方法,就成了普通类

        如果没有全都实现,子类还是一个抽象类

      4:抽象类一样可以有构造方法,并且如果子类继承的话,super中也会执行



3:接口

接口不能直接使用,必须有一个实现类来实现其所有的抽象方法,如果不全部实现,则实现类为抽象类。

    注意,接口没有静态代码块和构造方法

* 1:接口中的抽象方法,修饰符必须是固定的 public abstract

* 2:由于是固定的public abstarct 可任意一个或者多个省略

* 3:接口中可以包含的内容:

*    java7:变量(常量),抽象方法

            说是变量,其实默认用public static final修饰,修饰符可省略,功能也就是个常量

*    java8:比7多了默认方法和静态方法

*          默认方法可以被实现类直接调用或者是覆盖重写,解决了抽象类升级的问题

*          静态方法只能接口名称调用,不能实现类调用(跟类的静态方法有区别,因为单继承,多接口)

*    java9:比8多了私有方法

*          普通私有:解决多个默认方法之间重复代码问题

*          静态私有:解决多个静态方法之间重复代码问题

*4:实现多个接口:

            如果多个接口中抽象方法重名,只实现一个就行

            如果多个接口中默认方法重名,则必须覆盖重写解决冲突

 * 5:继承父类同同时实现接口:继承优先级高于接口实现

            如果父类和接口的默认方法重名,则优先使用父类的

示例代码(接口定义):

public interface myInterface {

    public abstract void test1();

    public void test2();

    void test3();

    //静态方法

    public static void statest1(){

        System.out.println("接口的静态方法");

    }

    //变量

    public static final int i=10;

    //默认方法 1

    public default void detest1()

    {

        System.out.println("接口的默认方法1");

    }

    //默认方法 2

    public default void detest2()

    {

        System.out.println("接口的默认方法2");

    }

    //私有方法,供默认方法调用,外部不能用,java9及以上才行,本计是8,

    //暂时不能用

//    private void pritest1(){

//        System.out.println("接口的私有方法");

//    }

}

示例代码(实现接口):

public class myClassimplinter implements myInterface {

    @Override

    public void detest2(){

        System.out.println("实现类的覆盖默认方法");

    }

    @Override

    public void test1() {

        System.out.println("test1");

    }

    @Override

    public void test2() {

        System.out.println("test2");

    }

    @Override

    public void test3() {

        System.out.println("test3");

    }

}


你可能感兴趣的:(继承&抽象类&接口)