写点什么

Java 类与类之间的继承关系,java 算法面试代写

作者:Java高工P7
  • 2021 年 11 月 10 日
  • 本文字数:2255 字

    阅读完需:约 7 分钟

class Bread {


public Bread() {


System.out.println("bread");


}


}? ? Bread bread = new Bread();}?class Bread {? ? ?? ? public Bread() {? ? ? ? System.out.println("bread");? ? }}


输出结果为:


bread


meal


二.你了解继承吗?


=========


继承是所有 OOP 语言不可缺少的部分,在 java 中使用 extends 关键字来表示继承关系。当创建一个类时,总是在继承,如果没有明确指出要继承的类,就总是隐式地从根类 Object 进行继承。比如下面这段代码:


class Person {


public Person() {


}


}


class Man extends Person {


public Man() {


}


}


类 Man 继承于 Person 类,这样一来的话,Person 类称为父类(基类),Man 类称为子类(导出类)。如果两个类存在继承关系,则子类会自动继承父类的方法和变量,在子类中可以调用父类的方法和变量。在 java 中,只允许单继承,也就是说 一个类最多只能显示地继承于一个父类。但是一个类却可以被多个类继承,也就是说一个类可以拥有多个子类。


1.子类继承父类的成员变量


当子类继承了某个类之后,便可以使用父类中的成员变量,但是并不是完全继承父类的所有成员变量。具体的原则如下:


1)能够继承父类的 public 和 protected 成员变量;不能够继承父类的 private 成员变量;


2)对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;


3)对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用 super 关键字来进行引用。


2.子类继承父类的方法


同样地,子类也并不是完全继承父类的所有方法。


1)能够继承父类的 public 和 protected 成员方法;不能够继承父类的 private 成员方法;


2)对于父类的包访问权限成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;


3)对于子类可以继承的父类成员方法,如果在子类中出现了同名称的成员方法,则称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用 super 关键字来进行引用。


注意:隐藏和覆盖是不同的。隐藏是针对成员变量和静态方法的,而覆盖是针对普通方法的。(后面会讲到)


3.构造器


子类是不能够继承父类的构造器,但是要注意的是,如果父类的构造器都是带有参数的,则必须在子类的构造器中显示地通过 super 关键字调用父类的构造器并配以适当的参数列表。如果父类有无参构造器,则在子类的构造器中用 super 关键字调用父类构造器不是必须的,如果没有使用 super 关键字,系统会自动调用父类的无参构造器。看下面这个例子就清楚了:


class Shape {


protected String name;


public Shape(){


name = "shape";


}


public Shape(String name) {


this.name = name;


}


}


class Circle extends Shape {


private double radius;


public Circle() {


radius = 0;


}


public Circle(double radius) {


this.radius = radius;


}


public Circle(double radius,String name) {


this.radius = radius;


this.name = name;


}


}


这样的代码是没有问题的,如果把父类的无参构造器去掉,则下面的代码必然会出错:



改成下面这样就行了:


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9wOS10dC1pcHY2LmJ5dGVpbWcuY29tL2xhcmdlL3BnYy1pbWFnZS9kMDU0Njc5M2M0MTk0MmE4YjMxOTBiNjA4ZDJjNzI1Yg?x-oss-p


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


rocess=image/format,png)


4.super


super 主要有两种用法:


1)super.成员变量/super.成员方法;


2)super(parameter1,parameter2....)


第一种用法主要用来在子类中调用父类的同名成员变量或者方法;第二种主要用在子类的构造器中显示地调用父类的构造器,要注意的是,如果是用在子类构造器中,则必须是子类构造器的第一个语句。


三.常见的面试笔试题


==========


1.下面这段代码的输出结果是什么?


public class Test {


public static void main(String[] args) {


new Circle();


}


}


class Draw {


public Draw(String type) {


System.out.println(type+" draw constructor");


}


}


class Shape {


private Draw draw = new Draw("shape");


public Shape(){


System.out.println("shape constructor");


}


}


class Circle extends Shape {


private Draw draw = new Draw("circle");


public Circle() {


System.out.println("circle constructor");


}


}


shape draw constructor


shape constructor


circle draw constructor


circle constructor


这道题目主要考察的是类继承时构造器的调用顺序和初始化顺序。要记住一点:父类的构造器调用以及初始化过程一定在子类的前面。由于 Circle 类的父类是 Shape 类,所以 Shape 类先进行初始化,然后再执行 Shape 类的构造器。接着才是对子类 Circle 进行初始化,最后执行 Circle 的构造器。


2.下面这段代码的输出结果是什么?


public class Test {


public static void main(String[] args) {


Shape shape = new Circle();


System.out.println(shape.name);


shape.printType();


shape.printName();


}


}


class Shape {


public String name = "shape";


public Shape(){


System.out.println("shape constructor");


}


public void printType() {


System.out.println("this is shape");


}


public static void printName() {


System.out.println("shape");


}


}


class Circle extends Shape {


public String name = "circle";


public Circle() {


System.out.println("circle constructor");


}


public void printType() {


System.out.println("this is circle");


}

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
Java类与类之间的继承关系,java算法面试代写