面向对象 多态的理解

/**
* 面向对象的特征:多态性的使用
*
* 1.多态性:可以理解为一个事物的多种形态。
*
* 2.广义上多态性的体现:
* ①方法的重载 和 方法的重写
* ②子类对象的多态性
*
* 3.狭义上多态性的体现:子类对象的多态性
*
* 4.子类对象的多态性:父类的引用指向子类的对象。(子类的对象赋给父类的引用
*
* 5.多态的应用场景:虚拟方法调用:编译时,认为调用的方法是父类的,但是当运行时,实际执行的是子类重写父类的方法
*
* 说明:多态中方法的调用:编译看左边,运行看右边!
*
* 6.多态性,只适用于方法!
*
* 7.多态性使用的前提:①类的继承关系 ②方法的重写
*
* @author shkstart 邮箱:[email protected]
* @version 创建时间:2017年7月26日 上午9:44:59
*
*/
public class PersonTest {
public static void main(String[] args) {

Person p1 = new Person();
p1.eat();
p1.walk();

Man m1 = new Man();
m1.eat();
m1.walk();
m1.earnMoney();

System.out.println("**************************");
Person p2 = new Man();//子类对象的多态性。
//多态的应用场景:
//虚拟方法调用:编译时,认为调用的方法是父类的,但是当运行时,实际执行的是子类重写父类的方法
p2.eat();
p2.walk();
//不能通过父类的引用调用子类特的方法
// p2.earnMoney();
//总结:多态中方法的调用:编译看左边,运行看右边!

//总结:属性,不存在多态性的!声明的引用的类型是什么,调用的就是相应类中的属性
System.out.println(p2.id);//1001

System.out.println("**************************");

Person p3 = new Woman();
p3.eat();
p3.walk();

// p3.goShopping();

System.out.println("**************************");
//由于子类对象赋给了父类的引用,导致我们在编译时,只能调用父类中声明的结构:属性和方法。
//但是,我们在内存结构中,又确实存在子类特的属性和方法。那么,我们考虑如何才能调用子类所特的属性、方法。
//向下转型的使用:强制类型转换! 强转符:()
Woman w1 = (Woman)p3;
w1.goShopping();
System.out.println(w1.isBeauty);

//注意:使用强制类型转换符,可能出现ClassCastException的异常。
// Woman w2 = (Woman)p2;
// w2.goShopping();

/*
* instanceof的使用:
*
* a instanceof A : 判断对象a是否是类A的实例。如果a是类A的实例,返回true。否则,返回false.
*
*
* 如果 a instanceof A 返回true,则 a instanceof AA 返回也是true.
* 其中,AA是A的父类。
*/

if(p3 instanceof Woman){
System.out.println("****1********");
Woman w3 = (Woman)p3;
w3.goShopping();
}

if(p2 instanceof Woman){
System.out.println("****2********");
Woman w4 = (Woman)p2;
w4.goShopping();
}

if(p2 instanceof Object){
System.out.println("*****3*******");
}

//多态使用上的几个问题:
//问题一:编译能通过,运行不通过
// Person p = new Person();
// Man m = (Man)p;
// m.eat();
// m.earnMoney();
// m.isSmoking = true;

//问题二:编译通过,运行通过
Creature c = new Man();
Person p4 = (Person)c;
p4.eat();

//问题:编译不通过
//此时的Woman、Man;String、Date之间没任何子父类的关系
// Woman w = (Woman)(new Man());
// String s = new Date();

//在问题的基础上,可以通过代码实现编译通过,但是运行仍然不通过!
// Person p = new Man();
// Woman w = (Woman)p;

}
}
***************************************************************************************************
package com.atguigu.qustiontest;

/*class Base {
int count = 10;

public void display() {
System.out.println(this.count);
}
}

class Sub extends Base {
int count = 20;

public void display() {
System.out.println(this.count);
}
}

public class QustionTest {
public static void main(String[] args) {
Sub s = new Sub();
System.out.println(s.count); //20
s.display(); //20
Base b = s; //相当于 Base b = new Sub() 这里相当于多态了
// 多态的用法就是 父类的引用指向子类的对象 ,编译是认为是调用的方法时父类的 ,
// 但是运行时实际是调用子类对象重写父类的方法
System.out.println(b == s); // true
System.out.println(b.count); //10

b.display(); //此时是调用子类对象重写父类的方法,也就是调用的子类的方法 //20
}
}*/
class Base {
int count = 10;

public void display() {
System.out.println(this.count);
}
}

class Sub extends Base {
int count = 20;

// public void display() {
// System.out.println(this.count);
// }
}

public class QustionTest {
public static void main(String[] args) {
Sub s = new Sub();
System.out.println(s.count); //20
s.display(); //10
Base b = s; //
System.out.println(b == s); // true
System.out.println(b.count); //10

b.display(); //此时是调用子类对象重写父类的方法,也就是调用的子类的方法 //10
}
}
***********************************************************************************************************

