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

  • 1、多态:

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

 * - - - (2)多态的存在要有3个必要条件:继承、方法重写、父类引用指向子类对象;

 * - - - (3)父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了
 *
 *
 */

public class TestPolm {
    public static void main(String[] args) {
        Animal a = new Animal();
        animalCry(a);
        Dog dog = new Dog();
        animalCry(dog);
        Cat cat = new Cat();
        animalCry(cat);
        Animal cat2 = new Cat();
        animalCry(cat2);
    }

    static void animalCry(Animal a){
        a.shut();
    }
}

class Animal{
    public void shut(){
        System.out.println("叫了一下!");
    }
}

class Dog extends Animal{//继承条件满足
    public void shut(){//方法重写条件满足
        System.out.println("汪汪汪");
    }
}

class Cat extends Animal{//继承条件满足
    public void shut(){//方法重写条件满足
        System.out.println("喵喵喵");
    }
}

/**运行结果:
 * 叫了一下!
 * 汪汪汪
 * 喵喵喵
 * 喵喵喵
 */
 

  • 2、继承使用要点:

    • 父类也称作超类、基类等;
    • java中只有单继承,没有C++那样的多继承。多继承会引起混乱,使得继承过于复杂,系统难于维护;
    • java中类没有多继承,接口有多继承;
    • 子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法);
    • 如果定义一个类时,没有调用extends,则它的父类时:java.lang.Object。
  • 3、instanceof运算符:

    • instanceof是二元运算符,左边是对象,右边是类;当对象时右边类或子类所创建的对象时,返回true;否则,返回false。
public class Test{
    public static void main(String[] args) {
        Student s = new Student();
        System.out.println(s instanceof Person);  //Student 继承自Person
        System.out.println(s instanceof Student);
    }
}

  • 4、向上自动转型,向上强制转型:


public class TestPolm {
    public static void main(String[] args) {

        Animal cat = new Cat();//自动向上转型
        animalCry(cat);

        Cat cat2 = (Cat)cat; //强制向下转型
    }

    static void animalCry(Animal a){
        a.shut();
    }
}

class Animal{
    public void shut(){
        System.out.println("叫了一下!");
    }
}

class Dog extends Animal{//继承条件满足
    public void shut(){//方法重写条件满足
        System.out.println("汪汪汪");
    }
}

class Cat extends Animal{//继承条件满足
    public void shut(){//方法重写条件满足
        System.out.println("喵喵喵");
    }
}

  • 5、父类的普通方法可以被继承和重写,不多作解释,如果子类继承父类,而且子类没有重写父类的方法,但是子类会有从父类继承过来的方法。

    • 静态的方法可以被继承,但是不能重写。 如果父类中有一个静态的方法,子类也有一个与其方法名,参数类型,参数个数都一样的方法,并且也有static关键字修饰,那么该子类的方法会把原来继承过来的父类的方法隐藏,而不是重写。通俗的讲就是父类的方法和子类的方法是两个没有关系的方法,具体调用哪一个方法是看是哪个对象的引用;这种父子类方法也不在存在多态的性质。《Java编程思想》中这样提到“只有普通的方法调用可以是多态的”。下面代码为例:
public class StaticTest
{
    public static void main(String[] args)
    {
        M m = new N();
        m.output();
    }
}  

class M
{
    public static void output()
    {
        System.out.println("M");
    }
}  

class N extends M
{
    public static void output()
    {
        System.out.println("N");
    }
}  

上面执行的结果是“M”,也就是是M类型的引用调用的,如果修改main方法中的代码:

N n = new N();

n.output();

