首页 > 其他分享 >Day14 多态知识点综合

Day14 多态知识点综合

时间:2023-12-04 17:59:20浏览次数:33  
标签:知识点 多态 System Day14 call println Man 重写 out

1.方法重写的定义

重载(overload)是在同一个类中的具有多个相同方法名,参数列表不同(的方法(返回类型可以不同),构造方法、普通方法、抽象方法都可以重载;重写(override)是在子类继承父类的时候重写,可以用@Override检查是否是重写方法,方法重载是一个类的多态性的表现,而方法重写是子类与父类的一种多态性表现。重载是编译时的多态性,重写是运行时的多态性

重写满足以下规则:(外壳不变,核心重写)

  • 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)
  • 重写方法的参数列表相同
  • 重写方法的函数名相同
  • 被重写方法的访问修饰符不能是private,重写的方法可以范围可以扩大 public > protected > default > private,但是不能缩小
  • 被重写方法不能有修饰符 final
  • 声明为 static 的方法不能被重写,但是能够被再次声明
  • 抛出的异常范围可以被缩小,但不能被扩大
  • 构造方法不能被重写

2.方法的重写后调用(父类引用和子类引用接受子类new的对象)

class Person {
    protected String name="Person name";
    protected static String staticName="Person staticName";

    public String getName() {
        System.out.println("function call of Person");
        return name;
    }

    public static String showName() {
        System.out.println("static function call of Person");
        return staticName;
    }
}

 class Man extends Person {
    protected String name="Man name";
    protected static String staticName="Man staticName";

    public static String showName(){
        System.out.println("static function call of Man");
        return staticName;
    }

    @Override
    public String getName() {
        System.out.println("function call of Man");
        return name;
    }
}

2.1 static方法重写

public static void main(String[] args) {
        Person person= new Man();
        Man man = new Man();
        //静态
        System.out.println("person call:");
        System.out.println(person.showName());
    	//编译器警告不要通过实例调用类的静态方法
        System.out.println("man call:");
        System.out.println(man.showName());
}
/*输出
person call:
static function call of Person
Person staticName
man call:
static function call of Man
Man staticName
*/

2.2 非static方法重写

public static void main(String[] args) {
        Person person= new Man();
        Man man = new Man();
        //非静态
        System.out.println("person call:");
        System.out.println(person.getName());
        System.out.println("man call:");
        System.out.println(man.getName());
 }
/*输出:
person call:
function call of Man
Man name
man call:
function call of Man
Man name
*/

2.3 总结

子类引用父类引用 接受 new 出来的 子类对象 时:

  • 重写静态方法的调用取决于引用类型。因为引用直接调用的是类的方法,所以静态方法重写由引用类型决定
  • 重写非静态方法时取决于构造函数。因为引用类型指向地址实际上是由构造函数决定的。实际上,可以根据多态特性来理解,c++有指针所以没用 virtual 时指向各自引用类型的函数。由于java没有指针,所以跳过了这一步,直接实现多态,也就是父类指针也可以指向子类对象,根据实际的构造函数调用对应的子类对象的方法。

3.多态

  • 多态是方法的多态,属性没有多态性

3.1 instance of 操作符

格式:[左值] instanceof [右值]

  • 左值与右值之间需要有直系的继承关系(一条继承路线上)才可以使用,否则编译器直接报错
  • 左值可以是父类的指针,返回结果取决于左值指向的具体类,即new出来的对象类型。
  • 实际上比较是左值 new 实例类型是否是右值的实例。其中子类是父类的实例,返回true
// Object是Person的父类,Person是Man和 Woman 的父类
Man man=new man();
System.out.println(man instanceof Man);//true
System.out.println(man instanceof Person);//true
System.out.println(man instanceof Object);//true
System.out.println(man instanceof Woman);//编译器直接报错!
System.out.println(man instanceof String);//编译器直接报错!

Pertson person =new man();
System.out.println(person instanceof Man);//true
System.out.println(person instanceof Person);//true
System.out.println(person instanceof Object);//true
System.out.println(person instanceof Woman);//编译器直接报错!
System.out.println(person instanceof String);//编译器直接报错!

4.类型转换

  • 强制类型转换一般用于父类引用调用子类中其独有的方法。

  • 因为父类比子类更高级,低转高可以直接使用,所以父类引用可以直接接受子类的引用。

  • 高转低需要直接强制类型转换。父类引用调用子类中其独有的方法需要先把高的父类强制转换成子类。

标签:知识点,多态,System,Day14,call,println,Man,重写,out
From: https://www.cnblogs.com/wendao101/p/17875550.html

相关文章

  • Day13 继承知识点综合
    1.继承java只有单继承关键字:extendsclassA{}//父类classBextendsclassA{}//子类B继承了A类2.继承权限相较于C++的public,protected,private,java对不写继承的default的定义不一样:c++default=privateJava不写则默认是default,是一个新的权限,所以Java有......
  • Day09 方法知识点综合(求值策略与可变参数)
    1.求值策略编程语言中方法之间进行参数传递时有个传递策略,该策略就被称为求值策略(Evaluationstrategies)。求值策略分为两大基本类型,如果按照如何处理传递给方法的实际参数,分为严格的和非严格的两种求值策略。1.1严格求值策略传值调用(Callbyvalue)将实参复制一份给形参......
  • 四. 多态性和虚函数
    文章参考:《C++面向对象程序设计》✍千处细节、万字总结(建议收藏)_白鳯的博客-CSDN博客1.多态性概述所谓多态性,就是不同对象接收不同消息时,产生不同的动作。这样就可以用相同的接口访问不同的函数,从而实现一个接口,多种方法。从实现方式上看,多态性分为两种:编译时多态:在C++......
  • 实验5 继承和多态
    实验任务三pets.hpp#pragmaonce#include<iostream>#include<string>usingnamespacestd;classMachinePets{protected:stringnickname;public:MachinePets(conststrings):nickname(s){};public:virtualstringtalk()=0;s......
  • 实验五 继承和多态
    实验任务1publisher.hpp#pragmaonce#include<iostream>#include<string>usingstd::cout;usingstd::string;usingstd::endl;classpublisher{public:publisher(conststring&s="");public:virtualvoi......
  • 实验5 继承和多态
    实验任务31#include<iostream>2#include<string>3usingnamespacestd;4classMachinePets5{6private:7stringnickname;8public:9MachinePets(conststrings):nickname{s}{}10stringget_nickname()const{return......
  • 实验五 继承和多态
    task3machinepets.hpp#include<iostream>#include<string>usingnamespacestd;classMachinePets{public:MachinePets(conststrings);MachinePets();stringget_nickname()const;public:virtualstringtalk(......
  • 实验5 继承和多态
    实验任务1源代码:#pragmaonce#include<iostream>#include<string>usingstd::cout;usingstd::endl;usingstd::string;//发行/出版物类:Publisher(抽象类)classPublisher{public:Publisher(conststring&s="");//构造函数......
  • Odoo_控制器(controller)常用知识点
    1.路由的定义@http.route(['/report/<converter>/<reportname>','/report/<converter>/<reportname>/<docids>',],type='http',auth='user',website=True)defreport_routes(......
  • 实验五 继承和多态
    Task3:pets.hpp:#include<iostream>#include<string>usingnamespacestd;classMachinePets{public:MachinePets(conststrings):nickname(s){}conststringget_nickname(){returnnickname;}virtualstringta......