Java千百问_05面向对象(008)_java中覆盖是什么

点击进入_很多其它_Java千百问

1、什么是覆盖

在java中,覆盖是针对继承才有的概念,某一个子类须要某些方法或属性,但又不想使用父类中的同名的方法或属性,就须要使用覆盖。

直白的来说,就是在子类中编写与父类同名、同參数、同返回值的方法,或同名、同类型的属性。子类对象调用该方法/属性时。运行的是子类的方法。而不会运行父类的方法(除非在方法第一行写super();会先运行父类方法。再继续运行子类代码。

了解类的构造函数看这里:类、对象究竟有什么秘密

了解很多其它继承看这里:java类的继承有什么意义

2、构造函数怎样覆盖

了解类的构造函数看这里:类、对象究竟有什么秘密

当子类继承一个父类时,构造子类时须要调用父类的构造函数,存在三种情况

  1. 父类无构造函数或者一个无參数构造函数时。子类若无构造函数或者有无參数构造函数。子类构造函数中不须要显式调用父类的构造函数,系统会自己主动在调用子类构造函数前调用父类的构造函数。
  2. 父类仅仅有有參数构造函数时。

    子类在构造方法中必须要显示调用父类的构造函数,否则编译出错。

  3. 父类既有无參数构造函数,也有有參构造函数。

    子类能够不在构造方法中调用父类的构造函数,这时使用的是父类的无參数构造函数。

3、方法怎样覆盖

  1. 子类覆盖父类的方法,必须有相同的參数和返回类型。
  2. 子类覆盖父类的方法,在jdk1.5后。參数、返回类型能够是父类方法返回类的子类。
  3. 子类覆盖父类的方法,能够改动方法的修饰符。但仅仅能把方法的作用域放大。而不能把public改动为private。

    了解很多其它java修饰符看这里:public、privite、protected有什么差别

  4. 子类方法能够訪问父类的protected属性。但不能够訪问默认的属性。
  5. 子类的静态方法。与父类同名静态方法互不影响。因为静态方法使用类名调用,使用子类类名调用子类的方法。使用父类类名调用父类的方法。

  6. 多态时,当子类覆盖了父类的方法,使用子类覆盖的方法。

    了解什么是多态:[java的多态性都有什么表现][6]

    [6]:

4、属性怎样覆盖

  1. 当子类覆盖父类的实例变量时。父类方法使用的是父类的实例变量,子类方法使用的是子类的实例变量。
  2. 子类或父类使用实例变量时,都相当于在前面加了一个this指针(this.)。

了解很多其它java变量看这里:局部变量、类变量、实例变量有什么差别

5、实例

class SuperClass {
    private int number; 

    public SuperClass() {
        this.number = 0;
    } 

    public SuperClass(int number) {
        this.number = number;
    } 

    public int getNumber() {
        number++;
        return number;
    }
} 

class SubClass1 extends SuperClass {
    public SubClass1(int number) {
        super(number);
    } 

} 

class SubClass2 extends SuperClass {
    private int number; 

    public SubClass2(int number) {
        super(number);
    } 

} 

public class SubClass extends SuperClass { 

    private int number; 

    public SubClass(int number) {
        super(number);
    } 

    public int getNumber() {
        number++;
        return number;
    } 

    public static void main(String[] args) {
        SuperClass s = new SubClass(20);
        SuperClass s1 = new SubClass1(20);
        SuperClass s2 = new SubClass2(20);
        System.out.println(s.getNumber());
        System.out.println(s1.getNumber());
        System.out.println(s2.getNumber());
        //结论一:多态时,当子类覆盖了父类的方法。使用子类覆盖的方法
        //结论二:当子类覆盖父类的实例变量时,父类方法使用的是父类的 实例变量。子类方法使用的是子类的实例变量
    } 

} 

输出结果:

1

21

21

时间: 2024-10-05 07:04:00

Java千百问_05面向对象(008)_java中覆盖是什么的相关文章

Java千百问_05面向对象(005)_接口和抽象类有什么差别

点击进入_很多其它_Java千百问 1.接口和抽象类有什么差别 在Java语言中.抽象类abstract class和接口interface是抽象定义的两种机制. 正是因为这两种机制的存在,才赋予了Java强大的面向对象能力.抽象类abstract class和接口interface在对于抽象定义方面具有非常大的类似性.甚至能够相互替换.因此非常多开发人员在进行抽象定义时对二者的选择显得比較任意.事实上,两者之间还是有非常大的差别.对于它们的选择能反映出对问题本质的理解.对设计意图的理解. 了解

Java千百问_05面向对象(006)_is-a,has-a,like-a是什么

点击进入_很多其它_Java千百问 1.is-a,has-a,like-a是什么 在面向对象设计的领域里,有若干种设计思路,主要有例如以下三种: is-a.has-a.like-a java中在类.接口.抽象类中有非常多体现. 了解java看这里:什么是Java 了解类和对象看这里:类.对象究竟有什么秘密 了解接口和抽象类看这里:接口和抽象类有什么差别 2.is-a是什么 is-a.顾名思义,是一个.代表继承关系. 假设A is-a B,那么B就是A的父类. 一个类全然包括还有一个类的全部属性及

Java千百问_05面向对象(014)_如何获取范型的类Class

点击进入_更多_Java千百问 1.如何获取范型的类Class java中,无法获取范型的类型,例如: public class Box<T> { public static void main(String[] args) { System.out.printf(T);//编译错误 } } 其实,由于java是强类型语言,在编译时我们并不知道T是什么具体类型,只有在编译后,不同场景指定之后才会知道,所以在编译前是无法获取T的类型.如果想获取T的类型,可以在泛型类中声明一个对象,通过对象获取当

Java技术_Java千百问(0038)_java中重载和覆盖有什么关系

点击进入_更多_Java千百问 1.什么是重载 java的重载,简单说,就是方法有同样的名称,但是参数不相同.这样的同名不同参数的方法之间,互相称之为重载方法. 需要注意的是: 1. 方法名相同. 2. 参数不同,这里是说对应位置的参数类型至少有一个不同,当然List和List都是List,算作相同. 3. 返回值可以不同,可以相同. 例子: "` public class Test{ public void a() { System.out.println("a()");

Java千百问_04异常处理(008)_java中常见的错误有哪些

点击进入_更多_Java千百问 java中常见的错误有哪些 想了解异常看这里:什么是java中的异常 常见的运行时异常看这里:常见的Java异常有哪些(运行时) 常见的非运行时异常看这里:常见的java异常有哪些(非运行时) java中除了异常Exception之外,还有一大类错误,即ERROR,我们常见的ERROR如下: 1.java.lang.Error 错误.是所有错误的基类,用于标识严重的程序运行问题.这些问题通常描述一些不应被应用程序捕获的反常情况. 原因: 对系统所访问外部资源,未执

Java千百问_07JVM架构(008)_java垃圾回收机制是什么

点击进入_更多_Java千百问 1.如何判断垃圾对象 垃圾收集的第一步就是先需要算法来标记哪些是垃圾,然后再对垃圾进行处理.通常的编程语言都会用以下算法之一进行判断: 引用计数(ReferenceCounting)算法 这种方法比较简单直观,核心思路是,给每个对象添加一个被引用计数器,被引用时+1,引用失效-1,等于0时就表示该对象没有被引用,可以被回收. FlashPlayer/Python使用该算法,简单高效.但是,Java/C#并不采用该算法,因为该算法没有解决对象相互引用的问题,即:当两

Java千百问_08JDK详解(001)_java核心框架是什么样的

点击进入_更多_Java千百问 1.java核心框架是什么样的 我们知道,我们所说的java包含jdk.jre.jvm等(jdk包含jre,jre包含jvm),下面是一个Java SE的模型图(本文部分摘自Oracle官方文档,非常权威): 了解jdk.jre.jvm看这里:什么是Java 了解Java SE看这里:Java都有那些版本 2.jdk都包含哪些组件 jdk主要包含Java Language语言(语法).Tools(编译器.调试器等).Jre等,具体如下: Java Language

Java千百问_02基本使用(015)_java如何通过汇编方式运行

点击进入_更多_Java千百问-基本使用 1.java如何通过汇编方式运行 java本身不能通过汇编方式运行.但是,我们可以通过某些插件,在运行中将java代码解释为汇编指令,让我们能够通过分析执行的汇编指令来查找一些问题,也可以帮助我们分析和理解JVM是如何解释和编译的(当然java本身的编译和运行和汇编无关). PrintAssembly是JVM的一个运行参数,它允许我们获取在控制台打印java代码翻译成的汇编指令.使用PrintAssembly需要一些插件的支持,这些并不是JVM直接提供的

Java千百问_01基本概念(002)_Java都有那些版本

点击进入_更多_Java千百问 1.Java都有那些版本 Java最初由sun公司出品,2009年被orcale公司(即甲骨文)收购,它的版本体系分为两个纬度,纵向和横向. 纵向的版本即为我们常说的Jdk版本,通过近20年的时间,从1996年正式发布1.0版本,发展到2014年的8.0版本. 横向的版本即为我们所说的Java体系,从Java 2.0开始有所区分. 2.什么是Java体系 Java SE(J2SE,Java2 Platform Standard Edition,标准版) Java