首页 > 编程语言 >Java——继承(含习题)

Java——继承(含习题)

时间:2024-04-09 19:33:42浏览次数:33  
标签:Java String 继承 子类 习题 父类 方法 public

继承的概念

定义

面向对象的继承,指在由一般类和特殊类形成的“一般-特殊”之间的类结构中,把一般类和所有特殊类都共同具有的属性和操作一次性地在一般类中进行定义,特殊类不再重复定义一般类已经定义的属性和操作,特殊类自动拥有一般类(以及所有更上层的一般类)定义的属性和操作。

** 特殊类的对象拥有一般类的对象的全部属性与操作(除非进行限制),称为特殊类对一般类的继承。**

如果类B继承类A,类B的对象具有类A对象的全部或部分属性和操作,则称被继承的类A为基类、父类或超类,而类B为类A的派生类或子类(见图1)。
在这里插入图片描述
一个类是子类还是父类,与该类所在的类层次有关,一个类既可以是父类也可以是子类。

继承避免了重复描述一般类和特殊类之间的共同特征,同时,继承能清晰表达每个共同特征所适应的概念范围——在一般类中定义的属性和操作适应于这个类本身以及它以下的每层特殊类的全部对象。

特征

(1)继承关系具有传递性。若类C继承类B,类B继承类A,则类C拥有从类B继承的属性与方法,也拥有从类A继承的属性和方法,还能定义新的属性和方法。
(2)继承简化了人们对客观事物的认识和描述,继承树清晰体现类之间的层次结构。
(3)继承提供了软件复用功能。若类B继承类A,那么建立类B时只需要描述与父类(类A)不同的特征(数据成员和结构方法)。这种方式减少代码量和数据的冗余度,大大增加代码的实用性。
(4)继承降低了模块间的接口和界面,大大增强了软件的可维护性。
(5)具有多种继承形式。①多重继承,即理论上一个类可以是多个一般类的特殊类,它可以从多个一般类中继承属性和方法。②单继承,即一个子类只能有唯一的一个父类。Java出于安全性和可靠性考虑,类之间仅支持单继承,通过接口机制实现多重继承。

创建子类

Java语言通过extends关键字实现继承。
【语法格式】继承

class 子类名 extends 父类名{
     //类体
 }

【程序案例1】Student类与Person类的继承关系。

package chapter07;
class Person{
    //1.1数据成员
    private String name;
    private int age;
    //1.2构造方法
    public Person(){    }
    public Person(String name, int age){
       this.name = name;
       this.age = age;
    }
    //1.3省略setter 和getter方法
    //1.4功能方法,获取人的信息
    public String getPerson(){
       return "姓名:" + this.name + ",年龄:" + this.age;
    }
}
class Student extends Person{              //2.Person类的子类Student
     //2.1子类的数据成员
     private String className;
     //2.2子类的构造方法
     public Student(){   }
     public Student(String name, int age , String className){
        super(name, age);
        this.className = className;
     }
     //2.3省略子类的setter和getter方法
     //2.4子类的功能方法
     public String getStudent(){
        return this.getPerson() + ", 班级:" + this.className;
     }
}
public class Demo0701{
  public static void main(String[] args)  {
     Student shk = new Student("沈括", 56 ,"物理实验班");
     System.out.println(shk.getStudent());
     System.out.println(shk.getPerson()); //子类可以直接访问从父类继承的
                                          //public方法
     //子类访问从Person类继承的getName()方法
     System.out.println("姓名:" + shk.getName());
  }
}

子类从父类继承所有非private的数据成员和成员方法作为自己的成员,可以直接访问它们;但子类不能直接访问父类的私有成员,如需访问父类私有数据成员,一般通过setter和getter方法实现。如果定义类时没有使用extends继承父类,默认该类是系统类Object的子类。

方法覆写与属性覆盖

继承机制表示父类与子类之间的关系,父类和子类都包含若干数据成员和成员方法,子类继承父类数据成员和成员方法,子类也能定义特殊的数据成员和成员方法。

方法覆写

继承关系中,如果子类的某个方法与父类的某个方法同名,并且两个同名方法的形参列表相同,则称子类方法覆写父类方法(简称方法覆写)。方法覆写需要满足被子类覆写的方法不能拥有比父类对应方法更严格的访问权限(访问权限关系private<default<public)。如下面代码段,子类B第5行show()方法的访问权限default比父类A第2行show()方法的访问权限严格(小),因此第5行不能覆写第2行的方法,出现编译错误(Cannot reduce the visibility of the inherited method from A)。

