第七天 继承之方法重写

方法重写又称方法覆盖java中子类可以继承父类中的方法,而不需要重新编写相同的方法.但有时子类并不想原封不动的继承父类的方法而是想做一定的修改,着时候就需要采用方法的重写

方法覆盖的注意事项:

1权限:子类的的权限(访问修饰符)一定要不小于被重新的方法的权限(访问修饰符)

2方法定义:方法名和参数列表必须一样

3返回值:基本数据类型:子类和父类的必须一置

引用数据类型:子类可以与父类相同也可以是父类的子类

4抛出异常:子类抛出的异常不能超过父亲抛出的异常(子类的异常不能大于父类的异常)

5不能被继承就不能被重写

6不能重新final修饰的方法:

将方法或类声明为final主要的目的就是:确保他们不会改变语义.

7静态方法不能被重写.如果子类也有一个与父类同名同参也用static修饰,那么子类就会把继承来的父类方法隐藏而不是重写.简单来说父类和子类的方法是两个方法,                            没有关系,也不存在多态的性质,静态方法是与类相关联的

父类的非静态方法不能被子类覆盖为静态方法,相反的父类的静态也不能覆盖为非静态

重载和重写的对比

重载:

权限修饰符(public private 默认):无关

方法名:重载的两个方法的方法名必须相同

形参列表:

形参类型的顺序不同

形参的个数不同

形参的类型不同

三者至少满足一个

返回值类型:

重载与返回值类型无关

重写:

权限修饰符(public private 默认):

子类方法的权限>=父类的方法的权限

方法名:

子类方法和父类方法必须相同

形参列表:

子类方法和父类方法的形参列表必须相同

返回值类型:

基本类数据类型:

必须相同

引用数据类型:

子类方法的返回值类型和父类方法的返回值类型相同

或者

子类方法的返回值类型是父类方法的返回值类型的子类

关于方法重载的一个原则

Liskov替换原则

核心抽象

为什么要有这个原则

一个功能p1,由父类完成,现在需要增加新的功能p2,继承之后,扩展为p3 这个p3是由p1和p2组成的,子类在完成新功能p2的时候可能使得p1发生故障

        什么是这个原则 

所有引用基类(父类)的地方必须能透明地使用其子类的对象。

简单来说就是对于子类型必须能够替换掉他们的基类型,

再简单点:子类可以扩展父类的功能,但不能改变父类的功能

        4层次含义

  1.            子类可以实现父类的抽象方法,但不能覆盖父类的抽象方法(关键所在)
  2. 当然这个不是硬性的规定而是一个建议,增加新的功能,尽可能不去重载父类的方法,而是尽力添加新的方法
  3. 子类可以增加自己的特有方法
  4. 子类实现父类的方法时,方法的形参不父类更加宽松.
  5. 子类实现父类方法时,方法的返回值比父类更加严格

原文地址:http://blog.51cto.com/10760006/2156124

时间: 2024-08-29 11:20:51

第七天 继承之方法重写的相关文章

php类和命名空间介绍,成员方法和类方法,类的继承与方法重写

1. 类和命名空间的介绍 foo.php: <?php // require_once 'lib.php'; // $h = new Hello(); //类的实例 // $h->sayHello(); //实例访问类的方法s// $d = new Desktop();// $d-> work(); // require_once 'Apple/foo.php';  //foo.php的文件位置 // $h = new \jkxy\Hello(); //foo.php的命名空间,在Hel

【java】Java的继承,方法重写,访问权限

继承 **首先面向对象的三大特性: 1. 封装 2. 继承 3. 多态** 语法 class Subclass extends Superclass{ } 作用 继承的出现提高了代码的复用性. 继承的出现让类与类之间产生了关系,提供了多态的前提. 不要仅为了获取其他类中某个功能而去继承 例子 class Person { String name; int age; } /*继承与Person类*/ class Student extends Person { int weight; } Stud

Python类的继承和方法重写总结

我们都知道类可以继承,通过继承可以实现代码的复用,使代码看起来更加简洁 比如: Class B(A): Pass 定义了一个名为B的类,它继承于A,我们把B叫做A的子类,A叫做B的超类(父类). 方法重写 当子类定义了一个和超类相同名字的方法时,那么子类的这个方法将覆盖超类相同的方法(或称为重写) 先借用两个例子: >>> class Bird: ...     def __init__(self): ...         self.hungry = True ...     def 

22.1 Extends 继承的 方法重写、@Override的使用、

/* * 继承中成员方法的特点 * 子类中没有这个方法,调用父类的 * 子类中重写了这个方法,调用子类的 * 方法的重写:在子父类当中,子类的方法和父类的完全一样,子类重写了父类的方法(覆盖),当子类重写了父类的方法之后,使用子类对象调用的就是子类的方法 方法的重载:在一个类中,有多个重名的方法,但是其参数不一样(参数的个数,参数的类型,参数的顺序),和返回值无关 * 方法重写的应用场景:当父类的方法不能完全满足子类使用,这个时候子类重写父类的方法, * 并可以在方法中使用关键字super调用父

04 Python的继承、方法重写、super()类

继承 A类继承B类,A即可获得B类的全部公共属性和方法.格式如:class A(B): class Animal: def sleep(self): print("zZZ...") def eat(self): print("yamiyami...") def run(self): print("huchihuchi...") class Dog(Animal): #Dog类拥有sleep,eat,run,bark四个方法 def bark(se

继承与方法重写

public class A { public virtual void Fun1(int i) { Console.WriteLine(i); } public void Fun2(A a) { a.Fun1(1); Fun1(5); } } public class B : A { public override void Fun1(int i) { base.Fun1(i + 1); } } class Program { public static void Main() { B b =

Go中匿名字段的方法继承与方法重写

// code_019_struct_anonymous_field_method project main.go package main import ( "fmt" ) type Person struct { name string sex byte age int } func (p *Person) PrintInfo() { fmt.Printf("Person:%s,%c,%d\n", p.name, p.sex, p.age) } type Stu

继承、方法重写小案例

1 package com.kehou.print; 2 3 /** 4 * 父类:打印机类 5 * @author 6 * 7 */ 8 public abstract class Printer { 9 public abstract void print(); 10 } 1 package com.kehou.print; 2 3 /** 4 * 子类:针式打印机类 5 * @author 6 * 7 */ 8 public class DotMatrixPrinter extends P

继承、多态及方法重写、重载

1.多态: 多态指的是同一个方法的调用,由于对象不同可能会有不同的行为.现实生活中,同一个方法,具体实现完全不同. 多态的要点: (1)多态是方法的多态,不是属性的多态(多态与属性无关): (2)多态的存在要有3个必要条件:继承.方法重写.父类引用指向子类对象: (3)父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了. /** * - - - (1)多态是方法的多态,不死属性的多态(多态与属性无关): * - - - (2)多态的存在要有3个必要条件:继承.方法重写.父类