`
taimukang
  • 浏览: 183321 次
  • 性别: 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();
   }
}

各位是否答对了呢?   这就是传说中的SCJP题目,哈哈都是考语法的。 想起偶当年初中时学英语的情景了,老师整天唧唧呱呱分析那些语法个不停。我想大家请自己的初中英语老师来讲core java。SCJP保证可以考满分。


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

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

 

另外,关于构造函数:

子类的实例化过程:子类中所有的构造函数会去访问父类中的空参数构造函数,那是因为每一个子类构造函数中的第一行都有一句隐式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中关于子类覆盖父类的抛出异常问题

    在Java编程语言中,子类覆盖父类的方法时,关于异常处理有特定的规定。这个问题的核心是子类在重写父类方法时抛出异常的规则。通常,我们说子类覆盖父类方法时,抛出的异常不能比父类更"宽泛",这里的"宽泛"指的是...

    Java圆形按钮实例代码,含注释.rar

    要创建圆形按钮,我们需要覆盖`paintComponent()`方法,这是Java组件的绘制方法。我们可以通过继承JButton类并覆写这个方法来实现。在`paintComponent(Graphics g)`中,我们使用Graphics2D对象的`drawOval()`方法...

    Java面试基础

    在Java编程语言中,抽象类和接口是两种主要的抽象数据类型。...以上内容涵盖了抽象类和接口在Java中的定义、使用、区别以及方法重载和覆盖的概念,为Java面试中可能出现的相关问题提供了详细的解释。

    java面向对象精华代码

    Java是一种广泛使用的面向对象编程语言,其面向对象特性是其核心设计...在学习这些代码时,应重点关注如何通过类和对象的定义、继承关系、方法的覆写和多态性来组织和解决问题,以及如何利用Java的其他特性来优化代码。

    Java 编程军规.docx

    - **解释**:当一个对象的equals()方法被覆写后,如果没有同时覆写hashCode()方法,可能会导致该对象在哈希表中的行为不符合预期。 - **实践建议**:确保equals()和hashCode()方法的一致性,以避免潜在的问题。 ###...

    thinking in java

    第7章《多形性》深入讲解了Java的多态性,包括上溯造型的概念、方法绑定、扩展性和覆写。多态性是面向对象编程中的一个重要特性,它允许我们编写更加灵活和可维护的代码。 总之,《Thinking in Java》全面覆盖了...

    Java语言与面向对象程序设计第10讲(继承与多态)

    面向对象程序设计是Java语言的核心特性之一,它包括三个主要原则:封装、继承和多态。在本讲中,我们将深入探讨其中的继承与多态。 首先,回顾面向对象设计中的基本概念。封装是将数据和操作这些数据的方法捆绑在...

    编写高质量的java代码.docx

    这是因为编译器的“最短路径原则”将会选择使用本类中的变量和方法,本类中的属性、方法优先,从而可能会影响代码的可读性和可维护性。 11.养成良好的习惯,显式声明 UID。这是因为显示声明 serialVersionUID 可以...

    Java 全栈知识点问题汇总(11).pdf

    3. 覆写优先原则:子POM中的依赖声明会覆盖父POM中的相同声明。 解决依赖冲突的方法包括运行`mvn dependency:tree`命令,查看依赖树,然后根据以上原则调整POM文件中的依赖顺序。如果需要排除某个特定版本,可以...

    java初级知识

    Java中方法的格式** 方法定义的基本格式如下: ```java public returnType methodName(paramType param1, paramType param2) { // method body } ``` **3. 方法里的属性** - **参数列表**:方法调用时传递的信息...

    一次JAVA面试遇到的题目

    - **抽象方法的设计原则**:抽象方法应该能够被继承的类所覆盖(覆写/重写),因此通常使用 `public` 或 `protected` 来定义抽象方法的访问级别。 #### 题目四:最终变量与方法内的自增操作冲突 **题目描述**: ```...

    java面试笔试题大汇总

    - **方法和实例变量的继承**:子类可以继承父类的方法和实例变量,并可以对其进行覆盖或扩展。 3. **封装**:封装是指将对象的状态和行为结合在一起,对外只暴露有限的接口。这是面向对象编程的一个基本原则,它有...

    Scala程序设计(第2版)

    11.3 覆写抽象方法和具体方法 272 11.4 覆写抽象字段和具体字段 274 11.5 覆写抽象类型 280 11.6 无须区分访问方法和字段:统一访问原则 280 11.7 对象层次结构的线性化算法 282 11.8 本章回顾与下...

    23级面向对象程序设计实训.zip

    在Java等语言中,多态性可以通过方法重写(Override)和接口实现来体现。 4. 抽象:抽象是将现实世界中的复杂问题简化为易于理解和处理的模型。在编程中,抽象通常通过创建抽象类或接口来实现,它们定义了共性的...

    OOSE:面向对象的软件工程单元材料

    在本单元材料中,我们将深入探讨面向对象软件工程的核心概念、原则以及如何在Java编程语言中实现它们。 1. **面向对象的基本概念**: - **类与对象**:面向对象编程的基础是类,它是创建对象的模板。类定义了对象...

    下载进度条demo

    在自定义视图中,开发者通常需要覆写`onDraw()`方法,利用`Canvas`进行图形绘制,包括圆形路径、渐变填充、文字渲染等。此外,还需要通过监听下载任务的进度更新,动态调整视图的显示状态。 对于"可以自定义一些...

    安卓Android源码——三原色圆形时间锁屏.zip

    1. **自定义View**:在Android中,创建一个定制的锁屏界面需要自定义View类,覆盖onDraw()方法,绘制出所需的图形。这可能包括三个颜色的圆环以及时间显示部分。 2. **颜色处理**:三原色的运用涉及到颜色的混合和...

    百度地图毕业设计源码-design-thinking:学习设计模式,及其一些照抄和思考

    覆盖或实现父类的方法时输入参数可以被放大 覆写或实现父类的方法时输出结果可以被缩小 依赖倒置原则 在真实的自然界中我们都是直接依赖各种真实的实现的. 而在程序世界. 我们要依赖接口或者抽象类. 从实现到抽象...

Global site tag (gtag.js) - Google Analytics