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

  • 相关阅读:
    string数组批量转换成Int数组
    TCP/IP 、 HTTP 、HTTPS
    静态布局、自适应布局、流式布局、响应式布局、弹性布局等的概念和区别
    Vue源码学习02 初始化模块init.js
    IOS8白屏
    VUE 源码学习01 源码入口
    http状态码
    vue全家桶(Vue+Vue-router+Vuex+axios)(Vue+webpack项目实战系列之二)
    Vue实战Vue-cli项目构建(Vue+webpack系列之一)
    module.exports,exports,export和export default,import与require区别与联系【原创】
  • 原文地址:https://www.cnblogs.com/happy-rabbit/p/4938931.html
Copyright © 2011-2022 走看看