时间: 2024-10-12 07:32:43

面向对象 多态的理解的相关文章

关于面向对象“多态”的理解

谈到多态肯定是和继承结合在一起的,本质是子类通过覆盖或重载(覆重)父类的方法,来使得对同一类对象同一方法的调用产生不同的结果.需要辨析的地方即:同一类对象指的是继承层级再上一层的对象,更加泛化. 实际采用多态的时候有四种情况: 父类有部分public的方法是不需要,也不允许子类覆重 父类有一些特别的方法是必须要子类去覆重的,在父类的方法其实是个空方法 父类有一些方法是可选覆重的,一旦覆重,则以子类为准 父类有一些方法即便被覆重,父类原方法还是要执行的 这四种情况在大多数支持多态的语言里未做很好的

Java中的继承、封装、多态的理解

Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extends关键字来实现,实现继承的类被称为子类,被继承的类称为父类(有的也称其为基类.超类),父类和子类的关系,是一种一般和特殊的关系.就像是水果和苹果的关系,苹果继承了水果,苹果是水果的子类,水果是苹果的父类,则苹果是一种特殊的水果. 3.Java使用extends作为继承的关键字,extends关键字在

09.面向对象多态的概述及其代码体现

09.01_面向对象(多态的概述及其代码体现) A:多态(polymorphic [,p?l?'m??f?k])概述 事物存在的多种形态 B:多态前提 a:要有继承关系. b:要有方法重写. c:要有父类引用指向子类对象. C:案例演示 代码体现多态 案例: class Demo1_Polymorphic { public static void main(String[] args) { Cat c = new Cat();//猫是一只猫 c.eat(); Animal a = new Cat

java中对于多态的理解

面向对象: 类:具体的对象抽象而来,可以抽象的表示一类具有相同特征和行为的对象 对象:是由类的实例化而来,对象是类的一个实例 java中关于多态的理解 打个比方 父亲person有行为这个方法,里面包括几个动作:吃饭,睡觉,走路 父亲有三个儿子,三个儿子都继承了父亲的行为方法,所以三个儿子都有吃饭,睡觉,走路这些动作,但是三个儿子又分别有自己的动作--大儿子A会弹吉他,二儿子B会唱歌,三儿子C会打鼓 ... 1.Person person = new A(); 不是父类对象指向子类引用而是父类引

C#面向对象-多态

面向对象的三大特性(封装,继承,多态)大多少人都应该知道.前两个的话比较容易理解.本文主要说一下面向对象中的多态. 什么是多态?不同的对象对同一操作,产生不同的执行结果.这就是多态.那么多态又包含了:重载,重写,虚方法,抽象方法. 1,重载什么叫重载?在同一个作用域的两个或多个方法函数名相同,参数列表不同的方法叫做重载.重载有三个特点:1.1:方法名必须相同.1.2:参数列表必须不同.1.3:返回值类型可以不相同. 列如: 1 public void Animal() 2 { 3 Console

关于java的this、继承、多态的理解

今天主要学习的内容是关于this.继承.多态的理解,并对其作出总结. 1.This 就目前来说,从个人的实验来看,this主要是对于一个类的对象的引用.它出现的位置主要是以它出现的形式决定的. ①.this(参数类型)这是在在构造方法中调用重写的构造方法. ②.作为某个类的对象来调用类中属性或方法.(用在某个类中的成员方法,因为某个类的对象就可以通过.来调用) 2.extends 继承之前已经了解了一些,接下来就是进一步的总结. ①.protected类型的变量是适合子类和父类之间的使用的,即使

转:OC面向对象—多态

OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. Animal类的声明 Animal类的实现 Dog类继承自Animal类 Dog类的实现 测试程序: 二.使用注意 代码分析: Dog *d=[[Animal  alloc] init];   动物是一条狗?语义正确吗? NSString *str=[Dog  new];     狗是一个字符串?

面向过程和面向对象的本质理解

http://kiritor.blog.51cto.com/7400479/1226762/ 面向过程和面向对象的本质理解 面向过程就是分析出解决问题所需的步骤,面向对象则是把构成问题的事物分解成对象,抽象 出对象的目的并不在于完成某个步骤,而是描述其再整个解决问题的步骤中的行为. 面向过程的思维方式是分析综合,面向对象的思维方式是构造. 例如c语言解决问题时,一般是先定义数据结构,然后在构造算法.而是用Java面向对象求解时 则是先抽象出对象,构造一个"封闭"的环境,这个环境中有定义

OC面向对象-多态

OC面向对象-多态 一.基本概念 1>多态在代码中的体现,即为多种形态,没有继承就没有多态 2>在使用多态时,会进行动态检测,以调用真实的对象方法 3>多态在代码中的体现即父类指针指向子类对象 Animal类的声明 #import <Foundation/Foundation> //声明一个Animal类,该类继承自NSObject @interface Animal : NSObject //在Animal类中声明一个eat的对象方法 -(void) eat; @end A