多态

java之多态(一)

不问归期 提交于 2019-12-30 05:34:44
一、Java 中实现多态的机制是什么? 靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动 态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变 量的类型中定义的方法。 多态是继封装、继承之后,面向对象的第三大特性。现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态。 Java作为面向对象的语言,同样可以描述一个事物的多种形态。如Student类继承了Person类,一个Student的对象便既是Student,又是Person。一个Student对象既可以赋值给一个Student类型的引用,也可以赋值给一个Person类型的引用。 最终多态体现为父类引用变量可以指向子类对象:父类类型 变量名 = new 子类类型(); 1、多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。 2、在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。 二、多态的三种形式: 1、 普通类多态定义的格式 父类 变量名 = new 子类(); class Fu {} class Zi extends Fu {} //类的多态使用 Fu f = new Zi(); 2、 抽象类多态定义的格式 abstract class Fu {

java多态

 ̄綄美尐妖づ 提交于 2019-12-30 05:34:30
多态的概述 多态是继封装、继承之后,面向对象的第三大特性。 最终多态体现为父类引用变量可以指向子类对象。 多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。 在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。 多态的定义与使用格式 多态的定义格式 :就是父类的引用变量指向子类对象 父类类型 变量名 = new 子类类型(); 变量名.方法名(); l 普通类多态定义的格式 父类 变量名 = new 子类(); 如: class Fu {} class Zi extends Fu {} //类的多态使用 Fu f = new Zi(); 抽象类多态 接口多态 多态-成员的特点 l 多态成员变量 当子父类中出现同名的成员变量时,多态调用该变量时: 编译时期:参考的是引用型变量所属的类中是否有被调用的成员变量。没有,编译失败。 运行时期:也是调用引用型变量所属的类中的成员变量。 简单记:编译和运行都参考等号的左边。编译运行看右边。 l 多态成员方法 编译时期:参考引用变量所属的类,如果类中没有调用的方法,编译失败。 运行时期:参考引用变量所指的对象所属的类,并运行对象所属类中的成员方法。 简而言之:编译看左边,运行看右边。 instanceof关键字 我们可以通过instanceof关键字来判断某个对象是否属于某种数据类型。如学生的对象属于学生类

java学习笔记之面向对象多态

一个人想着一个人 提交于 2019-12-30 05:33:45
面向对象三大特性之多态 一.多态的概念   多态是继封装,继承之后,面向对象的三大特性。   现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的张三同学既是学生也是人,即出现两种形态。   java作为面向对象的语言,同样可以描述一个事物的多种形态,java中多态的代码体现在一个子类对象(实现类对象)既可以给这个子类(实现类对象)引用变量赋值,又可以给这个子类(实现类对象)的父类(接口) 变量赋值。    父类的引用变量指向子类对象。 多态的前提需要有继承关系或者是实现关系,否则没法完成多态。在使用多态后的父类引用变量调用方法时,会调用子类重写的; 二.多态的定义与使用   多态的定义格式:就是父类的引用变量指向子类的对象;     父类类型变量名 = new 子类对象();     变量名.方法名();   1.普通类的多态定义格式:     父类类型变量名 = new 子类(); 1 public class Fu {} 1 public class Zi extends Fu{} 1 //多态使用 2 Fu f= new Zi();   2.抽象类多态的定义:   抽象类变量名 =new 抽象类子类(); //抽象类 public abstract class Fu{ public abstract void method(); } //子类 public

JAVA多态

£可爱£侵袭症+ 提交于 2019-12-30 05:33:02
一、 多态是继封装、继承之后,面向对象的第三大特性。现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态。 Java作为面向对象的语言,同样可以描述一个事物的多种形态。如Student类继承了Person类,一个Student的对象便既是Student,又是Person。一个Student对象既可以赋值给一个Student类型的引用,也可以赋值给一个Person类型的引用。 最终多态体现为父类引用变量可以指向子类对象:父类类型 变量名 = new 子类类型(); 1、多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。 2、在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。 二、 多态的三种形式: 1、 普通类多态定义的格式 父类 变量名 = new 子类(); class Fu {} class Zi extends Fu {} //类的多态使用 Fu f = new Zi(); 2、 抽象类多态定义的格式 abstract class Fu { public abstract void method(); } class Zi extends Fu { public void method(){ System.out.println(“重写父类抽象方法”); } } //类的多态使用 Fu fu=

Java语言抽象与多态的总结

