Java基础-面向对象进阶-多态, 包, final, 权限修饰符,代码块

news2024/11/18 18:46:51

Java基础-面向对象进阶-多态, 包, final, 权限修饰符,代码块

  • 多态
    • 多态的概述
    • 多态中调用成员的特点
    • 多态的优势和弊端
    • 多态练习
  • final
  • 权限修饰符
  • 代码块
  • 来源
  • Gitee地址

多态

多态的概述

  • 多态: 对象的多种形态
  • 多态的前提
    • 有继承/实现关系
    • 有父类引用指向子类对象
    • 有方法的重写
  • 多态的好处
    • 使用父类型作为参数, 可以接收所有子类对象, 体现多态的扩展性和便利

多态中调用成员的特点

  • 调用成员变量的特点: 编译看左边, 运行看左边
  • 调用成员方法的特点: 编译看左边, 运行看右边
public class demo {
    public static void main(String[] args) {
        // 多态调用成员的特点

        Animal a = new Dog();

        System.out.println(a.name);
        a.show();

    }
}

class Animal{
    public String name = "动物";

    public void show()
    {
        System.out.println("Animal");
    }
}

class Dog extends Animal{
    private String name = "狗";

    public void show()
    {
        System.out.println("Dog");
    }
}

多态的优势和弊端

  • 多态的优势
    • 方法中, 使用父类型作为参数, 可以接收所有子类对象
  • 多态的弊端
    • 不能使用子类的特有功能
  • 引用数据类型的类型转换
    • 自动类型转换: Person p = new Student()
    • 强制类型转换: Student s = (Student)p
  • 强制类型转换解决什么问题
    • 可以转换成真正的子类类型, 从而调用子类独有功能
    • 转换类型与真实对象类型不一致会报错
    • 转换时用instanceof关键字进行判断

