首页 > 编程语言 >Java官方笔记6继承

Java官方笔记6继承

时间:2023-06-02 23:45:06浏览次数:53  
标签:Java String 子类 void 笔记 class 官方 父类 public

继承

Java只有单继承,最顶级的父类是Object。

子类会继承父类的fields和methods,而不会继承constructors,因为constructors不属于methods,但是子类可以通过super调用父类的constructor。

子类继承父类的范围是:public、protected、package-private

隐式转换,子类转父类(只有1个爸爸):

Object obj = new MountainBike();

显示转换,父类转子类(有多个子女,所以要明确指定):

MountainBike myBike = (MountainBike)obj;

类有field,而接口没有,所以在多继承时就有问题:如果多个类有相同的field,那么子类将不知道用哪一个,而接口不存在这个问题。Java不支持继承多个类,但是可以实现多个接口。

重载

子类的方法跟父类有完全相同的签名和返回类型(也可以是子类),将会覆盖父类方法Override

如果子类定义了1个static方法,跟父类完全相同,那么父类方法会被隐藏Hide

Override和Hide是不同的:

public class Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Animal");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Animal");
    }
}
public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Cat");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;  // 隐式转换
        Animal.testClassMethod();  // 调的父类
        myAnimal.testInstanceMethod();  // 父类对象引用,还是调的子类
    }
}
The static method in Animal
The instance method in Cat

Override只会调子类方法,而Hide取决于调用方是父还是子,比如这里的myCat,隐式转换为父类Animal后,会调父类的static方法,而调的实例方法却是子类的。(如果不是隐式转换,而是直接给父类实例化,那肯定还是调父类方法)

类instance方法优先于接口default方法:

public class Horse {
    public String identifyMyself() {
        return "I am a horse.";
    }
}

public interface Flyer {
    default public String identifyMyself() {
        return "I am able to fly.";
    }
}

public interface Mythical {
    default public String identifyMyself() {
        return "I am a mythical creature.";
    }
}

public class Pegasus extends Horse implements Flyer, Mythical {
    public static void main(String... args) {
        Pegasus myApp = new Pegasus();
        System.out.println(myApp.identifyMyself());
    }
}

输出为I am a horse.

Override的优先:

public interface Animal {
    default public String identifyMyself() {
        return "I am an animal.";
    }
}

public interface EggLayer extends Animal {
    default public String identifyMyself() {
        return "I am able to lay eggs.";
    }
}

public interface FireBreather extends Animal { }

public class Dragon implements EggLayer, FireBreather {
    public static void main (String... args) {
        Dragon myApp = new Dragon();
        System.out.println(myApp.identifyMyself());
    }
}

输出为I am able to lay eggs

如果实现多接口,有同名的,需要显示指定调用方:

public interface OperateCar {
    // ...
    default public int startEngine(EncryptedKey key) {
        // Implementation
    }
}

public interface FlyCar {
    // ...
    default public int startEngine(EncryptedKey key) {
        // Implementation
    }
}
public class FlyingCar implements OperateCar, FlyCar {
    // ...
    public int startEngine(EncryptedKey key) {
        FlyCar.super.startEngine(key);  // 显示指定,并且使用super
        OperateCar.super.startEngine(key);  
    }
}

总结下,如果子类方法签名+return跟父类方法一样,有以下4种情况:

注意compile-time error,static方法不能和instance方法一样,因为它们是不同级别的。

多态

MountainBike和RoadBike都继承Bicycle,虽然都有printDescription,但它们有多样的形态:

public class MountainBike extends Bicycle {
    private String suspension;

    public MountainBike(
               int startCadence,
               int startSpeed,
               int startGear,
               String suspensionType){
        super(startCadence,
              startSpeed,
              startGear);
        this.setSuspension(suspensionType);
    }

    public String getSuspension(){
      return this.suspension;
    }

    public void setSuspension(String suspensionType) {
        this.suspension = suspensionType;
    }

    public void printDescription() {
        super.printDescription();
        System.out.println("The " + "MountainBike has a" +
            getSuspension() + " suspension.");
    }
} 
public class RoadBike extends Bicycle{
    // In millimeters (mm)
    private int tireWidth;

    public RoadBike(int startCadence,
                    int startSpeed,
                    int startGear,
                    int newTireWidth){
        super(startCadence,
              startSpeed,
              startGear);
        this.setTireWidth(newTireWidth);
    }

    public int getTireWidth(){
      return this.tireWidth;
    }

    public void setTireWidth(int newTireWidth){
        this.tireWidth = newTireWidth;
    }

    public void printDescription(){
        super.printDescription();
        System.out.println("The RoadBike" + " has " + getTireWidth() +
            " MM tires.");
    }
}

所谓的虚拟方法调用,名字很高大上,其实质就是,子类重载了父类方法,在调用子类实例方法时,先调子类实现:

注意,子类的field如果和父类的一样,那么父类的field会被hide,即使type不一样。如果要使用父类的field,需要关键字super。同名fileld是不好的设计,应该尽量避免。

super关键字

public class Superclass {

    public void printMethod() {
        System.out.println("Printed in Superclass.");
    }
}
public class Subclass extends Superclass {

    // overrides printMethod in Superclass
    public void printMethod() {
        super.printMethod();
        System.out.println("Printed in Subclass");
    }
    public static void main(String[] args) {
        Subclass s = new Subclass();
        s.printMethod();    
    }
}

在子类constructor中,如果没有显式super,那么会调用默认的super()

