【JavaSE】解密 继承和多态(下)

这篇具有很好参考价值的文章主要介绍了【JavaSE】解密 继承和多态(下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

紧接着上篇 解密继承和多态(上)~

【JavaSE】解密 继承和多态(下),java,开发语言

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

前言

protected关键字

在同一包下同一类可以访问

代码理解

在同一包下不同类可以访问

代码理解

在不同包下的子类可以访问

代码理解

再谈访问权限问题

final关键字

final修饰变量

final修饰类

组合

代码举例

多态

动态绑定

发生条件

向上转型

代码理解

直接赋值

方法传参

作为返回值 

向下转型

父类和子类 方法的重写

要求

注意

@Override

与代码重载的区别

代码理解


protected关键字

接下来我们谈谈protected关键字

在同一包下同一类可以访问

代码理解

如下的代码,用protected修饰c,在同一个包demo1下的同一类Test1下,func方法可以成功访问c

package demo1;

public class Test1 {
    public int a;
    protected int c=99;
    
    public void func(){
        System.out.println(c);
    }
}

在同一包下不同类可以访问

在同一个包demo1下面再建一个类TestProtected1

【JavaSE】解密 继承和多态(下),java,开发语言

代码理解

调用Test1产生实例化对象test1,可以通过对象test1访问Test1类下的成员c

package demo1;

public class TestProtected1 {
    public static void main(String[] args) {
        Test1 test1=new Test1();
        System.out.println(test1.c);
    }
}

在不同包下的子类可以访问

被protected修饰,不管同不同包,只要是子类就都可以 通过super 访问

代码理解

新创建另外一个包demo2,再在下面创建一个类Test2

在Test2类中可以通过super成功访问不同包demo2下Test1类中被protected修饰的c

前提:被继承的类是用public修饰的,在代码中体现就是Test被public修饰了才行

(其中类的权限 只有 两种:一个是用public修饰的,另一个是不用public修饰的)

【JavaSE】解密 继承和多态(下),java,开发语言

package demo2;

import demo1.Test1;//要先导包
//继承Test1
public class Test2 extends Test1 {
    public void test(){
        System.out.println(super.c);
    }
    public static void main(String[] args) {
//        System.out.println(super.c);//会报错,因为main方法中有static修饰,不能用super
    }
}

再谈访问权限问题

在上一篇我们讲解了private和public的范围,他们是访问权限的两个极端

  • private只能在同一包的同一类下访问
  • public是 不管是否同包 不管是否同类 都能被访问

我们可以用下图总结

【JavaSE】解密 继承和多态(下),java,开发语言

这里的default不是关键字,表示的是在成员变量前不加任何public、private等关键字

Java不支持多继承

【JavaSE】解密 继承和多态(下),java,开发语言

final关键字

final修饰变量

final int SIZE=10;表示SIZE变成常量(不能被修改)

final修饰类

final用于控制继承,被final修饰的类 表示 当前类不可以被继承,此时这个类称为密封类

组合

组合是代码层面的一种写法,是has-a的关系(例如 汽车中的零部件组合成了一辆汽车),仅仅是将一个类的示例作为另一个类的成员变量

代码举例

老师类和学生类组合成了学校类

class Teacher{
    
}
class Student{
    
}
class School{
    private Teacher[] teachers;
    private Student[] students;
}

多态

同一件事不同的对象上产生的效果是不一样

代码理解

当Animal引用的对象不一样(animal1和animal2),调用eat方法,表现出的行为不一样时(Animal1吃狗粮,Animal2吃鸟粮),这就叫做 多态。

class Animal{
    public String name;
    public int age;
    public void eat(){
        System.out.println(this.name+" 正在吃~");
    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
class Dog extends Animal{
    //Alt键 加上 Enter键快速生成子类构造方法
    public Dog(String name, int age) {
        super(name, age);
    }
    @Override//注解  用于帮助检查方法重写是否正确,若重写的方法有问题,他就会报错
    public void eat(){
        System.out.println(this.name+"正在吃狗粮~");//与父类的eat形成 方法的重写
    }

    public void bark(){
        System.out.println(this.name+" 正在汪汪汪~");
    }
}
class Bird extends Animal{
    public Bird(String name, int age) {
        super(name, age);
    }

    public void qiqi(){
        System.out.println(this.name+" 正在吱吱吱~");
    }
    public void eat(){
        System.out.println(this.name+"正在吃鸟粮~");//与父类的eat形成 方法的重写
    }
}

public class Test {
    public static void func(Animal animal){

    }
    public static Animal func2(){
        return new Dog("旺财",3);
    }

    public static void main(String[] args) {
/*        Dog dog=new Dog();
        Animal animal=dog;//向上转型*/
        Animal animal1=new Dog("旺财",3);//向上转型
        animal1.eat();

        Animal animal2=new Bird("小蜂",1);
        animal2.eat();
        //animal1.bark();//会报错,因为Animal中没有bark方法,通过父类引用只能访问父类自己的有的
    }
}

实现多态的前提是动态绑定~

动态绑定

编译的是父类方法,但是调用的是子类方法

代码理解

编译用的父类Animal中的eat方法,但结果是调用的是子类eat方法

        Animal animal1=new Dog("旺财",3);//向上转型
        animal1.eat();

 代码结果

【JavaSE】解密 继承和多态(下),java,开发语言

发生条件

父类引用子类对象【向上转型】

通过父类引用 调用重写的方法【方法的重写】

向上转型

实际就是创建一个子类对象,将其当成父类对象来使用。

语法格式:父类类型 对象名 = new 子类类型()

  • 优点:让代码实现更简单灵活。
  • 缺陷:不能调用到子类特有的方法。

发生向上转型的时机有三种,通过以下代码加以理解

代码理解
直接赋值
    public static void main(String[] args) {
/*        Dog dog=new Dog();
        Animal animal=dog;//向上转型*/
        Animal animal1=new Dog("旺财",3);//向上转型

}
方法传参
    public static void func(Animal animal){
        
    }
作为返回值 
    public static Animal func2(){
        return new Dog("旺财",3);
    }

向下转型

        Animal animal1=new Dog("旺财",3);//向上转型
        Dog dog=(Dog)animal1;//向下转型 要将对象animal1强转成Dog类,否则会报错
        //因为 不是所有的动物都是狗
父类和子类 方法的重写

重写又叫覆盖、覆写

要求
  • 方法名相同
  • 方法的参数列表相同(个数、顺序、类型)
  • 方法返回值相同
注意
  • 静态方法 不能 被重写
  • 被private修饰的 不能 被重写
  • 被final修饰的 不能 被重写
  • 如果方法被重写,子类的访问权限要 大于等于 父类的权限
@Override

修饰该方法,说明该方法是重写的

【JavaSE】解密 继承和多态(下),java,开发语言

与代码重载的区别

【JavaSE】解密 继承和多态(下),java,开发语言文章来源地址https://www.toymoban.com/news/detail-851790.html

代码理解
    
//父类Animal中的eat方法
    public void eat(){
        System.out.println(this.name+" 正在吃~");
    }

//子类Dog中的eat方法
    public void eat(){
        System.out.println(this.name+"正在吃狗粮~");//与父类的eat形成 方法的重写
    }

到了这里,关于【JavaSE】解密 继承和多态(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • JavaSE【继承和多态】(1)(重点:初始化、pretected封装、组合)

    JavaSE【继承和多态】(1)(重点:初始化、pretected封装、组合)

    继承 (inheritance) 机制 :是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性 的基础上进行 扩展,增加新功能 ,这样产生新的类,称 派生类 。         继承呈现了面向对象程序设计的层次结构, 体现了 由简单到复杂的认知过程。   

    2024年02月14日
    浏览(13)
  • c、c++、java、python、js对比【面向对象、过程;解释、编译语言;封装、继承、多态】

    c、c++、java、python、js对比【面向对象、过程;解释、编译语言;封装、继承、多态】

    目录 内存管理、适用 区别 C 手动内存管理:C语言没有内置的安全检查机制,容易出现内存泄漏、缓冲区溢出等安全问题。 适用于系统级编程 C++ 手动内存管理:C++需要程序员手动管理内存,包括分配和释放内存,这可能导致内存泄漏和指针错误。 适用于游戏引擎和系统级编

    2024年02月08日
    浏览(15)
  • 【Java0基础学Java第八颗】 -- 继承与多态 -- 多态

    【Java0基础学Java第八颗】 -- 继承与多态 -- 多态

    通俗来说就是多种形态, 具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态 。 就比如打印机,彩色打印机和黑白打印机,打印出的效果一个是彩色,一个是黑白。 即: 同一件事情,发生在不同对象身上,就会产生不同的结果 。 在Java中要实现多态,

    2024年02月04日
    浏览(12)
  • (java)继承和多态 (详解)

    (java)继承和多态 (详解)

    目录 1 继承 1.1为什么需要继承 1.2 继承概念 1.3 继承的语法 1.4 父类成员访问  1.4.1 子类中访问父类的成员变量 1.4.2 子类中访问父类的成员方法   1.5 super 1.6 子类构造方法 1.7 super和this 1.7.1 this 1.7.2 super和this  1.8 再谈初始化 1.9 继承方式 1.10 继承与组合 2 多态 2.1 多态

    2024年02月03日
    浏览(13)
  • Java之继承和多态

    Java之继承和多态

    1.  为什么需要继承 先看下代码 // Dog.java public class Dog { string name ; int age ; float weight ; public void eat (){ System . out . println ( name + \\\" 正在吃饭 \\\" ); } public void sleep (){ System . out . println ( name + \\\" 正在睡觉 \\\" ); } void Bark (){ System . out . println ( name + \\\" 汪汪汪 ~~~\\\" ); } } // Cat.Java public class Ca

    2024年04月23日
    浏览(15)
  • Java 封装 继承 多态(深入理解)

    Java 封装 继承 多态(深入理解)

    登神长阶 第二阶 封装 继承 多态 🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀 目录 🍒一.面向对象编程的三大特性 🍍二.封装 🧉1.定义及其作用  🥝2.访问限定符 🫛3.封装扩展 包(package) 🥕3.1.定义及其作用  🥦 3.2.导入包的类 🍔3.3.自定义包 🌯

    2024年03月11日
    浏览(12)
  • Java三大特性:封装、继承、多态

    Java三大特性:封装、继承、多态

    高内聚,低耦合 高内聚:类内部操作自己完成,不允许外部干涉。 低耦合:仅暴露少量的方法给外部使用。 封装(数据的隐藏) 通常应禁止直接访问一个对象中数据的实际表达,而应该通过操作接口来访问,这称为信息的隐藏。 封装的特点 1.提高程序的安全性,保护数据

    2024年03月21日
    浏览(16)
  • Java面向对象 - 封装、继承和多态

    目录 第1关:什么是封装,如何使用封装 第2关:什么是继承,怎样使用继承 第3关:super的使用 第4关:方法的重写与重载 第5关:抽象类 第6关:final的理解与使用 第7关:接口 第8关:什么是多态,怎么使用多态 Java_Educoder

    2024年02月07日
    浏览(13)
  • 【Java初阶(六)上】封装 继承 多态

    【Java初阶(六)上】封装 继承 多态

    ❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ 🚚我的代码仓库: 33的代码仓库🚚 对于面向对象程序三大特性:封装、继承、多态。这篇文章将会详细讲解到如何实现封装、继承、多态,以及具体的应用。 本章重点 掌握封装的概念,如何实现封装,包的概念,继

    2024年04月09日
    浏览(15)
  • Java系列——封装、继承、多态初了解

    Java系列——封装、继承、多态初了解

    目录 一、前言 二、封装 1.什么是封装?   2.封装的特点 3.封装的使用 三、继承 1.什么是继承? 2.继承的特点 3.继承的优点 4.继承的使用  4.1 继承的格式  4.2 继承的演示 4.3 成员变量 4.4 成员方法 4.5 构造方法 五、多态 1.什么是多态? 2.多态的特点 3.多态的使用  4.引用类型

    2024年02月08日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包