java重写

最近重新温习Java基础知识,查漏补缺;Java重写:Java重写只是存在在父子类之间的概念,子类只能重写父类的 非private和非final方法;对于不想让子类重写的发放可以将方法用private或者final来修饰;如果父类想让子类重写的方法可以用 protected方法来修饰;

1.发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法)

2.子类抛出的异常下不能超过父类相应方法抛出的异常(子类异常不能大于父类异常)

3.子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)

4.子类方法的返回值必须是父类方法返回值的子类或者和父类一样。

注意: 1.方法重写 ,子类的方法必须和父类要重写的方法 方法名,参数列表,返回值一样;否则就不是重写;如果子类的一个方法和父类的用private修饰的方法一样,则也不是重写,而是属于子类自己的全新的方法,和重写没有关系;如下代码中的wolf的getAge()是全新方法相对于屏蔽的父类中的private getAge()方法;

public class ClassExtends {
    public static void main(String[] args) {
        Animal w = new Wolf();
        try {
            w.getAge();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class Animal{
    private String name;
    private int age;
    public Animal(String name){
        System.out.print("Animal 带一个参数的构造函数:动物名字叫:"+name+",");
    }
    public Animal(String name,int age){
        this(name);
        System.out.println("今年:"+age+"岁了!");
    }
//    private void getAge(){
//        System.out.println("My age is 6!");
//    }
    public Object getAge() throws IOException{
        getAge();    return null;
    }
}

class Wolf extends Animal{
    public Wolf() {
        super("灰太狼",6);
        System.out.println("Wolf 的无参构造函数!");
    }  @Override
    public String getAge()throws Exception{
        System.out.println("My age is "+2);     return null;
    }
}

2.子类方法的访问级别不能低于父类相应方法的访问级别:如果Wolf中的 getAge()为private, Animal中的getAge()为public,ClassExtends 类这个类编译的时候不会有什么问题,但是运行时,根据多态运行机制 w.getAge()调用的是 Wolf的getAge()方法,但是这个方法为private ,虚拟机访问不到,所以会报错(编译时Wolf类的getAge()方法会报错)

3.子类方法的返回值必须是父类方法返回值的子类或者和父类一样:如 Wolf的 getAge() 返回String类型,Animal的getAge()返回Object类型,这个也是子类重写父类方法

4.最好不要在父类构造函数中调用要被重写的方法;因为当类加载的时候,总是先加载父类,如果运行时类型是子类对象,在父类构造函数中调用了被重写的方法,则该方法其实运行的是子类重写后的方法,这个方法可能会用到子类的成员变量,而这时子类的成员变量还没有初始化,可能会 引起空指针;

时间: 2024-08-29 11:52:04

java重写的相关文章

java重写和重载

Java 重写(Override)与重载(Overload) 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类能够根据需要实现父类的方法. 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常.例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Except

JAVA重写不需要@override

一,如下代码, package com.boot.enable.bootenable; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.concurrent.TimeUnit; @Component("RunnableDemo") public class RunnableDemo imple

Java重写(Override)与重载(Overload)

重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写,,返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为.也就是说子类能够根据需要实现父类的方法. 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常.例如:父类的一个方法申明了一个检查异常IOException,但是在重写这个方法的时候不能抛出Exception异常,因为Exception是IOException的父类,只能抛出IOException的子类

java重写equals方法(重点讲解)

为什么equals()方法要重写? 判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象.这样我们往往需要重写equals()方法. 我们向一个没有重复对象的集合中添加元素时,集合中存放的往往是对象,我们需要先判断集合中是否存在已知对象,这样就必须重写equals方法. 怎样重写equals()方法? 重写equals方法的要求: 1.自反性:对于任何非空引用x,x.equals(x)应该返回tru

Java重写方法与初始化的隐患(转)

原文出处: Shawon 虽然文章标题是Java, 但几乎所有面向对象设计的语言都遵守这个初始化流程, 感谢廖祜秋liaohuqiu_秋百万指出, 之前忘记提这个了. 前言 drakeet写了个和RecyclerView相关的GenerousRecyclerView, 原文提到了写这个的目的. 因为需要知道ViewGroup的clipToPadding属性, 所以调用了ViewGroup.getClipToPadding, 但这个方法是API level 21引入的. 我看了一下代码, View

Java:重写equals()和hashCode()

以下内容总结自<Effective Java>. 1.何时需要重写equals() 当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念). 2.设计equals() [1]使用instanceof操作符检查“实参是否为正确的类型”. [2]对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域值. [2.1]对于非float和double类型的原语类型域,使用==比较: [2.2]对于对象引用域,递归调用equals方法: [2.3]对于float域,使用Float.float

Java 重写 equals 与 hashCode 的注意事项

为什么重写 equals 的时候必须重写 hashCode 大家可能从很多教程中了解到: SUN官方的文档中规定"如果重定义equals方法,就必须重定义hashCode方法,以便用户可以将对象插入到散列(哈希)表中" 那么 SUN 公司是出于什么考虑做了这个规定呢? 在集合框架中的HashSet,HashTable和HashMap都使用哈希表的形式存储数据,而hashCode计算出来的哈希码便是它们的身份证.哈希码的存在便可以: 快速定位对象,提高哈希表集合的性能. 只有当哈希表中对

java 重写的学习

本文全文转自:http://www.cnblogs.com/happyframework/p/3332243.html,非常感谢 Java中的重写规则比较灵活,具体如下: 除了 private 修饰之外的所有实例方法都可以重写,不需要显式的声明. 重写的方法为了显式的表达重写这一概念,使用 @Override进行注解. 重写的方法可以修改访问修饰符和返回类型,只要和父类的方法兼容(访问级别更高,返回类型更具体). 可以使用final将某个方法标记为不可重写. 在构造方法中使用 super(xxx

Java重写equals方法和hashCode方法

package com.ddy; public class User {     private Integer id; private String name; private String address; private String phone; public Integer getId() {         return id;     } public void setId(Integer id) {         this.id = id;     } public Strin