Java千百问_05面向对象(008)_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());
        //结论一:多态时,当子类覆盖了父类的方法,使用子类覆盖的方法
        //结论二:当子类覆盖父类的实例变量时,父类方法使用的是父类的 实例变量,子类方法使用的是子类的实例变量
    } 

} 

输出结果: 

21 
21

原文地址:http://blog.csdn.net/ooppookid/article/details/51203923

时间: 2025-01-21 03:00:17

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

Java千百问_05面向对象(003)_java中抽象概念如何体现的

点击进入_更多_Java千百问 1.抽象是什么 抽象,和具体对立,定义了事物的性质,事物的性质会随着抽象概念的改变而改变. 2.java中的抽象类是什么 Java中最直接抽象概念的应用就是抽象类和接口,这里我们看一下抽象类. 抽象类和普通类一样,是一个模版.相比普通类,抽象类不具备实例化对象的能力.抽象类也可以定义属性和方法,比之普通类,它还可以定义没有实现的方法,即抽象方法.  通常会用一个具体类(子类)继承抽象类(父类),实现抽象类中的抽象方法.父类包含子类的集合的通用功能,但父类本身过于抽

Java千百问_05面向对象(009)_java的多态性都有什么表现

1.什么是多态 多态是对象具有多种表现形式的能力.  在面向对象语言中,接口的多种不同的实现方式即为多态.  多态性的科学解释:允许你将父对象设置成为一个或更多的他子对象的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作.  通俗的解释,就是一句话:可以把一个子类的对象转换为父类的对象.  在Java中,所有的Java对象是多态的,因为任何对象都可以设置为自己本身的类和Object类(Object是所有类的父类). 了解跟多继承看这里:java类的继承有什么意义 2.如

Java千百问_05面向对象(010)_java中重载和覆盖有什么关系

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

Java千百问_05面向对象(004)_java接口到底是什么

1.什么是接口 接口(interface)不是一个类,它是抽象方法的集合.一个类实现一个接口,从而继承和实现接口的抽象方法.  抽象方法看这里:java中抽象概念如何体现的 接口的特点如下,先看与类类似的特点: 接口的写法和写一个类类似,但它们是两个不同的概念.类描述对象的属性和行为.接口仅仅定义了事物的行为,且不会具体化这个行为. 除非实现接口的是抽象类,不然接口中的所有方法必须在类(实现这个接口的类)中定义且实现. 接口同类一样,可以包含任何数量的方法. 接口同类一样,被写在同一个.java

Java千百问_05面向对象(001)_类、对象到底有什么秘密

1.类.对象的概念是什么 Java是目前应用最为广泛的面向对象特的语言,它具有以下基本概念: 类 对象 方法 抽象化 多态性 继承 封装 我们首先看看类和对象的概念. 类 类是一个模版.是一个可以定义一类具有相同属性.行为的模版.  例如:狗是一个类,它具有四肢.尾巴.头.脊椎等属性,具有吠叫.吃.繁殖等行为. 对象 对象是一个具体实例.根据是一个类的具体实例.  例如:我家对门养的一只狗,具体到了某一只. 2.Java如何定义类 类的定义如下︰ public class Dog{ String

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

1.接口和抽象类有什么区别 在Java语言中,抽象类abstract class和接口interface是抽象定义的两种机制. 正是由于这两种机制的存在,才赋予了Java强大的面向对象能力.抽象类abstract class和接口interface在对于抽象定义方面具有很大的相似性,甚至可以相互替换.因此很多开发者在进行抽象定义时对二者的选择显得比较随意.其实,两者之间还是有很大的区别,对于它们的选择能反映出对问题本质的理解.对设计意图的理解. 了解抽象类看这里:java中抽象概念如何体现的 

Java千百问_05面向对象(011)_引用传递和值传递有什么区别

1.什么是值传递 值传递,是将内存空间中某个存储单元中存放的值,传送给另一个存储单元.(Java中的存储单元并不是物理内存的地址,但具有相关性)  例如: //定义了一个改变参数值的函数 public static void changeValue(int x) {   x = x *2; } public class TestMain{ //调用该函数 int num = 5; System.out.println(num); changeValue(num); System.out.prin

Java千百问_05面向对象(012)_泛型是什么

1.什么是泛型 泛型是Java SE 1.5的新特性,泛型即参数化类型,也就是说所操作的数据类型被指定为一个参数.  这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法.  如何使用泛型方法.泛型类/接口看这里:泛型如何使用  在没有泛型的情况的下,通过对类型Object的引用来实现参数的"任意化","任意化"带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的.  对于强制类型转换错误的情况,编

Java千百问_05面向对象(002)_package和import作用是什么

1.java中package是什么 即包.简单地说,它是分类class(类)与interface(接口)的方式.  在Java开发中,将会写数以百计的类和接口,因此,对它们分类是必须的.  了解更多类看这里:类.对象到底有什么秘密  了解更多接口看这里:接口和抽象类有什么区别 2.java中import有什么用 在java中,编译器是根据包名+类名找到类的,而import语句是告诉编译器找到指定的类.  例如,要求编译器来加载所有目录中java安装/java/io可用的类: import jav