java基础之多态的那些事儿

同一个对象在不同时刻体现出来的不同状态,叫多态

多态的前提:

a.有继承或者实现关系。

b.有方法重写。

c.有父类或者父接口引用指向子类对象。

多态的分类:

a:具体类多态

class Fu{
}
class Zi extends Fu{
}

Fu f = new Zi();

     b.抽象类多态

abstract class Fu{
}
class Zi extends Fu{
}

Fu f = new Zi();

c.接口多态 

interface Fu{
}
class Zi implements Fu{
}

Fu f = new Zi();

多态中的成员访问特点:

1、成员变量:编译看左边,运行看左边(执行结果)

class Fu{
	public int num = 100;
}
class Zi extends Fu{
	public int num = 1000;
	public int num2 = 200;
}
public class DuoTai {
      public static void main(String[] args) {
    	 ///要父类引用指向子类对象,父 f = new 子();
    	  Fu f = new Zi();
    	  System.out.println(f.num);//100,执行的是左边父类
    	  ///System.out.println(f.num2);编译不通过,报错
      }
}

2、构造方法:创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。子类的构造都会默认访问父类构造。

package Training;
class Fu{
	public Fu() {
		System.out.println("我是父类构造方法!!!");
	}
}
class Zi extends Fu{
	public Zi() {
		System.out.println("我是子类构造方法!!!");
	}
}
public class DuoTai {
      public static void main(String[] args) {
    	  new Zi();
      }
}
///默认先访问父类构造方法

1 我是父类构造方法!!!
2 我是子类构造方法!!!

3、成员方法:编译看左边,运行看右边

class Fu{
	public void method() {
		System.out.println("我是父类成员方法!!!");
	}
}
class Zi extends Fu{
	public void method() {
		System.out.println("我是子类成员方法1!!!");
	}
	public void Zimethod() {
		System.out.println("我是子类成员方法2!!!");
	}
}
public class DuoTai {
      public static void main(String[] args) {
    	  Fu f = new Zi();
    	  f.method();
    	  ///f.Zimethod();编译不通过报错,父类不能使用子类特有的功能
      }
}

1 我是子类成员方法1!!!

4、静态方法:编译看左边,运行看左边

class Fu{
	public static void method() {
		System.out.println("我是父类静态方法!!!");
	}
}
class Zi extends Fu{
	public static void method() {
		System.out.println("我是子类静态方法!!!");
	}
}
public class DuoTai {
      public static void main(String[] args) {
    	  Fu f = new Zi();
    	 f.method();
      }
}

 来自传智播客的刘意老师的经典讲解:

多态的问题理解:
	class 孔子爹 {
		public int age = 40;

		public void teach() {
			System.out.println("讲解JavaSE");
		}
	}

	class 孔子 extends 孔子爹 {
		public int age = 20;

		public void teach() {
			System.out.println("讲解论语");
		}

		public void playGame() {
			System.out.println("英雄联盟");
		}
	}

	//Java培训特别火,很多人来请孔子爹去讲课,这一天孔子爹被请走了
	//但是还有人来请,就剩孔子在家,价格还挺高。孔子一想,我是不是可以考虑去呢?
	//然后就穿上爹的衣服,带上爹的眼睛,粘上爹的胡子。就开始装爹
	//向上转型
	孔子爹 k爹 = new 孔子();
	//到人家那里去了
	System.out.println(k爹.age); //40
	k爹.teach(); //讲解论语
	//k爹.playGame(); //这是儿子才能做的

	//讲完了,下班回家了
	//脱下爹的装备,换上自己的装备
	//向下转型
	孔子 k = (孔子) k爹;
	System.out.println(k.age); //20
	k.teach(); //讲解论语
	k.playGame(); //英雄联盟

 

原文地址:https://www.cnblogs.com/zws-bugging/p/10732849.html

时间: 2024-10-03 21:41:35

java基础之多态的那些事儿的相关文章

Java基础十一--多态

