`
schy_hqh
  • 浏览: 558582 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

(基础)java中的多态

 
阅读更多

多态性使得Java语言有很强的灵活性

很多设计模式都是基于多态的特点发展出来的

 

多态

父类(抽象的)引用指向子类(具体的)对象

Animal a = new Person();

 

编译时,编译器检查左边(Animal a)

a.getAge();   //编译通过,Animal中有getAge()

a.speakLanguage();   //编译失败,Animal中没有子类的特有方法speakLanguage()

多态编译是否通过,就看父类中是否存在被调用的方法

      
运行时,JVM按右边的对象执行(new Person)

a.getAge();  //运行时,如果子类有覆盖,则调用子类的getAge(),否则调用父类的getAge()

a.speakLanguage();   //无法运行,编译没通过;只能通过对象向下转型才能调用特有方法

Person p = (Person)a;
p.speakLanguage();


 

多态的好处

1.可以提高代码的扩展性,父类引用可以接收多种子类对象

 向上转型--->限定功能使用,提高扩展性,实现统一操作

  Animal a = new Person();

  getAnimalAge(a); //凡是Animal对象都可以使用getAnimalAge()方法,实现统一操作

 

 

多态的弊端

1.由于子类对象类型的向上提升,导致父类引用只能调用父类中定义好的方法/规则,会丢失对子类特有方法的调用;

 调用子类对象特有方法的解决方案:

向下转型--->使用对象的特有方法

Person person = (Person)Amimal;

person.speakLanguage();

风险:类型转换异常

通过类型判断: A instanceof AType ?

 

 

多态使用的前提

1.必须有继承或者实现关系--->父类通过引用来接收子类对象

2.要想在运行时父类引用调用到子类的方法,这些方法必须是覆盖父类的方法,子类特有方法在多态下无法调用!

 

 

 

 多态中的成员变量

编译和运行都参考左边的父类;

成员变量没有覆盖的功能,子类与父类可以存在相同类型相同名称的变量;

记住:多态时,类型发生了提升,所有调用都要看父类中的定义,

   对于成员变量而言,是不存在覆盖的,所以始终都是使用的父类的成员变量,但是子类可以 改变这个变量值!

   对于方法而言,如果子类有覆盖,则调用子类的,否则调用父类的;

 

 示例1

public class Animal {
	int num;
	
	public Animal() {
		num = 1;
	}
	
	private void say() {
		System.out.println("Animal.say()");
	}
	
	public void hello() {
		say();
		System.out.println("Animal.hello():"+num);
	}
	
}

 

public class Person extends Animal{
	
	//子类可以定义与父类完全相同的成员变量,这样,子类与父类各自持有自己的一份成员变量
	//注意:成员变量没有覆盖的功能
	//int num;
	
	public Person() {
		//如果子类自己也定义了与父类相同的成员变量,则这里就是对子类的成员变量进行赋值
		//否则,就是对继承自父类的成员变量进行赋值;
		num = 3;
	}

}

 

public class Test {
	public static void main(String[] args) {
		Animal p = new Person();
		p.hello();
	}
	
}

 运行结果说明:

Animal.say()
Animal.hello():3

子类没有覆盖父类中的方法,将调用父类的hello(),所以父类中的私有方法也被调用到,但是,子类改变了父类的成员变量,所以num从1变为了3。

 

 

示例2

子类定义了与父类完全相同的成员变量

public class Animal {
	int num;
	
	public Animal() {
		num = 1;
	}
	
	private void say() {
		System.out.println("Animal.say()");
	}
	
	public void hello() {
		say();
		System.out.println("Animal.hello():"+num);
	}
	
}

 

public class Person extends Animal{
	
	//子类定义了一个与父类相同的成员变量num
	int num;
	
	public Person() {
		//子类中有成员变量num,则这里就是对子类自己的成员变量num进行赋值
		num = 3;
	}

}

 

public class Test {
	public static void main(String[] args) {
		Animal p = new Person();
		p.hello();
	}
	
}

 运行结果:

Animal.say()
Animal.hello():1

子类没有覆盖父类的hello(),所以,调用父类的hello();

由于子类定义了一个与父类完全相同的成员变量num,并在构造函数中初始化,但是这是对子类自己的num成员变量进行赋值,并不会修改父类的成员变量num,所以,执行结果中的num=1;

 

 

示例3

子类定义了与父类完全相同的成员变量,并覆盖父类的方法

public class Animal {
	int num;
	
	public Animal() {
		num = 1;
	}
	
	private void say() {
		System.out.println("Animal.say()");
	}
	
	public void hello() {
		say();
		System.out.println("Animal.hello():"+num);
	}
	
}

 

public class Person extends Animal{
	
	//子类定义了一个与父类相同的成员变量num
	int num;
	
	public Person() {
		//子类中有成员变量num,则这里就是对子类自己的成员变量num进行赋值
		num = 3;
	}

	public void hello() {
		System.out.println("Person.hello():"+num);
	}
}

 

public class Test {
	public static void main(String[] args) {
		Animal p = new Person();
		p.hello();
	}
	
}

 运行结果:

Person.hello():3

子类定义了与父类完全相同的成员变量,则子类构造函数中赋值操作是针对子类自己的成员变量num进行的;

子类对父类方法进行了覆盖,调用时,将执行子类的方法;

由于执行的是子类的方法,方法中使用的变量就是子类中定义的变量

所以,num=3。

 

 

 多态中的成员函数---成员函数绑定到对象上执行

编译时参考左边父类中是否存在被调用的方法
(核心)运行时参考右边子类对象中的方法,若没有,则通过super调用父类中的方法;

非静态方法的执行都是绑定到对象上进行的

如果子类有覆盖父类的方法,则子类对象直接调用自己的这个覆盖方法;

如果子类没有覆盖父类的方法,则子类会通过super调用父类的方法;

 

Animal a = new Person();

       a.getType();//子类没有覆盖,就调用父类的;有覆盖,就调用子类重写的;
 
 多态中的静态函数
编译和运行都参照左边;
没有多态性,静态函数始终绑定到类上,与对象多态无关!
 
 
 

 

 

 

分享到:
评论

相关推荐

    java基础-java多态详解

    Java 多态是 Java 编程语言中的一种基本概念,它允许开发者定义一个接口,并且可以通过不同的类来实现该接口。多态性是 Java 面向对象编程的核心机制之一,它使得程序更加灵活、可维护和可扩展。 多态的体现 多态...

    北大青鸟javaOOP多态Ch03作业全集.rar

    在Java中,一个类只能单继承一个父类,但可以实现多个接口,这就是多态的基础。继承的多态性体现在父类引用指向子类对象时,调用的方法可以是子类重写过的,这样就表现出不同的行为。 2. 抽象类与接口:抽象类是不...

    Java基础多态PPT教学课件.pptx

    Java基础多态PPT教学课件.pptx

    java基础_多态

    在Java中,只有引用类型变量才能实现多态,基本类型变量无法实现。例如: ```java Animal myAnimal1 = new Animal(); Animal myAnimal2 = new Dog(); myAnimal1.sound(); // 输出 "Animal makes a sound" myAnimal...

    Java基础之多态ppt

    Java基础之多态课程PPT适用于基础学习者使用,很好的课程资源

    java基础继承封装多态

    本资源摘要信息将对 Java 基础知识点进行总结,涵盖继承、封装、多态等概念,并对面向对象的设计、数据库设计模式等进行讲解。 继承 继承是 Java 中的一种机制,允许一个类继承另一个类的属性和方法。继承的语法是...

    java 多态 经典讲解

    ### Java多态经典讲解 #### 一、理解Java多态 多态,作为面向对象编程的三大特性之一,是继抽象和继承之后的关键概念。它允许我们以统一的接口处理不同类型的对象,增强了代码的灵活性和可扩展性。在Java中,多态...

    Java多态,面向对象编程题demo.zip

    Java多态是面向对象编程中的一个核心概念,它允许我们以一种统一的方式处理不同类型的对象。在Java中,多态性主要体现在方法的重写(Override)和重载(Overload)。通过多态,我们可以编写出更加灵活、可扩展的代码...

    Java中的多态.pptx.pptx

    Java中的多态是面向对象编程的关键特性之一,它允许一个接口或者抽象方法被多个不同的类实现,从而使得代码更加灵活且可扩展。多态的概念基于一个接口可以有多种不同的实现方式,增强了程序的多样性和适应性。 在...

    java 多态.docx

    在Java中,多态的基础是继承。子类继承父类,从而获取了父类的属性和方法。这样,子类不仅拥有自己的特性,还能共享父类的功能,增加了代码的复用性。 2. **重写**: 子类可以重写父类中的方法,这意味着子类可以...

    深入Java核心Java中多态的实现机制.pdf

    在Java中,多态的实现机制主要包括以下几点: 1. **方法的覆盖(Override)**:派生类可以重写基类中的非final、非静态方法,以实现不同的功能。这使得通过基类引用调用方法时,实际执行的是派生类中的方法。 2. *...

    java基础 继承和多态实例

    //练习: ...可以统计数组中教师实际人数。 //d.可以根据教师编号查找教师。 //e.更新某个id的教师信息。 //f.可以根据id删除某个教师。 //g.求最高和最低工资教师。 //h.对教师按总工资进行排序。

    Java-多态--学习笔记.docx

    - **继承或实现**:多态的基础是类的继承或接口的实现。只有当子类继承了父类或者实现了父接口,才能覆盖父类的方法。 - **方法重写**:子类必须重写父类中至少一个方法,使得调用同一方法时,根据子类的实现产生...

    Java 多态应用,掌握多态

    6. ** finalize 方法**:虽然不是直接与多态相关的,但值得注意的是,Java中每个对象都有一个finalize()方法,这是垃圾收集器在回收对象前调用的,子类可以重写这个方法进行资源清理,但这并不保证一定会被调用,...

    Java基础多态PPT学习教案.pptx

    【Java基础多态】在Java编程中,多态性(Polymorphism)是面向对象三大特性之一,它允许我们使用一个引用类型来调用不同的实现,使得代码更加灵活且易于扩展。多态能够提高代码的复用性,降低耦合度,是软件设计中的...

    java中多态的使用实例

    这使得不同类可以实现相同的接口,提供了多态的基础。 例如,我们可以创建一个名为`Animal`的接口,其中定义了`sound()`方法: ```java public interface Animal { void sound(); } ``` 然后,我们有两个类`Dog`...

    java基础多态PPT教案学习.pptx

    Java中的多态是面向对象编程的一个核心特性,它允许我们以一种统一的方式处理不同类型的对象。在本PPT教案中,通过宠物喂食的例子来解释多态的概念和用途。 首先,例子展示了宠物(如狗狗和企鹅)有不同的饮食需求...

    Java多态实现

    Java多态实现是面向对象编程中的一个核心概念,它允许我们使用父类的引用变量来指向子类的对象,从而在运行时决定所调用的方法。这一特性极大地增强了代码的灵活性和扩展性,使得代码能够更好地应对未来的需求变化。...

    java多态小结

    ### Java多态详解 #### 什么是多态? 多态(Polymorphism)是面向对象编程的一个核心特性,指的是一个接口可以被多个类所实现或一个类可以被多个类所继承,进而表现出不同的行为。在Java中,多态主要体现在两个...

    从虚拟机角度看Java多态->(重写override)的实现原理

    Java多态是面向对象编程中的一个核心特性,它允许我们以一种统一的方式处理不同类型的对象。在Java中,多态性主要通过继承、接口和方法重写(Override)来实现。这里我们将深入探讨从虚拟机(JVM)的角度来看,Java...

Global site tag (gtag.js) - Google Analytics