Java——面向对象进阶(二)

在这里插入图片描述

前言:
多态,包,final关键字,权限修饰符和代码块


文章目录

  • 一、多态
    • 1.1 概念
    • 1.2 多态存在条件
    • 1.3 多态中调用成员的特点
    • 1.4 instanceof关键字
  • 二、包
  • 三、权限修饰符
  • 四、final 关键字
    • 4.1 修饰类
    • 4.2 修饰方法
    • 4.3 修饰变量
  • 五、代码块
    • 5.1 局部代码块
    • 5.2 静态代码块
    • 5.3 构造代码块

一、多态

1.1 概念

首先我们要了解一下多态性和多态,这是两个不同的概念,多态性包括很多,例如运行时多态,编译时多态性等,而多态是具体的多态性实现。面向对象中的多态指的是运行时多态性的实现。

运行时多态: 方法的重写是运行时多态性的一种体现。同类型的对象,表现出不同的形态,即子类可以重写父类的方法,通过父类引用指向子类对象时,调用子类的方法实现。

1.2 多态存在条件

多态有以下的存在条件:

  1. 子类必须继承自同一个父类或者实现同一个接口
  2. 有方法重写
  3. 父类类型的引用指向子类对象。

1.3 多态中调用成员的特点

特点:

  • 变量调用:静态绑定(早期绑定),这意味着,即使引用类型是父类类型,访问属性时仍然使用父类中定义的变量。如果父类中没有这个变量,会编译失败。

    class Animal {String name = "Animal";void makeSound() {System.out.println("Animal makes a sound");}
    }class Dog extends Animal {String name = "Dog";@Overridevoid makeSound() {System.out.println("Dog barks");}
    }public class Main {public static void main(String[] args) {Animal myDog = new Dog();System.out.println(myDog.name); // 输出:AnimalmyDog.makeSound(); // 输出:Dog barks}
    }
    
  • 方法调用:动态绑定(后期绑定),方法调用在运行时而不是在编译时决定,这意味这调用的方法要看实际对象的类型。调用的方法一定要是重写的方法。

    class Animal {void makeSound() {System.out.println("Animal makes a sound");}
    }class Dog extends Animal {@Overridevoid makeSound() {System.out.println("Dog barks");}
    }class Cat extends Animal {@Overridevoid makeSound() {System.out.println("Cat meows");}
    }public class Main {public static void main(String[] args) {//父类类型的引用指向子类对象Animal myDog = new Dog();Animal myCat = new Cat();myDog.makeSound(); // 输出:Dog barksmyCat.makeSound(); // 输出:Cat meows}
    }
    

1.4 instanceof关键字

instanceof 关键字是 Java 中用于测试对象是否为某个特定类或其子类的实例的重要工具。它返回一个布尔值,指示对象是否是指定类或接口的一个实例。instanceof 关键字常用于安全地进行向下转型(将父类引用转换为子类引用)之前的类型检查。

instanceof 的语法

object instanceof ClassName

其中,object 是要进行检查的对象,ClassName 是要检查的类或接口。

class Animal {
}class Dog extends Animal {
}public class Main {public static void main(String[] args) {Animal myAnimal = new Dog();// 检查 myAnimal 是否是 Dog 类的实例if (myAnimal instanceof Dog) {System.out.println("myAnimal 是 Dog 类的一个实例");} else {System.out.println("myAnimal 不是 Dog 类的一个实例");}// 检查 myAnimal 是否是 Animal 类的实例if (myAnimal instanceof Animal) {System.out.println("myAnimal 是 Animal 一个的实例");} else {System.out.println("myAnimal 不是 Animal 一个的实例");}}
}

输出

myAnimal 是 Dog 类的一个实例
myAnimal 是 Animal 一个的实例

除此之外,JDK14提出了新特性,

object instanceof ClassName newObject

首先判断对象 object 存储的数据是不是 ClassName 类型,如果是,则返回true,并转换为 ClassName 类型的newObject 对象。


二、包

包(package) 是用于组织类和接口的一种机制。包提供了一种命名空间管理功能,可以避免命名冲突,并且有助于组织大型项目的代码结构。使用包还可以控制访问权限,限制某些类和接口只能在同一个包中访问。操作如下:
在这里插入图片描述

  1. 在类中声明包

    package com.example.myapp;
    
  2. 导入包
    使用 import 关键字导入其他包中的类或接口。

    import com.example.myapp.User;
    

    如果要导入整个包,可以使用通配符 *:

    import com.example.myapp.*;
    

在不同包下使用相同类:

//使用全类名的形式即可。
//全类名:包名 + 类名
//拷贝全类名的快捷键:选中类名crtl + shift + alt + c 或者用鼠标点copy,再点击copy Reference
com.example.demo1.Student s1 = new com.example.demo1.Student();
com.example.demo2.Student s2 = new com.example.demo2.Student();

三、权限修饰符

​ 在Java中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限。

  • public:公共的,所有地方都可以访问。

  • protected:本类 ,本包,其他包中的子类都可以访问。

  • 默认(没有修饰符):本类 ,本包可以访问。注意:默认是空着不写,不是default

  • private:私有的,当前类可以访问。

类内部同一包不同包中的子类不同包的无关类
public++++
protected+++
默认++
private+

四、final 关键字

使用final 关键字,表示修饰的内容不可变。

  • final 变量:值初始化后不可改变,即有且仅能被赋值一次。
  • final 方法:不能被子类重写。
  • final 类:不能被继承。

4.1 修饰类

final 类不能被继承,确保类的完整性。

public final class FinalClass {// 类内容
}// 编译错误,无法继承 final 类
// public class SubClass extends FinalClass {
// }

4.2 修饰方法

final 方法不能被子类重写,保证方法行为不被修改。

public class ParentClass {public final void finalMethod() {System.out.println("This method cannot be overridden");}
}public class ChildClass extends ParentClass {// 编译错误,无法重写 final 方法// public void finalMethod() {//     System.out.println("Trying to override");// }
}

4.3 修饰变量

  1. 局部变量
    必须在使用前初始化。

    public void myMethod() {final int localVar;localVar = 10;//localVar = 20; 编译错误,无法修改 final 变量
    }
    
  2. 成员变量
    必须在声明时或构造器中初始化。

    public class MyClass {final int CONSTANT = 10;final int anotherConstant;public MyClass(int value) {this.anotherConstant = value;}public void method() {// CONSTANT = 20; // 编译错误,无法修改 final 变量}
    }
    

注意:final 修饰不同类型时的区别

  1. final 修饰基本数据类型(包括intcharfloatboolean
    当 final 修饰基本数据类型变量时,该变量的值在初始化后不可更改。

    public class FinalExample {public static void main(String[] args) {final int x = 10;// x = 20; // 编译错误,无法修改 final 变量的值System.out.println("Final primitive value: " + x);}
    }
    
  2. final 修饰引用数据类型
    当 final 修饰引用数据类型变量时,该变量的引用在初始化后不可更改,但引用的对象的内容可以更改。

    public class FinalReferenceExample {public static void main(String[] args) {final StringBuilder sb = new StringBuilder("Hello");// sb = new StringBuilder("World"); // 编译错误,无法更改 final 引用// 可以修改对象的内容sb.append(" World");System.out.println("Final reference value: " + sb.toString());}
    }
    

五、代码块

在 Java 中,代码块(也称为块)是一组被大括号 {} 包围的语句。代码块分为以下几种类型:构造代码块、静态代码块、局部代码块。每种类型的代码块在程序执行中的作用和执行时机各不相同。

5.1 局部代码块

局部代码块是定义在方法中的一组语句,用于限制变量的作用范围。

public class LocalCodeBlockExample {public static void main(String[] args) {// 局部代码块{int x = 30;System.out.println("Local code block: x = " + x);}// System.out.println(x); // 编译错误,x 作用范围仅限于局部代码块}
}

5.2 静态代码块

静态初始化块在类加载时执行一次,用于初始化静态变量。静态初始化块在类加载时执行,而不是在创建实例时执行。

public class StaticInitializationBlockExample {private static int x;// 静态初始化块static {x = 20;System.out.println("Static initialization block: x = " + x);}public StaticInitializationBlockExample() {System.out.println("Constructor: x = " + x);}public static void main(String[] args) {StaticInitializationBlockExample example = new StaticInitializationBlockExample();}
}
//运行结果
//Static initialization block: x = 20
//Constructor: x = 20

5.3 构造代码块

构造块在每次创建类的实例时执行。它可以用来初始化实例变量。

public class InstanceInitializationBlockExample {private int x;// 实例初始化块{x = 10;System.out.println("Instance initialization block: x = " + x);}public InstanceInitializationBlockExample() {System.out.println("Constructor: x = " + x);}public static void main(String[] args) {InstanceInitializationBlockExample example = new InstanceInitializationBlockExample();}
}
//运行结果
//Instance initialization block: x = 10
//Constructor: x = 10

在这里插入图片描述
如果你喜欢这篇文章,点赞👍+评论+关注⭐️哦!
欢迎大家提出疑问,以及不同的见解。

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

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

相关文章

PHP开发的爱情盲盒交友系统网站源码

源码介绍 PHP开发的爱情盲盒交友系统网站源码 独立后台 源码截图 源码下载 PHP开发的爱情盲盒交友系统网站源码

CV预测:快速使用LeNet-5卷积神经网络

AI预测相关目录 AI预测流程,包括ETL、算法策略、算法模型、模型评估、可视化等相关内容 最好有基础的python算法预测经验 EEMD策略及踩坑VMD-CNN-LSTM时序预测对双向LSTM等模型添加自注意力机制K折叠交叉验证optuna超参数优化框架多任务学习-模型融合策略Transform…

vue3和ant-design 实现前端多种验证密码规则,最全的前端验证密码规则

1、小眼睛可以显示/隐藏明文密码(无法用input typepassword,用css样式实现切换明文) 2、输入长度统计(不是自带的,用div写的,然后定位到框内的) 3、每输入一个字符分别验证每一项规则&#xf…

神经网络 torch.nn---nn.LSTM()

torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) LSTM — PyTorch 2.3 documentation LSTM层的作用 LSTM层:长短时记忆网络层,它的主要作用是对输入序列进行处理,对序列中的每个元素进行编码并保存它们的状态,以便后续的处理。 …

藏品管理的发展历程

智能RFID藏品管理系统的发展是藏品管理领域的一项重大进步。它标志着从传统的手工记录方式向自动化、高效和智能化的管理方式的转变。通过RFID(Radio Frequency Identification)技术的应用,藏品管理系统实现了无接触、非视线范围内的数据读取…

绘唐3免费激活码

绘唐3免费激活码 绘唐3是一款网络绘画工具,可以用于绘制漫画和插画。你可以通过以下步骤下载绘唐3: 打开浏览器,搜索“绘唐阿祖”。在搜索结果中找到可靠的下载来源,例如官方网站或知名的软件下载网站。点击下载链接&#xff0c…

WinForm之TCP服务端

目录 一 原型 二 源码 一 原型 二 源码 using System.Net; using System.Net.Sockets; using System.Text;namespace TCP网络服务端通讯 {public partial class Form1 : Form{public Form1(){InitializeComponent();}TcpListener listener null;TcpClient handler null;Ne…

SAP BW:传输转换源系统-源系统映射关系

最近有朋友再问问我源系统映射关系怎么配置,想着写一个怕以后忘了。 简单说下这个是干嘛的,其实就是配置一个源系统到目标系统的一个映射,这样传输的时候才知道传过来的数据源要变成目标系统的数据源。 比如下图,在开发环境&…

用 C 语言实现求补码的运算

缘起 前两天程序中需要求一堆参数的补码,一时犯懒,想从CSDN上搜一个勉强能用的代码借鉴一下,结果几乎没有搜到一个靠谱的!这种求补码的操作,用脚趾头想想也应该知道要用C或者C的位运算来实现呀。结果搜到的一些实现方…

成长为AI产品经理的路线图

在广义上是指任何能够让计算机通过图灵测试的方法和系统,而狭义上则是指通过研究人类智能产生的方式来让电脑模拟人的智能。 对于AI产品经理做实际操作产品来说就是通过:大数据先进算法算力来完成的。 一、数据阶段 数据阶段:AI产品经理包含…

基于PSO粒子群优化的CNN-LSTM的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 卷积神经网络(CNN) 4.2 长短期记忆网络(LSTM) 4.3 CNN-LSTM结合PSO的时间序列预测 5.算法完整程序工程 1.算法运行效果图预览 2.算法运…

数据安全:Web3时代的隐私保护新标准

随着数字化时代的到来,我们的生活已经完全依赖于互联网和数据交换。然而,随之而来的是对个人隐私和数据安全的日益关注。在这个信息爆炸的时代,数据泄露、个人隐私侵犯和网络攻击等问题日益突出,而Web3技术的崛起正带来了一种全新…

django上课点名系统-计算机毕业设计源码03391

摘 要 随着现在网络的快速发展,网络的应用在各行各业当中它很快融入到了许多学校的眼球之中,他们利用网络来做这个签到点名的网站,随之就产生了“上课点名系统 ”,这样就让学生上课点名系统更加方便简单。 对于本上课点名系统的设…

CS5518芯片设计|替代GM8775设计方案|MIPI转LVDS芯片方案|DSI转LVDS芯片方案

CS5518支持常见的1920*1080分辨率的屏,支持视频格式为 FULL HD(1920 x 1200)。为MIPI DSI 转LVDS 双通道桥接芯片,实现将MIPI DSI信号转换为单/双通道 LVDS输出功能,MIPI 支持1/2/3/4 通道可选,支持 4Gbps 速率。LVDS …

Adaboost集成学习 | Matlab实现基于CNN-LSTM-Adaboost集成学习时间序列预测(股票价格预测)

目录 效果一览基本介绍模型设计程序设计参考资料 效果一览 基本介绍 Adaboost集成学习 | Matlab实现基于CNN-LSTM-Adaboost集成学习时间序列预测(股票价格预测) 模型设计 融合Adaboost的CNN-LSTM模型的时间序列预测,下面是一个基本的框架。 …

前端必看的2024 年 7 个 Web 前端开发趋势【文末福利=网盘分享2024web前端技术资料,学习资源】

目录 前言 趋势一:新的样式解决方案和组件库将持续涌现 趋势二:利用 AI 来增强开发流程 趋势三:SSR 和 SSG 两种框架之间的竞争将会愈演愈烈 趋势四:前端、后端和全栈开发之间的界限将越来越模糊 趋势五:越来越多的人…

Python数据库编程指南:连接与操作SQLite与MySQL

目录 一、引言 二、SQLite数据库连接与操作 (一)安装SQLite库 (二)建立数据库连接 (三)执行SQL语句 (四)注意事项 三、MySQL数据库连接与操作 (一)安…

阿里云 Ubuntu 22.04.4 LTS 安装postfix+dovecot 搭建邮件服务器

一 安装 1安装postfix sudo apt-get install postfix #如果没有弹出配置界面,运行 dpkg-reconfigure postfix #sudo vim /etc/postfix/main.cf smtpd_banner $myhostname ESMTP $mail_name (Ubuntu) biff no append_dot_mydomain no readme_directory no co…

Leetcode.2786 访问数组中的位置使分数最大

题目链接 Leetcode.2786 访问数组中的位置使分数最大 rating : 1732 题目描述 给你一个下标从 0 0 0 开始的整数数组 n u m s nums nums 和一个正整数 x x x 。 你 一开始 在数组的位置 0 0 0 处,你可以按照下述规则访问数组中的其他位置: 如果你…

阿里云 OpenSearch RAG 应用实践

2024年5月18日,阿里巴巴 OpenSearch 研发负责人刑少敏应邀参与AICon全球人工智能开发与应用大会暨大模型应用生态展,分享《OpenSearch RAG 应用实践》,介绍了阿里云OpenSearch在RAG方面的应用和探索。以下是主题演讲的逐字稿分享:…