Java基础十一--多态 一.多态定义 简单说:就是一个对象对应着不同类型. 多态在代码中的体现: 父类或者接口的引用指向其子类的对象. 1 /* 2 3 对象的多态性. 4 5 class 动物 6 {} 7 8 class 猫 extends 动物 9 {} 10 11 class 狗 extends 动物 12 {} 13 14 15 16 猫 x = new 猫(); 17 18 动物 x = new 猫();//一个对象,两种形态. 19 20 21 22 猫这类事物即具备者猫的形态,

09. Java基础之多态

什么叫多态?从字面上理解就是多种形态,即对同一个客体,可以有多种不同的形式.就好像糖一样,有多种口味,你想吃什么口味的就可以吃什么口味.但在程序中,却不是你想要怎样就怎样.更多的是需要怎样去做就怎样去做.来一个算是比较官方的解释:在面向对象语言中,接口的多种不同的实现方式即为多态.引用Charlie Calverts对多态的描述--多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自"Delphi4 编程技术内

【Java基础】多态

首先先来个总结: 什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法. 多态的作用:消除类型之间的耦合关系. 现实中,关于多态的例子不胜

黑马程序员-Java基础-面向对象—多态、Object类、内部类、异常

第一讲  多态 1.  定义 可以理解为事物存在的多种体现形态. 在java中,当函数的功能内容不确定时,可以将此方法定义为抽象方法,让其子类去实现.当子类对象不同时,调用同一个函数名,会执行不同的函数体,得到不同的结果,从而体现了多态性. 2.  多态的体现形式 父类的引用指向了自己的子类对象:Fu f = new Zi(): 父类的引用也可以接受自己的子类对象: 3.  多态的前提条件 必须是类与类之间有关系,要么继承,要么实现(接口): 函数之间存在覆盖(重写): 4.  多态的好处 大大

Java基础:多态(重载和重写)

(1)域与静态方法 记住"只有普通方法的调用是多态的". 而域和静态方法不是:对于域的访问,在编译期间就已经进行解析和绑定了.而如果某个方法是静态的,就不具备多态性. (2)编写构造器有一条准则: * 用尽可能简单的方法使得对象进入正常状态,尽量避免调用其他方法. * 构造器内能够安全调用的方法只有那些final方法(private默认final),因为他们无法被覆盖. (3)多态概念: 多态是指一个程序中同名的不同方法共存的情况. 这些方法同名的原因是它们的最终功能和目的都相同,但是

黑马程序员-Java基础之多态

面向对象之多态   多 态(面向对象特征之一):函数本身就具备多态性,某一种事物有不同的具体的体现. 体现:父类引用或者接口的引用指向了自己的子类对象.//Animal a = new Cat(); 多态的好处:提高了程序的扩展性. 多态的弊端:当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,不可以访问子类中特有的方法.(前期不能使用后期产生的功能,即访问的局限性) 多态的前提: 1:必须要有关系,比如继承.或者实现.     2:通常会有覆盖操作.   多态的出现思想

java基础之 多态

在面向对象编程(Object-Oriented Programming, OOP)中,多态机制无疑是其最具特色的功能,甚至可以说,不运用多态的编程不能称之为OOP.这也是为什么有人说,使用面向对象语言的编程和面向对象的编程是两码事. 多态并没有一个严格的定义,维基百科上给它下的定义比较宽松: Subtype polymorphism, almost universally called just polymorphism in the context of object-oriented pro

2.25 Java基础总结 ①多态②向上向下转型③instanceof

①多态②向上向下转型③instanceof 一.多态即相同行为,不同实现有两种方法:重载和重写分类:①静态多态:编译时已经确定效果,所用重载实现(不是指static)②动态多态:编译未知,运行已知(使用动态绑定和重写实现) 动态绑定:父类的引用指向子类的对象,执行相应的子类方法,而不是父类的,从而实现多态性 二.向上转型,向下转型向上转型:一个父类的引用可以指向不同的子类对象,或者说一个子类的对象可以被当做一个父类类型低精度向高精度转pet = cat;自动转,子类向父类 向下转型:强制转,有很

黑马程序员--java基础之多态,抽象类,接口,匿名内部类

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 4.4 子类的实例化过程 子类中所有的构造函数默认都会访问父类中空参数的构造函数. 因为每一个构造函数的第一行都有一条默认的语句super();. 子类会具备父类中的数据,所以要先明确父类是如何对这些数据初始化的. 为什么子类实例化的时候要访问父类中的构造函数呢? 那是因为子类继承了父类,获取到了父类中内容(属性),所以在使用父类内容之前,要先看父类是如何对自己的内容进行初始化的. P.S.