多态练习

  • demo
    public class demo {
        public static void main(String[] args) {
            /** 多态综合练习
             * 根据需求完成代码:
             * 	1.定义狗类
             * 		属性:
             * 			年龄,颜色
             * 		行为:
             * 			eat(String something)(something表示吃的东西)
             * 			看家lookHome方法(无参数)
             *
             * 	2.定义猫类
             * 		属性:
             * 			年龄,颜色
             * 		行为:
             * 			eat(String something)方法(something表示吃的东西)
             * 			逮老鼠catchMouse方法(无参数)
             *
             * 	3.定义Person类//饲养员
             * 		属性:
             * 			姓名,年龄
             * 		行为:
             * 			keepPet(Dog dog,String something)方法
             * 				功能:喂养宠物狗,something表示喂养的东西
             * 		行为:
             * 			keepPet(Cat cat,String something)方法
             * 				功能:喂养宠物猫,something表示喂养的东西
             * 		生成空参有参构造,set和get方法
             * 	4.定义测试类(完成以下打印效果):
             * 		keepPet(Dog dog,String somethind)方法打印内容如下:
             * 			年龄为30岁的老王养了一只黑颜色的2岁的狗
             * 			2岁的黑颜色的狗两只前腿死死的抱住骨头猛吃
             * 		keepPet(Cat cat,String somethind)方法打印内容如下:
             * 			年龄为25岁的老李养了一只灰颜色的3岁的猫
             * 			3岁的灰颜色的猫眯着眼睛侧着头吃鱼
             * 	5.思考:
             * 		1.Dog和Cat都是Animal的子类,以上案例中针对不同的动物,定义了不同的keepPet方法,过于繁琐,能否简化,并体会简化后的好处?
             * 		2.Dog和Cat虽然都是Animal的子类,但是都有其特有方法,能否想办法在keepPet中调用特有方法?
             */
            Person p1 = new Person("老王", 30);
            Person p2 = new Person("老李", 25);
    
            Dog dog = new Dog(2, "黑");
            Cat cat = new Cat(3, "灰");
    
            p1.keepPet(dog, "骨头");
            p2.keepPet(cat, "鱼");
        }
    }
    
  • Animal
    public class Animal {
        private int age;
        private String color;
    
        public void eat(String something){
            System.out.println("吃"+something);
        }
    
        public Animal() {
        }
    
        public Animal(int age, String color) {
            this.age = age;
            this.color = color;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getColor() {
            return color;
        }
    
        public void setColor(String color) {
            this.color = color;
        }
    }
    
  • Dog
    public class Dog extends Animal{
    
        public Dog() {
        }
    
        public Dog(int age, String color) {
            super(age, color);
        }
    
        public void lookHome(){
            System.out.println("看家");
        }
    
        @Override
        public void eat(String something) {
            System.out.println(getAge()+"岁的"+getColor()+"颜色的狗两只前腿死死的抱住"+something+"猛吃");
        }
    }
    
  • Cat
    public class Cat extends Animal{
    
        public Cat() {
        }
    
        public Cat(int age, String color) {
            super(age, color);
        }
    
        public void catchMouse()
        {
            System.out.println("抓老鼠");
        }
    
        @Override
        public void eat(String something) {
            System.out.println(getAge()+"岁的"+getColor()+"颜色的猫眯着眼睛侧着头吃"+something);
        }
    }
    
  • Person
    public class Person {
        private String name;
        private int age;
    
        public Person() {
        }
    
        public Person(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 keepPet(Animal a, String something){
            if(a instanceof Dog dog){
                System.out.println("年龄为"+age+"岁的"+name+"养了一只"+a.getColor()+"的"+a.getAge()+"岁的狗");
                a.eat(something);
                dog.lookHome();
            }else if(a instanceof Cat cat){
                System.out.println("年龄为"+age+"岁的"+name+"养了一只"+a.getColor()+"的"+a.getAge()+"岁的猫");
                a.eat(something);
                cat.catchMouse();
            }
        }
    }
    

  • 包的作用
    包就是文件夹,用来管理各种不同功能的Java类
  • 包名书写的规则
    公司域名反写 + 包的作用,需要全部英文小写,见名知意
  • 什么是全类名
    包名 + 类名
  • 什么时候需要导包?什么时候不需要导包?
    • 使用同一个包中的类时,不需要导包
    • 使用java.lang包中的类时,不需要导包
    • 其他情况都需要导包
    • 如果同时使用两个包中的同名类,需要用全类名

final

  • final修饰方法: 最终方法, 不能被重写
  • final修饰类: 最终类, 不能被继承
  • final修饰变量: 是常量, 不能被修改
    • 基本数据类型: 变量的值不能修改
    • 引用数据类型: 地址值不能修改, 内部的属性值可以修改

权限修饰符

实际开发中, 一般只用private和public

  • 成员变量私有
  • 方法公开
  • 注意: 如果方法中的代码是抽取其他方法中共性代码, 这个方法一般也私有

代码块

  • 局部代码块
    • 提前结束变量的生命周期(已淘汰)
  • 构造代码块
    • 抽取构造方法中的重复代码(不够灵活)
  • 静态代码块的作用
    • 数据的初始化

来源

黑马程序员. 阿玮Java零基础

Gitee地址

https://gitee.com/yu-ba-ba-ba/awJava

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1196454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Netty--NIO(Non-blocking IO)基础--三大组件

NIO(Non-blocking IO)是一种非阻塞的IO模型,它通过引入Channel和Selector的概念,使得一个线程能够管理多个通道,从而提高了IO操作的效率。本文将介绍NIO的三大组件:Channel、Buffer、以及Selector&#xff…

【C++对象模型】构造函数II

构造函数语意学 》》构造函数语意学I—默认构造函数的构造操作《《 》》构造函数语意学II—拷贝构造函数的构造操作《《 》》构造函数语意学III—程序转化语意学《《 拷贝构造函数的构造操作 有三种情况,会以一个object的内容作为另一个class object的初值。 1.…

跨镜头目标融合__追踪之目标重识别研究(跨镜头目标追踪)

文章目录 标题:跨镜头目标融合;目标重识别;跨镜头目标追踪; 1 目的:2 实现方法/策略:2.1 目标类型位置匹配(或考虑结合目标轨迹)2.2 目标重识别2.3 目标类型位置匹配(轨迹)目标重识别…

Linux centos系统中添加磁盘

为了学习与训练文件系统或磁盘的分区、格式化和挂载/卸载,我们需要为虚拟机添加磁盘。根据需要,可以添加多块不同大小的磁盘。具体操作讨论如下,供参考。 一、添加 1.开机前 有两个地方,可选择打开添加硬盘对话框 (1)双击左侧…

暖手宝+充电宝设计方案 可实现快速升温和充电 低成本充电电流可选

充电暖手宝因为它的便携性,既能供暖又能当充电宝使用而备受人们喜爱。是冬天暖手供暖的必备神器。 目前,市场常见的暖手宝大致有三个类型,分别是加热水的热水袋、通过化学反应放热的铁粉袋子和锂电供电的智能暖手宝。与常见的暖手宝不同&…

计算机网络期末复习-Part3

1、rdt1.0,rdt2.0,rdt3.0的底层信道模型 RDT 1.0: 完全可靠的底层信道,没有比特差错,也没有分组丢失。 RDT 2.0: 具有比特差错的底层信道,有比特差错,但没有分组丢失。 RDT 3.0: 具有差错和丢包的底层信道…

如何将BMP图片批量转为PNG透明图片,并去掉BMP黑色背景

将BMP图片批量转为PNG透明图片,并去掉BMP黑色背景,这里推荐一款软件bmp2png,关键是免费的。截图如下: 这个小软件不仅可以将bmp图片批量转为png图片,而且还增加了压缩功能,导出png图片时压缩导出图片&#…

jbase引入连接池

网站主题和代码生成器完事之后,ORM成为主要工作,之前只是搭了ORM的大体结构,没有详细优化和实现。这次引入连接池、把连接串信息从配置取、调整抛出异常。 连接池包选择c3p0,因为他稳定,用的多,下载引入c3…

Maven打包引入本地依赖包

Maven打包引入本地依赖包 SpringBoot 工程,Maven 在构建项目时,如何引入本地 Jar 包? 适合场景: 引用的依赖不在 Maven 仓库第三方公司提供的 SDK 包Maven 内网离线开发引入被定制改动过的 Jar 包 解决方法: 在 I…

nature日报:为什么印度德里现在的空气污染如此严重?

为什么印度德里现在的空气污染如此严重? 后季风季节为印度大城市的空气污染积累创造了理想的条件。 本文整理扩展自2023年11月10日nature杂志的NEWS EXPLAINER——Why is Delhi’s air pollution so bad right now? (nature.com) Highlights 季风期间&#xff0…

卡码网语言基础课 | 11. 句子缩写

目录 一、 字符串大小的比较 二、 ASCII码值 三、 基本框架代码 四、 解题思路 4.1 首字母问题 4.2 判定小写字母 4.3 小写字母转换为大写字母 五、空格判断 六、 代码模块化 6.1 满足的条件 6.2 代码完善 七、 题目解答 7.1 原始代码 7.2 改进代码 八、 拓展与…

Java_继承和多态

文章目录 前言继承继承语法继承总结super指定访问父级子类构造方法super和this再谈初始化(执行顺序)protected 关键字继承方式final 关键字继承与组合 多态动态绑定与静态绑定多态实现条件重写 前言 适合复习看 继承 继承语法 修饰符 class 子类 extends 父类 { // ... }子类…

[BJDCTF2020]Easy MD5 1

题目环境: 尝试了SQL注入、命令执行等都不行 点击提交并burp进行抓包Repeater进行重放这里看到了内置的SQL语句select * from admin where passwordmd5($pass,true) 发现传进去的值会进行md5加密 这里看了大佬们的解释 ffifdyop绕过,绕过原理是&#xff…

2023最新软件测试面试300问

一、Linux系统应用和环境配置 1、Linux系统的操作命令给我说10个,一般用什么工具远程连接Linux服务器? 2、Linux中的日志存储在哪里?怎么查看日志内容? 3、Linux中top和ps命令的区别? 4、Linux命令运行的结果如何写…

配置cuda和cudnn出现 libcudnn.so.8 is not a symbolic link问题

cuda版本为11.2 问题如图所示: 解决办法: sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_adv_train.so.8.1.1 /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_adv_train.so.8 sudo ln -sf /usr/local/cuda-11.2/targ…

CKA认证模块②-K8S企业运维和落地实战-2

CKA认证模块②-K8S企业运维和落地实战-2 K8S常见的存储方案及具体应用场景分析 k8s存储-empty emptyDir类型的Volume是在Pod分配到Node上时被创建,Kubernetes会在Node上自动分配一个目录,因此无需指定宿主机Node上对应的目录文件。 这个目录的初始内容…

用volta管理不同项目node版本

1 什么是volta volta是一个node.js的版本管理工具,你的电脑上安装了很多个node版本,volta可以让你在不同的项目中使用不同版本的node.js,并且可以切换node.js版本 Volta会自动将安装的Node.js版本与该项目绑定,使得您在该项目中执行 node、np…

【LLM_03】自然语言处理基础_1

一、自然语言处理基基本任务和应用1、自然语言处理的基本任务2、搜索引擎的基本工作原理3、知识图谱的构建4、应用 二、词表示与语言模型1、词表示2、上下文3、语言模型4、神经网络在语言模型的应用 三、神经网络1、神经网络基本组成元素2、如何训练神经网络3、计算图的概念4、…

巨好用又实用的18款3dMax插件!

3dMax是一款功能强大的 3D 软件,具有建模、动画、粒子动力学等许多强大功能。但并不是每个人都能有效地利用max的每一个功能,例如,很多人发现3dmax粒子流太难使用,3ds max蒙皮工具也是如此。 这让我们一些专业的开发公司或个人和…

it is missing from your system. Install or enable PHP‘s sodium extension.

Composer with –ignore-platform-reqext-sodium it is missing from your system. Install or enable PHP’s sodium extension. 出现如上的报错是的 开启php.ini中的 sodium的扩展