class A{
    public void show(int x) {}
}
class B extends A{
    void show( int x ) {}
}

方法覆写之后会有什么后果呢?顾名思义,方法覆写就是子类方法覆盖了父类方法。方法覆写之后,子类对象调用的覆写方法就是子类的方法。

【程序案例2】方法覆写。

package chapter07;
class Person{                                      //父类Person
   public void talk(String msg){
      System.out.println("父类说:" + msg);
      }
}
class Student extends Person{                //Person类的子类Student
   public void talk(String msg){        //覆写父类Person的成员方法talk()
      System.out.println("子类说:" +msg);
   }
   public void show(String info) {       //子类的成员方法
        talk(info);                      //调用子类本身的成员方法
        //this.talk(info);
        super.talk(info);             //调用被子类覆写的父类中的成员方法
   }
}
        
public class Demo0703{
   public static void main (String  args[]){
       Student std = new Student();  //实例化Student对象
       std.talk("勤奋出真知!");      //调用Student对象的方法
       std.show("王选");
   }
}

程序案例2演示了子类Student覆写父类Person的成员方法talk()。第8行覆写了第3行父类Person的成员方法talk(),第12行调用子类本身的成员方法talk(),第14行利用super关键字调用了父类被覆写的talk()方法。程序运行结果如图所示。
在这里插入图片描述

** 方法覆写与方法重载不同:①方法覆写指子类的方法与父类的方法在方法名和形参列表两方面完全一致;方法重载指方法同名,但形参列表不同。②方法覆写发生在继承关系,方法重载发生在类体或者继承关系。**

属性覆盖

继承机制的成员方法之间可能存在覆写关系,而数据成员之间可能存在覆盖关系。属性覆盖指继承关系中子类的数据成员与父类的数据成员同名,且父类的同名数据成员在子类可见(即父类的同名数据成员的访问控制权限符不是private)。

【程序案例3】属性覆盖。

package chapter07;
class A{                                          //父类
   private String msg = "父类A的成员msg";
   public int x =11;
   public void printA(){
      System.out.println("父类A的成员方法!");
   }
}
class B extends A{                             //子类
   private String msg = "子类B的成员msg";    //与父类成员同名,private不能覆盖
   public int x =22;                       //与父类成员同名,覆盖A的数据成员x
   public void show(){
        System.out.println(msg);
        System.out.println("子类B的数据成员 x= "+this.x);
        System.out.println("父类B的数据成员 x= "+super.x);
                         //调用父类的覆盖的数据成员x
   }
}
public class Demo0704{
   public static void main(String[] args){
      B b = new B();
      b.show();                   //调用子类B中的方法
      b.printA();                 //调用从父类A继承的方法
   }
}

程序案例3演示了子类B覆盖父类A的数据成员。第4、11行定义了同名数据成员,并且访问权限都是public(子类可见),因此子类数据成员x覆盖了父类数据成员x。第3、10行定义了同名数据成员msg,但该成员的访问权限为private(子类不可见),因此这两个数据成员之间没有覆盖关系。第14行this.x调用子类数据成员x,第15行使用super.x调用父类数据成员x。程序运行结果如图所示。
在这里插入图片描述

方法覆写与属性覆盖的区别

方法覆写与属性覆盖的区别

习题

编写Computer类,包含CPU、内存、硬盘等属性,getDetails方法用于返回Computer的详细信息
编写PC子类,继承Computer类,添加特有属性【品牌brand】
编写NotePad子类,继承Computer类,添加特有属性【color】
编写Test类,在main方法中创建PC和NotePad对象,分别给对象中特有的属性赋值,以及从Computer类继承的属性赋值,并使用方法并打印输出信息。

作答:

public class Computer {
  private String cpu;
  private int memory;
  private int disk;
  public Computer(String cpu, int memory, int disk){
      this.cpu = cpu;
      this.memory = memory;
      this.disk = disk;
  }
  public String getDetails(){
      return "cpu=" + cpu +"memory=" + memory + "disk=" +disk;
  }

    public String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public int getMemory() {
        return memory;
    }