杀马特。学长 韩版系。学妹 提交于 2019-12-30 05:31:34
一、抽象   1、抽象的相关概念     如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类.(如形状是抽象的类,园、三角形是具体类)     用 abstract 修饰的类就是抽象类。如果某个类中包含有抽象方法,那么该类就必须定义成抽象类。但是抽象类中不一定有抽象方法。   2、抽象类的定义     使用关键字 abstract 定义抽象类,语法     【访问权限】 abstract class 类名{         成员列表     }     如:public abstract class Shape{         public abstract void draw();       }       public abstract class Shape{         public void draw(){          //具体代码         }       }   3、抽象类的相关特性     用 abstract 修饰的类就是抽象类。类中包含有抽象方法,该类为抽象类;     抽象类可以有成员和非抽象的成员方法;     抽象类不能被实例化,但可以有构造方法(函数),只能用来继承;     抽象类只能用作基类,表示的是一种继承关系;     继承抽象的非抽象类 必须实现其中的所有抽象方法 已 实现的方法的参数

Day11Super和多态

て烟熏妆下的殇ゞ 提交于 2019-12-29 20:42:51
Super和多态 第一节:方法的重写: 产生继承关系后,父类的方法无法满足子类需求时,子类可以定义和父类完全相同的方法,来满足自己的功能 称之为方法的覆盖(override) 方法覆盖的语法: class Student { String name ; String sex ; public void study ( ) { } } //产生继承关系后,xxx类继承过来一个方法study class xxx extends Student { //父类的study方法无法满足需求,子类要进行重写 public void study ( ) { //逻辑代码 } } 方法重写的要求: 1. 返回值类型、方法名称、参数列表要与父类完全相同 2. 方法访问权限修饰符要么和父类相同,要么比父类更宽泛( private -- > default -- > protected -- > public ) 方法覆盖的执行流程: 当子类覆盖父类方法后,调用时优先执行子类覆盖后的方法 注意事项: 当子类继承父类的方法后,在子类当中隐式存在,当要进行编写相同方法的时候,一定要注意:如果参数列表不同,则实现的方法的重载。如果完全相同,则实现的是方法的重写。 面试题: 1.方法的重载和重写的区别 1.1.语法不同 1.2.场景不同 第二节:super关键字 场景:当子类和父类拥有重名的属性或方法时

java 继承、重载、重写与多态

若如初见. 提交于 2019-12-29 07:50:21
首先是java 继承、重载和重写的概念    继承:     继承的作用在于代码的复用。由于继承意味着父类的所有方法亦可在子类中使用,所以发给父类的消息亦可发给衍生类。如果Person类中有一个eat方法,那么Student类中也会有这个方法,这意味着Student对象也是Person的一种类型。     继承可以基于已经存在的类构造一个新类。继承已经存在的类就可以复用这些类的方法和域。在此基础上,可以添加新的方法和域,从而扩充了类的功能。    方法重载 :     java允许在一个类中,多个方法拥有相同的名字,但在名字相同的同时,必须有不同的参数,这就是重载。     编译时编译器会根据实际情况挑选出正确的方法,如果编译器找不到匹配的参数或者找出多个可能的匹配就会产生编译时错误,这个过程被称为重载的解析          重载规则:       (一)再使用方法重载的时候,必须通过方法中不同的参数列表来实现方法的重载。如:方法的参数个数不同或者方法的参数类型不同。       (二)不能通过访问权限,返回值类型和抛出的异常来实现重载       (三)方法的异常类型和抛出异常的数目不会影响方法的重载,也就是说重载的方法中允许抛出不同的异常       (四)可以有不同的返回值类型,只要方法的参数列表不同即可       (五)可以有不同的访问修饰符    方法重写:     

重载与重写、多态——java

不问归期 提交于 2019-12-29 07:50:04
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现, 重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。 (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。 (2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。 (3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。 当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被重写的方法。 要想调用父类中被重写的方法,则必须使用关键字 super 。 例如: public Salary(String name, String address, int number, double salary) { super(name, address, number); setSalary(salary); }    多态存在的三个必要条件 继承 重写 父类引用指向子类对象 比如: Parent p =newChild(); 当使用多态方式调用方法时 , 首先检查父类中是否有该方法,如果没有,则编译错误 ;如果 有,再去调用子类的同名方法 。 例子解析 实例中,实例化了两个 Salary

深入类和对象

自作多情 提交于 2019-12-28 15:08:51
Python高级编程技巧 序言 鸭子类型与多态 isinstance与type的区别 类变量与对象变量 Python对象的自省机制 super函数 序言 前面的文章已经和大家一起学完了Python的基础知识,从本章文章之后会继续和大家一起学习Python高级编程技巧,感谢大家的支持! 鸭子类型与多态 多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚"鸭子类型" **动态语言调用实例方法时不检查类型,只要方法存在,参数正确,就可以调用。**这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。 所谓多态 : 定义时的类型和运行时的类型不一样 , 此时就成为多态 。 抽象基类(abc模块) 抽象基类(abstract base class,ABC):抽象基类就是类里定义了纯虚成员函数的类。纯虚函数只提供了接口,并没有具体实现。 抽象基类不能被实例化(不能创建对象),通常是作为基类供子类继承,子类中重写虚函数 ,实现具体的接口。 抽象基类就是定义各种方法而不做具体实现的类,任何继承自抽象基类的类必须实现这些方法,否则无法实例化。 应用场景 1.判断某个对象的类型; 2.我们需要强制某个子类必须实现某些方法。 isinstance与type的区别 如果我们需要查看某个变量的类型时

继承与多态之汽车租赁系统

那年仲夏 提交于 2019-12-28 13:46:39
1.租车 显示系统中所有可出租的汽车,选中要出租的汽车,输入租用人以出租汽车,如图所示 2.还车 在还车列表中选择汽车信息,输入出租天数,计算租金,如图所示 3.新车入库 需要录入汽车的车牌号,车型,颜色,使用时间,和每日租金,如果是卡车还要录入卡车的载重,如图所示 具体实现过程:   1.搭建系统   按照类图创建类,体会Vehicle,Trech和Car三个类之间的关系 Car类:      namespace _09汽车租赁系统 { public class Car:Vehicle { public Car(string licenseNO, string name, string color, int yearsOfService, double dailyRent) : base(licenseNO, name, color, yearsOfService, dailyRent) { ; } public override double CalcPrice() { double totalPrice = 0; double basicPrice = this.RentDate * this.DailyRent; if (this.RentDate <= 30) { totalPrice = basicPrice; } else { totalPrice =