Object

Java中的所有类,都终极继承了Object。(继承链的顶端)

toString()

System.out.println(firstBook.toString());

equals()

public class Book {
    String ISBN;
    
    public String getISBN() { 
        return ISBN;
    }
    
    public boolean equals(Object obj) {
        if (obj instanceof Book)
            return ISBN.equals((Book)obj.getISBN()); 
        else
            return false;
    }
}

hashCode()

如果两个对象相等,那么它们的hashCode一定相等。重写equals(),必须重写hashCode()

getClass()

void printClassName(Object obj) {
    System.out.println("The object's" + " class is " +
        obj.getClass().getSimpleName());
}

clone()

aCloneableObject.clone();

finalize()

垃圾回收时调用。它的调用时机是不确定的,不要使用它来做逻辑。

抽象

abstract class,抽象类,不能被实例化,但是可以继承。

abstract void moveTo(double deltaX, double deltaY);

如果抽象类有method,那么也必须是abstract:

public abstract class GraphicObject {
   // declare fields
   // declare nonabstract methods
   abstract void draw();
}

子类必须抽象类的所有方法,否则子类也必须是abstract。

抽象类:(not static、final) field,(public、protected、private) method

接口:public static final field,public method

Java中,抽象类的例子是AbstractMap、接口的例子是HashMap实现的Serializable, Cloneable, and Map<K, V>接口。

image-20230602232643026

如果类没有实现接口中的所有方法,可以定义为abstract,然后由子类来实现剩余的全部方法:

abstract class X implements Y {
  // implements all but one method of Y
}

class XX extends X {
  // implements the remaining method in Y
}

X没有实现全部方法,所以是abstract,子类XX实现剩余全部方法。

参考资料:

Inheritance https://dev.java/learn/inheritance/

标签:Java,String,子类,void,笔记,class,官方,父类,public
From: https://www.cnblogs.com/df888/p/17453136.html

相关文章

  • 基于JAVA的springboot篮球论坛系统,附源码+数据库+论文+PPT
    1、项目介绍考虑到实际生活中在篮球论坛方面的需要以及对该系统认真的分析,将系统权限按管理员和用户这两类涉及用户划分。(a)管理员;管理员使用本系统涉到的功能主要有:首页、个人中心、用户管理、篮球论坛、系统管理等功能。管理员用例图如图3-1所示。(b)用户;用户使用本系统......
  • vuepress快速安装笔记
    参考https://vuepress.vuejs.org/guide/getting-started.html#prerequisiteshttps://blog.llyth.cn/1065.html注意:应该是cd到新建项目文件夹的docs里,然后yarninstall。在项目文件夹里,执行yarndev启动运行项目,yarnbuild生产静态文件,结果与文件路径如下。waitRenderings......
  • 学习笔记——VMWare的使用和Windows的安装
    2023-06-02一、VMware介绍1.1 VMware即虚拟机软件,用于模拟计算机(虚拟机/客户机)实体机(是实实在在的计算机)(1)特点①多启动系统一个时刻只能运行一个系统,切换时必须重启。②虚拟PC软件一台机器上同时运行多个系统二、在虚拟机中安装操作系统2.1安装前的准备工作(1)准备安装......
  • Java Native Interface Programming
    http://journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/index.html JavaNativeInterfaceProgramming TheJDK1.1supportstheJavaNativeInterface(JNI).Ononehand,theJNIdefinesastandardnamingandcallingconventionsothattheJa......
  • Java的可见性和原子性
    1.工作内存和主内存2.可见性和共享变量3.约束4.共享变量可见性的原理4.1可见性的步骤4.2保证可见性的必要条件synchronized实现可见性5.1synchronized实现的内容5.2JMM关于synchronized的规定5.3synchronized互斥代码的过程6volatile实现可见性6.1重排序6.2asifseri......
  • 构建服务器集群感知的 Java 应用程序
    ApacheZooKeeper和LinkedInProjectNorbert在分布式企业Java应用程序中简化服务器组协调服务器集群对于高度可扩展的Java企业级应用程序开发已司空见惯,但是应用程序级别的服务器集群感知目前并不属于JavaEE的一部分。在本文中,MukulGupta和PareshPaladiya向您介......
  • Google Java编程风格指南
    作者:Hawstein目录前言源文件基础源文件结构格式命名约定编程实践Javadoc后记前言这份文档是GoogleJava编程风格规范的完整定义。当且仅当一个Java源文件符合此文档中的规则,我们才认为它符合Google的Java编程风格。与其它的编程风格指南一样,这里所讨论的不仅仅是编码格......
  • Java编译与反编译
    Java编译与反编译什么是编译利用编译程序从源语言编写的源程序产生目标程序的过程。用编译程序产生目标程序的动作。编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2进制的。编译程序把一个源程序翻译成目标程序的工作过程......
  • 40基于java的美食菜谱分享系统设计与实现
    本章节给大家带来一个基于java的美食菜谱分享系统设计与实现,餐饮分享平台设计与实现,可用于美食在线分享平台,作为世界各地爱好美食的人们的桥梁,为其创造一个氛围好的平台,促进美食世界的文化交流。该系统是一个供商家或者个人推荐美食的网站,网站不支持交易仅供分享。引言在21世......
  • [Javascript] Microtasks exec order
    button.addEventListener('click',(event)=>{console.log('listener1')queueMicrotask(()=>{console.log('microtask')})})button.addEventListener('click&#......