一篇文章让你掌握java的多态

简介: 🍅程序员小王的博客:程序员小王的博客🍅程序员小王的资源博客:http://wanghj.online/🍅 欢迎点赞 👍 收藏 ⭐留言 📝🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕🍅java自学的学习路线:java自学的学习路线

一、对象的创建过程

  • 对象的创建过程和Super配套视频讲解



对象的创建和super

1. 分配内存空间(父类+子类)
2. 初始化父类的属性
3. 调用父类的构造方法
4. 再初始化子类的属性
5. 调用子类的构造方法


遵循先父后子的顺序,如果父类有父类,那么先初始化父类的父类

二、Super

含义:super表示父类对象的引用(this表示当前对象,super表示父类对象)


使用Super可以访问父类的属性和方法


使用时机:当父类的方法或属性被子类覆盖(重写)时,可以使用Super访问父类的属性和方法


访问父类的属性


public class Super {
    int a=10; //父类熟悉  成员变量
}
class  Sub extends  Super{
    int a=20;//成员变量、属性
    public void m1(){
        int a=30;//局部变量
        System.out.println(a);  //就近原则,局部变量
        System.out.println(this.a);  //就是调用本类中的成员变量
        System.out.println(super.a);  //调用父类的成员变量
    }
}
class TestSub{
    public static void main(String[] args) {
        //1.分配空间
        Sub sub = new Sub();  //自动调用构造器
        sub.m1();
    }
}

可以访问父类的方法

package com.baidu.whj;
/**
 * @author Wanghj
 * @version 1.0
 * @date 2022/12/6 20:30
 */
public class Super {
    int a = 10; //父类熟悉  成员变量
    public void m1() {
        int a = 30;//局部变量
        System.out.println(a);  //就近原则,局部变量
        System.out.println(this.a);  //就是调用本类中的成员变量
    }
    public void m2() {
        System.out.println("m2 in super");
    }
}
class Sub extends Super {
    int a = 20;//成员变量、属性
    public void m1() {
        int a = 30;//局部变量
        System.out.println(a);  //就近原则,局部变量
        System.out.println(this.a);  //就是调用本类中的成员变量
        System.out.println(super.a);  //调用父类的成员变量
    }
    //实现覆盖、重写:  方法名相同,形成列表相同,返回值类型相同,修饰符必须相同或更宽
    public void m2() {//覆盖父类的方法
        super.m1();
        System.out.println("m2 in sub");
    }
}
class TestSub {
    public static void main(String[] args) {
        //1.分配空间
        Sub sub = new Sub();  //自动调用构造器
        sub.m2();
    }
}

三、多态

多态的视频讲解


java之多态


概念:使用父类引用指向不同的子类对象,不同的子类对象形成不同的形态特点


多态的体现:使用父类引用存储子类对象


class animal{}
class Dog extends Animal{}
class Cat extends Animal{}

1、特点

子类对象类型始终不变


例子

public class Animal {
}
class Dog extends Animal {
}
class Cat extends Animal {
}
class TestAnimal {
    public static void main(String[] args) {
        Dog d = new Dog();
        Animal a = d;//将dog对象存储引用到Animal中
        System.out.println(d);
        System.out.println(a);
    }
}
/*
com.baidu.whj.Dog@135fbaa4
com.baidu.whj.Dog@135fbaa4
*/

编译时只能调用引用类型中声明的方法

由于多态的存在,只有在程序运行时才能知道父类中存储的是什么类型,而编译器无法得知,只能确定引用中存储的对象是子类,子类一定会有父类的方法,因此我们只能调用引用类型中声明的方法

Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
Animal a1;//编译器无法得知,子类对象的类型
if(n%2==0){
    a1=new Fish();
}else{
    a1=new Bird();
}
//编译器只能确定,调用父类的方法是不存在问题的
a1.eat();
a1.sleep();
a1.fly();

 

