`
Vikings825
  • 浏览: 65173 次
  • 性别: Icon_minigender_1
  • 来自: 威海
文章分类
社区版块
存档分类
最新评论

Java方法覆盖和重载(overload,extends)

阅读更多
1.Java重载
引用
在Java中,同一个类中的两个或者两个以上的方法可以有同一个名字,只要他们的参数声明不同即可,这种方法被称为重载(overload),方法重载是Java实现多态性的一种方式。

1.普通方法重载
当一个重载方法被调用时,Java用参数类型或参数数量来表明实际调用的重载方法的版本。因此每个重载方法的参数或参数数量必须是不同的。虽然每个重载方式可以有不同的返回类型,但返回类型并不足以区分所调用的是哪个方法。
2.当一个重载方法被调用时,Java在调用方法的参数和方法的自变量之间寻找匹配,但是这种匹配并不总是精确的,在一些情况下,Java的自动类型转被也适用于重载方法的自变量。例如:
class OverloadDemo{
  void test(){
    System.out.println("No parameters");
  } 

  void test(int a,int b){
    System.out.println("a and b"+ a + " " + b);
  }
  
  void test(double a){
    System.out.println("Inside test(double) a :" + a);
  }
}

public class Test{
  public static void main(String []args){
    OverloadDemo ob = new OverloadDemo();
    int i = 88;
  ob.test();
   ob.test(10,30);
   ob.test(i);
   ob.test(2.343);
  }  
}


结果自己去运行试试。
3.重载构造函数


2.方法覆盖(extends中的方法)

引用
如果在子类中定义一个方法,其名字,返回类型以及参数正好与父类中的某个方法的名字,返回类型以及参数相匹配,那就是:子类的方法覆盖了父类的方法。


覆盖方式的约束条件:
引用
(1)子类的方法的名称,参数名和返回类型必须与父类方法的名称,参数名和返回类型一致。

以下代码会导致编译错误:
public class Base{
 public void method(){..}
}

public class Sub extends Base{
  public int method(){
  //编译错误,返回类型不一致
   return 0;
  }
}

引用
(2)子类方法不能缩小父类方法的访问权限,

如下错误代码:
 public class Base{
 public void method(){
 }
 }
  public class Sub extends Base{
 private void method(){
 }
}

为什么呢?如果可行的话,将会和Java语言的多态机制发生冲突。

引用
  (3)子类方法不能抛出比父类方法更多的异常。子类方法抛出的异常必须和父类方法抛出的异常相同或只是父类方法抛出的异常类的子类。

为什么呢?自己去想哈!还是跟多态有关系的。
这里面有个非常特别的就是RuntimeException,因为即使没有显示声明抛出异常,在默认情况下,都是可以抛出RuntimeException的。
引用
(4)父类的静态方法不能被子类覆盖为非静态方法。

引用
(5)子类可以定义与父类的静态方法同名的静态方法,已便在子类中隐藏父类的静态方法,在编译时,必须满座与方法覆盖类似的约束:方法的参数名一致,返回类型一致,不能缩小父类的方法的访问权限,不能抛出更多异常。

引用
(6)父类的非静态方法不能被子类覆盖为静态方法。

引用
(7)父类私有方法不能被子类覆盖。

引用
(8)父类抽象方法可以被子类通过两种途径覆盖:一种是子类实现父类的抽象方法;另一种是子类重新声明父类的抽象方法

因为很重要加点实例代码:
public abstract class Base{
 abstract void method1();
 abstract void method2();
}
public abstract class Sub extends Base{
  public void method1(){....}//实现method1方法,并扩大访问权限
  public abstract void method2();//重新声明method2方法,仅仅扩大访问权限,但不实现
}

缩小访问权限是错误的,例如:
public abstract class Base{
 abstract void method1();
 abstract void method2();
}
public abstract class Sub extends Base{
   private void method1(){....}
  private  abstract void method2();
}


(9)父类的非抽象方法可以被覆盖为抽象方法,例如:
public  class Base{
 void method();
}
public abstract class Sub extends Base{
   public abstract void method(){....}
  
}






分享到:
评论

相关推荐

    Java重写(Override)&重载(Overload).pdf

    Java面向对象编程中的重写(override)指的是子类可以重写其父类中的非private方法,使得子类在调用该方法时会使用自己的实现而不是父类的实现。 重写(Override)讲解 定义一个名为 Animal 的父类和一个名为 Cat 的...

    Java重载和重写的区别--源码实例

    // 下面几个方法用来验证可以通过定义不同的参数类型和参数的数目进行方法重载。 public void fun(){ System.out.println("method fun in OverloadTest, no parameter"); } public void fun(float f) { System...

    java基础.txt

    重载overload的特征:在同一个类中同一个方法名,参数列表不同(个数,顺序,类型) this:关键字,对本类对象的引用,可以调用本类的属性和方法 this(); 对本类对象构造的调用,如果有参则调用有参构造 而且...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    对象的使用包括引用对象的成员变量和方法,通过运算符·可以实现对变量的访问和方法的调 用,变量和方法可以通过设定一定的访问权限(见下面的例子)来允许或禁止其它对象对它的 访问。 我们先定义一个类 Point。 例子...

    JAVA面试题最全集

    7.Java多态的实现(继承、重载、覆盖) 8.编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串。 9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。 10.找出下列代码可能...

    java 面试题 总结

    方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数...

    Java面试宝典2020修订版V1.0.1.doc

    13、Overload和Override的区别。 16 14、构造器可不可以被重载或重写? 16 15、Java中有没有多继承? 16 16、抽象类和接口的区别? 17 17、java中实现多态的机制是什么? 17 19、String和StringBuffer的区别?...

    超级有影响力霸气的Java面试题大全文档

     方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和...

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

    Overload [java] 方法的重载(不同参数列表的同名方法) [,әuvә'lәud] Override [java] 方法的覆盖(覆盖父类的方法) [,әuvә'raid] polymiorphism[java] 多态 (polymorphism 多形性[,pɒli'mɒ:fizm]) ...

    安卓java读取网页源码-questions:自问自答

    安卓java读取网页源码 questions 自问自答 待初答 注:认真对待每一个答案。 Java String、StringBuilder ...重写(Override)与重载(Overload)的区别 父类的静态方法能否被子类重写 静态属性和静

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    用在代码块和方法上有什么区别? 80 【多线程】Volatile的理解 82 【*多线程】synchronized底层如何实现的? 82 【多线程】Callable 和 Runnable接口 82 【多线程】Java四种线程池的创建方法 83 【多线程】线程池...

    【04-面向对象(上)】

    •构造器的重载和方法的重载一样,都是方法名相同,形参列表不相同。 •在构造器中可通过this来调用另外一个重载的构造器。 继承的特点 •Java通过关键字extends来实现,实现继承的类称为子类,被继承的...

Global site tag (gtag.js) - Google Analytics