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


相关文章
|
6天前
|
Java
Java面向对象实践小结(含面试题)(下)
Java面向对象实践小结(含面试题)(下)
18 1
|
5天前
|
存储 Java 开发工具
【Java探索之旅】用面向对象的思维构建程序世界
【Java探索之旅】用面向对象的思维构建程序世界
9 0
|
5天前
|
Java
java使用面向对象实现图书管理系统
java使用面向对象实现图书管理系统
|
5天前
|
Java
Java语言---面向对象的三大特征之继承
Java语言---面向对象的三大特征之继承
|
5天前
|
机器学习/深度学习 Java Python
Java面向对象知识体系---基础版
Java面向对象知识体系---基础版
|
6天前
|
安全 Java 编译器
Java面向对象思想以及原理以及内存图解(下)
Java面向对象思想以及原理以及内存图解(下)
16 0
|
6天前
|
Java
Java面向对象思想以及原理以及内存图解(上)
Java面向对象思想以及原理以及内存图解
17 0
|
6天前
|
设计模式 Java
Java面向对象实践小结(含面试题)(上)
Java面向对象实践小结(含面试题)
13 1
|
10天前
|
安全 Java
Java基础&面向对象&继承&抽象类
Java基础&面向对象&继承&抽象类
|
10天前
|
Java
【Java基础】详解面向对象特性(诸如继承、重载、重写等等)
【Java基础】详解面向对象特性(诸如继承、重载、重写等等)
12 0