    public void setMemory(int memory) {
        this.memory = memory;
    }

    public int getDisk() {
        return disk;
    }

    public void setDisk(int disk) {
        this.disk = disk;
    }
}

public class PC extends Computer {
    private String brand;

    public PC(String cpu, int memory, int disk, String brand) {
        super(cpu, memory, disk);
        this.brand =brand;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }
    public void printInfo(){
        System.out.println("PC信息=");
        System.out.println(getDetails() + "brand=" + brand);
    }
}
public class NotePad extends Computer{
    private String color;

    public NotePad(String cpu, int memory, int disk, String color) {
        super(cpu, memory, disk);
        this.color = color;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
    public void printInfo(){
        System.out.println("NotePad信息=");
        System.out.println(getDetails() +"color" + color);
    }
}
public class Test {
    public static void main(String[] args) {
        PC pc = new PC("intel", 16 ,500 ,"IBM");
        pc.printInfo();
        NotePad notePad = new NotePad("AMD",8 ,256, "blue");
        notePad.printInfo();
    }
}

代码结果为
在这里插入图片描述

标签:Java,String,继承,子类,习题,父类,方法,public
From: https://blog.csdn.net/2301_81768120/article/details/137558088

相关文章

  • Java登陆第四十一天——Axios
    Vue推荐使用axios来完成ajax请求。axios中文文档AxiosAxios是一款基于Promise,用于发送HTTP请求和处理HTTP响应的工具库。内部也是使用原生的ajax对象发送HTTP请求。所以,在使用它前需要导入依赖。npminstallaxios提供了一个函数:axios()语法格式如下://查看源码,默认......
  • Java面向对象进阶(二)
    day02——面向对象高级今天我们继续学习面向对象的语法知识,我们今天学习的主要内容是:继承,多态、抽象、接口。学会这些语法知识,可以让我们编写代码更灵活,代码的复用性更高。2.1继承快速入门各位同学,我们继续学习面向对象相关内容。面向对象编程之所以能够能够被广大开发......
  • C++继承之protected继承
    1概述  通过继承机制,可以利用已有的对象类型来定义新对象类型。所定义的新对象类型不仅仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。。2对象访问作用域作用域:publi......
  • 类鸡兔同笼(java)
    【题目】共有50枚硬币,可能包括4种类型:1元,5角,1角,5分。已知总价值为20元。求各种硬币的数量。【代码】publicclassTest12{publicstaticvoidmain(String[]args){//i是1元j是5角k是1角l是5分intsum=0;inti=0,j=0,k=0,l......
  • java 对List<Map<String, Object>>遍历
    在Java中,遍历List<Map<String,Object>>可以通过多种方式来实现。以下是一些常见的方法:使用for-each循环javaList<Map<String,Object>>list=//初始化你的Listfor(Map<String,Object>map:list){for(Map.Entry<String,Object>entry:map.entrySet()){......
  • JAVA 处理目录下及子目录下 图片压缩和图片加水印
    JAVA处理目录下及子目录下图片压缩压缩需要用到其他jar包<dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.14</version></dependency>处理目录下及子目录下图片压缩importnet.coobird.thum......
  • java基础的一小点
    java文件启动的一套流程:.java---通过编译器javac---->.class---经过解释器&JIT--->机器码--->电脑可识别运行 一般而言,不是开发的安个jre就行,但类似于jsp编译就需要jdk的开发工具。JIT(justintime)即使编译器,可对热点代码直接编译。所以说比解释性语言快些、解释和编译型语......
  • java -动态sql语句
    数据库算法双子针、动态规划、二分查找、贪心算法、深度优先搜索、字符串、递归、字典树、排序、链表等元素作用描述if......
  • Java 实例 - 在控制台上随机得到两个数之间的任意整数值(Random随机数)
       在控制台上随机得到4~11之间的任意值,含4和11 1packagecom.guyu.demo;23importjava.util.Random;45/**6*7*2024年4月9日上午10:39:438*@authorGuyu9*10*随机数示例:11*在控制台上随机得到4~11之间的任意......
  • java-validation(数据校验)
    @PostMapping("/register")@SystemLog(BusinessName="注册用户")//启动AOP实现日志记录publicResponseResultregister(@Validated(ValidateType.INSERT.class)@RequestBodyTsUsertsUser){returntsUserService.register(tsUser);......