那么执行的结果是“N”,也就是N类型的引用调用的。


  • 6、子类能继承父类的所有成员,使用反射可以看出子类是继承了父类的私有方法的(不管是否是final),只是直接调用父类的私有方法是不可以的,但是利用反射的方式可以调用。字段同理。


  • 7、方法的重写和重载:

  • 重载,简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。

    • (1)方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。
    • (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
    • (3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
  • 在面向对象编程中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。

    • (1)父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某
      方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
    • (2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键 字引用了当前类的父类。
    • (3)子类函数的访问修饰权限不能少于父类的;

      需要重写方法是因为:父类的功能无法满足子类的需求。

方法重写的前提: 必须要存在继承的关系。

方法的重写: 子父类出了同名的函数,这个我们就称作为方法的重写。

什么是时候要使用方法的重写:父类的功能无法满足子类的需求时。

方法重写要注意的事项:

    • 1.方法重写时, 方法名与形参列表必须一致。
    • 2.方法重写时,子类的权限修饰符必须要大于或者等于父类的权限修饰符。
    • 3.方法重写时,子类的返回值类型必须要小于或者 等于父类的返回值类型。
    • 4.方法重写时, 子类抛出的异常类型要小于或者等于父类抛出的异常类型。
      • Exception(最坏)
      • RuntimeException(小坏)

方法的重载:在一个类中 存在两个或者两个 以上的同名函数,称作为方法重载。

方法重载的要求

      1. 函数名要一致。
      1. 形参列表不一致(形参的个数或形参 的类型不一致)
      1. 与返回值类型无关。

  • 8、关于构造方法:

    • 构造方法不能被static、final、synchronized、abstract、native修饰,但可以被public、private、protected修饰;
    • 构造方法不能被继承

原文地址:https://www.cnblogs.com/caoleiCoding/p/8974568.html

时间: 2024-08-13 11:28:11

继承、多态及方法重写、重载的相关文章

类与接口(五)java多态、方法重写、隐藏

一.Java多态性 面向对象的三大特性:封装.继承.多态. 多态的类型,分为以下两种: 编译时多态: 指的是 方法重载.编译时多态是在编译时确定调用处选择那个重载方法,所以也叫 静态多态,算不上真正的多态.所以,一般说的多态都是运行时的多态. 运行时多态: 由于 方法重写,所以想要确定引用变量所调用的方法的入口,必须根据运行时的引用变量所指向的实例对象来确定.从而使得同一个引用变量调用同一个方法,但不同的实例对象表现出不同的行为.再简单点来说,就是在运行时,可以通过指向基类的指针,来调用实现子类

什么是多态、方法重写与重载

什么是多态 多态的概念呢比较简单,就是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果. 如果按照这个概念来定义的话,那么多态应该是一种运行期的状态. 为了实现运行期的多态,或者说是动态绑定,需要满足三个条件. 即有类继承或者接口实现.子类要重写父类的方法.父类的引用指向子类的对象. public class Parent{ public void call(){ sout("im Parent"); } } public class Son extends Parent

C#类的运用,继承,多态,方法重写

using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace ObjTest{ class Program { static void Main(string[] args) { //car a = new car(); //a.name = "bmw"; //a.run(); //car b = new car(); //b.name = "lbjn&

24 继承 子类中方法重写

若父类中有一个方法fun(); 子类中对这个方法进行了重写,为fun(); 则在子类调用fun()方法时,它先看子类中是否有这个方法的重写,然后再调用父类中的方法. 概括为: 自下而上 优先调用子类中的方法,若没有重写则逆流而上调用父类中的方法. 原文地址:https://www.cnblogs.com/CPU-Easy/p/12168062.html

方法重写3之多态

Main.m #import <Foundation/Foundation.h> #import "ColorPrinte.h" #import "Blackprinter.h" #import "ThreeDPrinter.h" #import "Printer.h" #import "Person.h" int main(int argc, const char * argv[]) { /*

(1) 深入理解Java面向对象三大特性 封装 继承 多态

转眼已经工作快6年了,最开始做了2年J2EE:然后整了2年的数据仓库,主要是Cognos的报表开发:现在从事4G LTE核心网的开发,用的语言任然是Java,但写代码的机会不多,基本都是看代码找BUG,偶尔做点new feature也是在比较成熟的框架上复制.粘贴.修改,大部分时间还是在理解业务,钱多.事少.离家近,当时来这家公司图的是后面2点,2年过去了,英文水平有所提升,对敏捷开放也有一定的了解,但技术方面明显退步了或者说没有进步吧,本来以前也不怎么好,因为工作上用不到,自己也没怎么学习,所

面向对象之封装,继承,多态的理解

封装 1.什么是封装 封装(encapsulation)又叫隐藏实现(Hiding the implementation).就是只公开代码单元的对外接口,而隐藏其具体实现. 其实生活中处处都是封装,手机,电脑,电视这些都是封装.你只需要知道如何去操作他们,并不需要知道他们里面是怎么构造的,怎么实现这个功能的. 2.如何实现封装 在程序设计里,封装往往是通过访问控制实现的.C++,Java,AS3中都有 Public, Protected, Private 等访问控制符.通过用Public将信息暴

Java面向对象三大特性 封装 继承 多态

1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类把自己该做的事情封装起来,而不是暴露给其他类去处理,当内部的逻辑发生变化时,外部调用不用因此而修改,他们只调用开放的接口,而不用去关心内部的实现 举例: public class Human { private int age; private String name; public int get

面向对象三大特性:封装,继承,多态(二、多态)

多态 一,多态的概念 多态(polymorphism), 是指一个名字可以有多种语义.在面向对象语言中,多态是指在一棵继承树中的类中可以有多个同名但不同方法体及不同形参的方法.通常有两种途径实现多态:方法的重载和覆盖. 多态性允许以统一的风格处理已存在的变量及相关的类.多态性使得向系统里增加新功能变得容易.继承性和多态性是降低软件复杂性有有效技术. 二,多态的实现 1.方法的重载 方法重载时: 参数必须不同.参数个数不同或类型不同. 返回值可以相同,也可以不同. 重载的价值在于它允许通过使用一个