运行时,如果子类覆盖了父类中的方法,则执行子类中覆盖的方法

package com.baidu.whj.animal;
/**
 * @author Wanghj
 * @version 1.0
 * @date 2022/12/6 21:45
 */
public class Animal {
    private  String name;
    private  int age;
    public Animal() {
    }
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void eat(){
        System.out.println("Animal eat");
    }
}
class Dog extends Animal{
    public void eat(){
        System.out.println("狗吃屎!");
    }
}
class TestDog{
    public static void main(String[] args) {
        Animal a = new Dog();
        a.eat();
    }
}

2、类型的转换

子类对象赋值给父类引用

Animal a=new Dog();

父类引用赋值给子类引用

Animal a=new Dog();
//向下强制类型转换
Dog d=(Dog)a;

作用:当需要调用子类中的方法时,向下转型后通过子类引用对象

package com.baidu.whj.animal;
/**
 * @author Wanghj
 * @version 1.0
 * @date 2022/12/6 21:45
 */
public class Animal {
    private  String name;
    private  int age;
    public Animal() {
    }
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void eat(){
        System.out.println("Animal eat");
    }
}
class Dog extends Animal{
    public void eat(){
        System.out.println("狗吃屎!");
    }
    public void swim(){
        System.out.println("狗可以游泳!");
    }
}
class TestDog{
    public static void main(String[] args) {
        Animal a = new Dog();
        a.eat();
        //强制类型转换
        Dog dog=(Dog) a;
        //向下类型转换之后,才能调用子类中的方法
        dog.swim();
    }
}




相关文章
|
12月前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第17天】本文详细介绍了Java编程中Map的使用,涵盖Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的并发处理和性能优化技巧,适合初学者和进阶者学习。
532 3
|
算法 Java 程序员
在Java的编程世界里,多态不仅仅是一种代码层面的技术,它是思想的碰撞,是程序员对现实世界复杂性的抽象映射,是对软件设计哲学的深刻领悟。
在Java的编程世界里,多态不仅仅是一种代码层面的技术,它是思想的碰撞,是程序员对现实世界复杂性的抽象映射,是对软件设计哲学的深刻领悟。
182 9
|
Java 开发者
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
98 7
|
Java 开发者
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
105 5
|
Java 程序员
让我们一起探讨Java多态的奥秘,看看它是如何打破“一刀切”的局限,让我们的代码更加生动多彩
让我们一起探讨Java多态的奥秘,看看它是如何打破“一刀切”的局限,让我们的代码更加生动多彩
95 5
|
6月前
|
Java 编译器 程序员
java中重载和多态的区别
本文详细解析了面向对象编程中多态与重载的概念及其关系。多态是OOP的核心,分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态主要通过方法重载和运算符重载实现,如Java中的同名方法因参数不同而区分;运行时多态则依赖继承和方法重写,通过父类引用调用子类方法实现。重载是多态的一种形式,专注于方法签名的多样性,提升代码可读性。两者结合增强了程序灵活性与扩展性,帮助开发者更好地实现代码复用。
224 0
|
9月前
|
Java
Java 面向对象编程的三大法宝:封装、继承与多态
本文介绍了Java面向对象编程中的三大核心概念:封装、继承和多态。
476 15
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
Java 编译器
Java——类与对象(继承和多态)
本文介绍了面向对象编程中的继承概念,包括如何避免重复代码、构造方法的调用规则、成员变量的访问以及权限修饰符的使用。文中详细解释了继承与组合的区别,并探讨了多态的概念,包括向上转型、向下转型和方法的重写。此外,还讨论了静态绑定和动态绑定的区别,以及多态带来的优势和弊端。
274 7
Java——类与对象(继承和多态)
|
12月前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第19天】本文介绍了Java编程中重要的数据结构——Map,通过问答形式讲解了Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的使用和性能优化技巧,适合初学者和进阶者学习。
420 4

热门文章

最新文章

下一篇
oss教程