首页 > 编程语言 >Java多态----继承

Java多态----继承

时间:2024-07-30 23:54:10浏览次数:10  
标签:Java name 构造方法 int 子类 多态 class ---- public

一、基本概念

关键字:extends

        在java中,一个类(类A)继承另一个类(类B)是指类A能够直接使用类B的所有非构造方法和所有非私有属性(注意:不是不能使用是不能直接使用),并在类B原有的基础上继续进行扩充和延伸,即关键字extends的含义。通常,我们称类A与类B的关系为继承关系,继承方(类A)被称为子类,被继承方(类B)被称为父类。

二、示例

class A{

//创建一个类A

private int a=0;//私有属性无法继承

public int b=0;

public void setA(){

    System.out.println("公有方法子类可继承");

  }

private void setB(){

    System.out.println("私有方法子类不可继承");

  }

}

class B extends A{

/*创建一个类B继承类A

  此时可视为方法B拥有

  属性b和方法setA()。
*/

}
public class Test{

    public static void main(String[] args){

        B b = new B();

        int a = b.a;//错误,B类无法继承私有属性,因此类中无属性a

        int b = b.b;//正确

        b.setA();//正确

        b/setB();//错误,B类无法继承私有方法,因此类中无方法setB()

    }

}

由上述代码可知,父类的公有成员子类会自动继承,而私有属性子类则无法继承。

三、使用this实现构造方法的相互调用

构造方法是指与在类中与类名相同,无返回类型的方法。一个类中可以含有多个构造方法,可以带有参数,也可以不含参数,在创建对象是自动调用。通过创建对象时传入不同类型或不同数量的值来分别调用相对应的构造方法。

class A{

    private i;

    private j;

    public A(){

        this.i = 0;
        this.j = 0;
    
        //无参构造方法,后用方法A_null表示
        ...
    }

    public A(int i){

        this.i = i

        this.j = 0;

        //有参构造方法,后用方法A_has表示
        ...
    }

    public A(int i,int j){

        this.i = i;

        this.j = j;

        //有参构造方法,后用方法A_have表示
        ...
    }

}
public class Test{
    
    int a = 0;

    int b = 0;

    A a1 = new A();//此时很明显,A()即上面的A_null方法,即默认构造方法

    A a2 = new A(a)//此时为A(int i),即A_has方法

    A a3 = new A(a,b)//此时为A(int i,int j),即A_have方法

}

    上述对象a1,a2,a3创建之时,将自动调用相对应的构造方法

    可以看到,每当我们需要新增一个私有属性时,也许都需要新增一个构造方法

    并且在每个构造方法中都需要对该属性进行初始化或赋值
      
    但可以注意到,每个构造方法似乎都在做相同的事(此时可以将初始化也看做赋值,则所有构造方法其实都在进行赋值操作,只是赋的值可能不同)。含有最多参数的那个构造方法其实做了以上所有构造方法做的事情,如果有办法能够使除它以外的构造方法都能够调用它,统一由它来做这件事,会省很多时间,也提高了代码的可读性。

this关键字能够实现这个操作。

在构造方法中,this关键字能够实现构造方法之间的相互调用。

于是上述代码可修改为:

class A{

    private i;

    private j;

    public A(){

        this(0,0);//此时会调用A(int i,int j)构造方法
    
        //无参构造方法,后用方法A_null表示
        ...
    }

    public A(int i){

        this(i,0);//同上

        //有参构造方法,后用方法A_has表示
        ...
    }

    public A(int i,int j){

        this.i = i;

        this.j = j;

        //有参构造方法,后用方法A_have表示
        ...
    }
    
}

此时无论是带参或是不带参的构造方法,具体工作全部由A_have方法实现。

需要注意的是,在使用this关键字调用其他构造方法时,需要将它放到当前构造方法的第一句。

错误的示例:

class A{

    private a=0;

    public A(){

        a=0;

        this(0);//this语句不在第一行,错误

    }

    ......

}

四、super关键字

我们已经知道,子类会继承父类的非私有成员,那么当子类继承了父类的A()方法,而子类在父类的基础上又有所拓展,此时当你想再通过子类对象调用A()方法时,需要你重新将父类A()方法再次在子类实现一次,否则系统不会再调用父类的A()方法。

class A{

    public void test(){

        int i=1;


        int j=2;

    }

}

class B extends A{

    public void test(){//父类方法的重写

        //此时我们希望在父类test()方法的基础上输出i+j,则需要重新写一遍


        int i=1;
        
        int j=1;

        System.out.println(i+j);

    }

}

super关键字可以在子类中调用父类的某个方法,例如该题,可以在子类中使用super.test();

来调用父类方法:

class A{

    public void test(){

        int i=1;


        int j=2;

    }

}

class B extends A{

    public void test(){//父类方法的重写

        super.test();

        System.out.println(i+j);

    }

}

或是在子类的构造方法中使用“super()”来调用父类的构造方法。

五、例题

定义父类Animals,子类Cat、Dog。其中共有成员需要name与age,并且在两个子类中分别实现

