`
ihyperwin
  • 浏览: 425875 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java方法覆盖的原则

 
阅读更多
什么是方法覆盖

如果在子类中定义的一个方法,其名称、返回类型及参数签名正好与父类中某个方法的名称、返回类型及参数签名相匹配,那么可以说,子类的方法覆盖了父类的方法。

覆盖方法必须满足的十大约束

一:子类方法的名称、参数签名和返回类型必须与父类方法的名称、参数签名和返回类型一致


二:子类方法不能缩小父类方法的访问权限


三:子类方法不能抛出比父类方法更多的异常,子类方法抛出的异常必须和父类方法抛出的异常相同,或者子类方法抛出的异常类是父类方法抛出的异常类的子类


四:方法覆盖只存在于子类和父类(包括直接父类和间接父类)之间。在同一个类中方法只能被重载,不能被覆盖。

五:父类的静态方法不能被子类覆盖为非静态方法。
(子类的非静态方法不能覆盖父类的静态方法)


六:子类可以定义与父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法。


子类隐藏父类的静态方法和子类覆盖父类的实例方法,这两者的区别在于:运行时,Java虚拟机把静态方法和所属的类绑定,而把实例方法和所属的实例绑定。
  
看个SCJP题库的经典例子吧,并说说为什么是这样的结果

代码:
class Base {
     void method() {
         System.out.println("method of Base");
     }
     static void staticMethod() {
         System.out.println("static method of Base");
     }
}

class Sub extends Base {
     void method() {
         System.out.println("method of Sub");
     }
     static void staticMethod() {
         System.out.println("static method of Sub");
     }
}

public class Test2 {
     public static void main(String[] args) {
         Base sub1 = new Sub();
         sub1.method();
         sub1.staticMethod();
         Sub sub2 = new Sub();
         sub2.method();
         sub2.staticMethod();
     }
}
答案:
method of Sub
static method of Base
method of Sub
static method of Sub

七:父类的非静态方法不能被子类覆盖为静态方法。
(父类的非静态方法不能被子类的静态方法所覆盖)


八:父类的私有方法不能被子类覆盖。
同第六点一样,再来个经典的SCJP题目

class Base {
private String showMe() {
return "Base";
}

public void print(){
System.out.println(showMe());
showMe();
}
}

public class Sub extends Base {
public String showMe(){
return "Sub";
}
}
   public static void main(String args[]){

   Sub sub=new Sub();

   sub.print();
   }
}



九:父类的抽象方法可以被子类通过两种途径覆盖:一是子类实现父类的抽象方法;二是子类重新声明父类的抽象方法。

十:父类的非抽象方法可以被覆盖为抽象方法。



另外,关于构造函数:

子类的实例化过程:子类中所有的构造函数会去访问父类中的空参数构造函数,那是因为每一个子类构造函数中的第一行都有一句隐式super语句。

构造函数不能继承。
子类的构造函数可以通过super关键字显式调用父类中的构造函数。如果子类中的构造函数没有显式调用父类中的构造函数,编译器就会自动在子类的构造函数中调用父类中参数为空的构造函数。于是,当父类中没有参数为空的构造函数,而子类中又没有显示调用父类的其他构造函数,编译时就会报错。这一点需要特别注意。当父类中没有定义任何构造函数时,编译器就会为它指定一个参数为空的默认的构造函数;如果父类中定义了构造函数,那么编译器就不会为它指定一个参数为空的默认构造函数了。因此,如果某个类有可能成为其他类的父类,为了避免发生不必要的编译错误,最好为它编写一个参数为空的构造函数。

eg1.
父类Sup中没有定义构造函数,编译程序将为它指定一个参数为空的默认构造函数。子类Sub中也没有定义构造函数,编译程序也会为它指定一个参数为空的默认的构造函数,并且会在这个默认的构造函数中调用父类的参数为空的构造函数。
public class Sub extends Sup{
    //子类中没有定义构造函数
    public static void main(String args[]){
        Sub sub=new Sub();
    }
}

class Sup{
    //父类中没有定义构造函数
}


eg2.
父类Sup中没有定义构造函数,编译程序将为它指定一个参数为空的默认构造函数。子类定义了一个带整型参数的构造函数,在这个构造函数中子类没有显式调用父类的构造函数,所以编译器为在它里面调用父类中参数为空的构造函数。

public class Sub extends Sup{
    //子类中定义类一个带整型变量参数的构造函数
    public Sub(int i){
        //
    }
    public static void main(String args[]){
        Sub sub=new Sub(1);
    }
}
class Sup{
    //父类中没有定义构造函数
}
eg3.
父类中定义了一个带整型参数的构造函数,因此编译器不再为它指定参数为空的默认的构造函数。子类中也定义了一个带整型参数的构造函数。编译时,编译器将试图在子类的构造函数中调用父类的参数为空的构造函数,但是父类中没有定义参数为空的构造函数,所以编译程序将会报错。排错的方法时在子类的构造函数中显示调用父类的构造函数,或者在父类中添加一个带空参数的构造函数。

public class Sub extends Sup{
    //子类中定义类一个带整型变量参数的构造函数
    public Sub(int i){
        //
    }
    public static void main(String args[]){
        Sub sub=new Sub(1);
    }
}

class Sup{
    //父类中定义了一个带整型参数的构造函数
    public Sup(int i){
        //
    }
}
 

排错方法1:

public class Sub extends Sup{
    //子类中定义类一个带整型变量参数的构造函数
    public Sub(int i){
        super(i);//调用父类中的构造函数
    }
    public static void main(String args[]){
        Sub sub=new Sub(1);
    }
}

class Sup{
    //父类中定义了一个带整型参数的构造函数
    public Sup(int i){
        //
    }
}
 
排错方法2:

public class Sub extends Sup{
    //子类中定义类一个带整型变量参数的构造函数
    public Sub(int i){
        //
    }
    public static void main(String args[]){
        Sub sub=new Sub(1);
    }
}

class Sup{
    //父类中定义了一个带整型参数的构造函数
    public Sup(int i){
        //
    }
    //定义一个带空参数的构造函数
    public Sup(){
        //
    }
}
分享到:
评论

相关推荐

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    第7章 Java中的方法——给汽车丰富多彩的功能 154 教学视频:2小时55分钟 7.1 方法:让汽车动开动 154 7.1.1 引出问题:开动汽车 154 7.1.2 那么,方法到底是什么呢? 155 7.1.3 方法调用过程初探 156 7.2 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    第7章 Java中的方法——给汽车丰富多彩的功能 154 教学视频:2小时55分钟 7.1 方法:让汽车动开动 154 7.1.1 引出问题:开动汽车 154 7.1.2 那么,方法到底是什么呢? 155 7.1.3 方法调用过程初探 156 7.2 ...

    java jdk实列宝典 光盘源代码

    方法和变量在继承时的覆盖和隐藏;排序类; 3数字 数字类;格式化数字;转换数字进制;生成随机数; 4数组和集合 使用Arrays类;动态调整数组长度;java为数据结构中的列表定义了一个接口类java.util.list同时提供了...

    java学习重点

    多态性 (重载overload,方法名相同、参数的个数不同、参数的类型不同、返回的类型不同和覆盖override) ;多态性就是“一种接口,多种方法”,可以为一组相关的动作设计一个通用的接口,其实类的函数的重载就是一种...

    java八股文.docx "Java八股文"通常指的是一种简单的模板化回答,用于解答关于Java编程语言的基础问题,特别是在面试

    这些问题通常覆盖了Java语言的基本概念、特性、语法以及一些常见的面向对象编程原则。以下是一些常见的Java八股文问题及其答案: 1. **Java的特点是什么?** Java是一种面向对象的编程语言,具有跨平台、简单、...

    Java JDK实例宝典

    6 方法和变量在继承时的覆盖与隐藏 2. 7 排序类 2. 8 Singleton单例模式 2. 9 Factory工厂模式 2. 10 Adapter适配器模式 第3章 数字 3. 1 数字与数字封装类 3. 2 格式化数字 3. 3 ...

    java学习笔记 初学者必读

    7.3.1. 方法的覆盖(overridding) 7-18 7.3.2. 多态的分类 7-18 7.3.3. 运行时多态的三原则 7-19 7.3.4. 关系运算符:instanceof 7-20 7.4. 静态变量,方法和类 7-20 7.5. Singleton模式 7-22 7.6. final关键字 7-...

    corejava培训文档

    7.3.1. 方法的覆盖(overridding) 7.3.2. 多态的分类 7.3.3. 运行时多态的三原则 7.3.4. 关系运算符:instanceof 7.4. 静态变量,方法和类 7.5. Singleton模式 7.6. final关键字 7.6.1. final变量不能被...

    整理后java开发全套达内学习笔记(含练习)

    Override [java] 方法的覆盖(覆盖父类的方法) [,әuvә'raid] polymiorphism[java] 多态 (polymorphism 多形性[,pɒli'mɒ:fizm]) allowing a single object to be seen as having many types. principle n.原则,...

    java基础课程重点笔记.rar

    重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊...

    java 常用设计模式chm

    总之原则是,对于开销很大的对象,只有在使用它时才创建,这个原则可以为我们节省很多宝贵的Java内存. 所以,有些人认为Java耗费资源内存,我以为这和程序编制思路也有一定的关系. 如何使用Proxy? 以Jive论坛系统为例,...

    java大数据-教程.docx

    比如我有十万消费者的信息数据,比如包括性别,年龄,收入,消费等,通过聚类的方法事可以把这些数据分成不同的群,理论上每群用户内都是相似性较高的,就可以覆盖分群用户制定不同的策略 java大数据-教程全文共5页...

    Java高级架构师VIP系统课程,Java EE框架、微服务架构、性能优化、安全性等领域,并通过案例分析和项目实践,帮助学员深入

    课程内容不仅包含了Java EE框架的深入探讨,还广泛覆盖了当前技术市场中极为重要的微服务架构知识,以及如何在实际工作中进行性能优化和确保软件安全性的最佳实践。 通过本课程的学习,学员将能够获得关于高级架构...

    Cruise-Event-Management-System:一个基于Web的项目,为使用Java Servlet Pages和Java使用MVC体系结构方法以及MySQL作为后端的游轮活动协调系统开发,以实现自动化测试的概念和原则

    一个基于Web的项目,它使用Java Servlet Pages和Java使用MVC体系结构方法以及MySQL作为后端,为邮轮活动协调系统开发,以实现自动化测试的概念和原则。 乘客可以报名参加活动。 事件协调员是负责协调特定事件的人员-...

    DesignPattern:java常用的23种设计模式,以及设计原则

    覆盖或者实现父类的方法数输入参数可以被放大 覆盖或者实现父类的方法时返回值类型可以被缩小 依赖倒置:面向接口编程(IOP——Interface-Oriented Programming),广泛引用于测试驱动开发(TDD),使用Mock数据开发...

    practice.in.java:天下武功,唯快不破

    需要用文档和正确的Java语言来解决问题,实现的算法,设计模式,测试方法的反复练习。 要多用文字和图形记录每个问题的解题过程。现在doc中的内容为0,要赶快补上。 练习练习再练习,持续进行日复一日,月复一月。 ...

    软件测试教学文档 java test

     功能测试:用于测试应用系统的功能需求的黑盒测试方法。这类测试应由测试员做,这并不意味着程序员在发布前不必检查他们的代码能否工作(自然他能用于测试的各个阶段)。  系统测试:基于系统整体需求说明书的黑盒...

    javatrainings:Java培训

    面向对象的设计Maven程序员测试(TDD)Java代码质量工具设计模式练习创作设计模式练习结构设计模式练习行为设计模式练习Java平台企业版练习JSR 299(CDI)练习实现EJB Java持久性API练习面向对象设计入门OO编程SOLID...

    corejavaNoteBook

    7.3.1. 方法的覆盖(overridding) 7-18 7.3.2. 多态的分类 7-18 7.3.3. 运行时多态的三原则 7-19 7.3.4. 关系运算符:instanceof 7-20 7.4. 静态变量,方法和类 7-20 7.5. Singleton模式 7-22 7.6. final关键字 7-...

Global site tag (gtag.js) - Google Analytics