其特殊方法catch()和look(),通过主方法打印出来。

import java.util.Scanner;

class Animals{
    private String name;
    private int age;
    public Animals(){
        name=" ";
        age=0;
    }
    public Animals(String name,int age){
        this.name=name;
        this.age=age;
    }
    public void setName(String name){
        this.name=name;
    }
    public String getName(){
        return name;
    }
    public void setAge(int age){
        this.age=age;
    }
    public int getAge(){
        return age;
    }
}
class Cat extends Animals{
    public Cat(){
        super();
    }
    public Cat(String name,int age){
        super(name, age);
    }
    public void catchs(){
        System.out.println("抓老鼠");
    }
}
class Dog extends Animals{
    public Dog(){
        super();
    }
    public Dog(String name,int age){
        super(name, age);
    }
    public void look(){
        System.out.println("看门");
    }
}
public class Extend_2{
    public static void main(String[] args) {
        Cat c=new Cat();
        Dog d=new Dog();
        c.setName("小猫");
        d.setName("小狗");
        c.setAge(1);
        d.setAge(2);
        System.out.println("Name is "+c.getName()+",Age is "+c.getAge());
        c.catchs();
        System.out.println("Name is "+d.getName()+",Age is "+d.getAge());
        d.look();
    }
}

运行结果:

Name is 小猫,Age is 1
抓老鼠
Name is 小狗,Age is 2
看门

标签:Java,name,构造方法,int,子类,多态,class,----,public
From: https://blog.csdn.net/weixin_74787572/article/details/140619347

相关文章

  • 10个append()函数在Python程序开发中的创新应用
    文末赠免费精品编程资料~~在Python编程的世界里,append()函数是列表操作中最常见的方法之一。它允许我们在列表的末尾添加一个元素,这一简单的功能却能激发无限的创造力。今天,我们将探讨append()函数在Python程序开发中的10种创新应用,从基本用法到高级技巧,逐步深入。1.构......
  • 【运筹学】怎样更好地理解和应用单纯形法(温习、深刻反思、详细整理)
    1对单纯形法的理解    假设线性规划问题存在可行域;1.1预备知识点    (1)线性规划问题的标准化【运筹学】线性规划问题的标准化及其意义(针对单纯形法)        (2)线性规划问题的可行域是凸集;    (3)如果一个线性规划问题存在唯一最优解,那么最优......
  • 【3DOF关节式(RRR)机械臂设计与运动学】3DOF关节式(RRR)机械臂的设计及其正向与逆向运
      ......
  • Java多态----重写
    一、重写与重载    在学习重写之前,我们需要将它和重载进行区分:方法的重载,发生在同一个类中,方法名相同,参数列表不同,返回值无关。可参考上一篇文章中一个类中不同的构造方法,其也属于重载。详情可见于Java多态----继承-CSDN博客-------------------------------------......
  • [vue3] Vue3源码阅读笔记 reactivity - collectionHandlers
    源码位置:https://github.com/vuejs/core/blob/main/packages/reactivity/src/collectionHandlers.ts这个文件主要用于处理Set、Map、WeakSet、WeakMap类型的拦截。拦截是为了什么?为什么要处理这些方法?Vue3实现响应式的思路是使用ProxyAPI在getter中收集依赖,在setter触发更新......
  • ysyx:测试永远不够
    尽管指令匹配的部分早就已经完成,但这并不代表代码方面就不会再检测出漏洞。cpu-test这个测试集文件夹里面的测试代码只是覆盖了一部分内容,即使是全部通过,你的代码也仍有可能是错误的。当我在处理其他内容时,突然间nemu就卡在了代码某处提示地址错误。重新打开difftest,定位......
  • Spring源码(八)--Spring实例化的策略
    Spring实例化的策略有几种,可以看一下InstantiationStrategy相关的类。UML结构图InstantiationStrategy的实现类有SimpleInstantiationStrategy。CglibSubclassingInstantiationStrategy又继承了SimpleInstantiationStrategy。InstantiationStrategyInstantiationStrat......
  • POSIX-shell学习笔记
    学习POSIXshell建议使用dash,因为它很快:https://unix.stackexchange.com/a/148098mandash:OnlyfeaturesdesignatedbyPOSIX,plusafewBerkeleyextensions,arebeingincorporatedintothisshell.条件判断mandash,然后搜索testexpression,可以看到完整的列表。ife......
  • 关于new、delete函数的错误处理(std::nothrow)
    new、delete函数源码注释如下:无参数无参数的new、delete函数,如果调用失败,会抛出bad_alloc异常,需要使用try{}catch(){}语句捕获异常从而进行异常处理。#include<iostream>intmain(){try{while(1){int*p=newint[100000000ul];......
  • Laconic Private Set-Intersection From Pairings (2022)
    LaconicPrivateSet-IntersectionFromPairings(2022)论文地址:https://eprint.iacr.org/2022/529.pdf代码地址:https://github.com/relic-toolkit/relic/tree/main/demo/psi-client-server代码运行参考:RELIC库学习Laconic算法介绍Laconic适用于算力和存储受限的客户端......