Java编程思想3

文章目录

  • 一、访问权限控制
    • 1. 目的
    • 2. 访问权限修饰符:
    • 3.私有构造器
  • 二、复用类
    • 1. 组合(Composition):
    • 2. 继承(Inheritance):
    • 3. 基类的初始化:
    • 4. 在组合与继承之间选择:
      • 使用组合的情况:
      • 使用继承的情况:
    • 5. final关键字
      • 1. final 修饰类:
      • 2. final 修饰方法:
      • 3. final 修饰变量(字段):
  • 三、多态
    • 1. 多态的基本概念:
    • 2. 向上转型和向下转型:
    • 3. 运行时多态性:
    • 4. 抽象类和接口的多态性:
    • 5. 多态的应用场景:
    • 6. 注意事项和限制:
    • 7. 建议:


Java编程思想6~8章


一、访问权限控制

1. 目的

  • 封装: 通过将内部实现细节隐藏起来,只向外部提供必要的接口,提高代码的模块化和可维护性。
  • 安全性: 限制对某些敏感信息和操作的访问,提高程序的安全性。
  • 组织结构: 通过规范访问权限,帮助组织程序结构,降低耦合度。

2. 访问权限修饰符:

  • public: 公共的,对所有类可见。被声明为 public 的类、方法、变量可以被任何其他类访问。
  • protected: 受保护的,对同一包内的类和所有子类可见。被声明为 protected 的成员可以被同一包内的类和所有子类访问。
  • default(包私有): 如果没有使用上述任何关键字,默认为包私有。在同一包内可见,但对其他包的类不可见。
  • private: 私有的,仅对本类可见。被声明为 private 的成员只能被所在类的方法访问。

3.私有构造器

当我们写了一个工具类以后,我们可以给它编写一个私有构造器,这样可以防止别人创建它的实例再使用,减少重复创建实例的时间和空间,只需要通过类名.方法名调用即可。

二、复用类

1. 组合(Composition):

组合是通过将一个类的对象嵌入到另一个类中来实现复用。这种方式允许一个类使用另一个类的功能,但不会继承其实现。

class Engine {// 引擎的实现
}class Car {private Engine engine;public Car(Engine engine) {this.engine = engine;}public void start() {engine.start();}
}

2. 继承(Inheritance):

继承是通过创建一个新类,使用已有类的属性和方法,然后在新类中添加或修改功能来实现复用。

class Animal {public void eat() {// 动物吃东西的行为}
}class Dog extends Animal {public void bark() {// 狗叫的行为}
}

3. 基类的初始化:

在继承中,基类的初始化是通过调用基类的构造方法来实现的。子类在创建实例时,需要首先初始化基类的状态,然后再添加自己的额外状态。

在Java中,使用 super() 调用基类的构造方法,这必须是子类构造方法的第一条语句。如果子类的构造方法没有显式调用 super(),则默认会调用基类的无参构造方法。如果基类没有提供无参构造方法,并且子类没有显式调用基类的其他构造方法,那么编译器将报错。

class Animal {private String name;public Animal(String name) {this.name = name;System.out.println("Animal constructor");}public void eat() {System.out.println(name + " is eating");}
}class Dog extends Animal {private String breed;public Dog(String name, String breed) {super(name);  // 调用基类构造方法this.breed = breed;System.out.println("Dog constructor");}public void bark() {System.out.println(breed + " dog is barking");}
}public class Main {public static void main(String[] args) {Dog myDog = new Dog("Buddy", "Golden Retriever");myDog.eat();  // 调用基类方法myDog.bark(); // 调用子类方法}
}

在上述例子中,Dog 类继承自 Animal 类。在 Dog 的构造方法中,通过 super(name) 调用了基类 Animal 的构造方法。这样,当创建 Dog 的实例时,首先会执行 Animal 的构造方法,然后再执行 Dog 的构造方法。

4. 在组合与继承之间选择:

使用组合的情况:

松散的耦合(Loose Coupling):

当对象之间的关系需要在运行时动态确定,或者需要更灵活的对象替换时,组合是一个较好的选择。对象之间通过接口进行通信,而不是通过继承关系。

动态配置对象行为:

当需要在运行时动态配置或更改对象的行为时,组合可以提供更灵活的方式。通过替换或添加组件,可以修改对象的行为。

代码复用:

当想要实现代码复用而不引入继承的复杂性时,组合是一种更灵活的选择。可以通过组合来构建包含所需功能的对象,而不必考虑继承层次结构。

接口和多态性需求:

当希望通过接口实现多态性,使得对象能够以相似的方式被使用时,组合通常是更好的选择。通过接口定义,对象可以替换为具有相同接口的其他对象。

使用继承的情况:

是一个关系(Is-a Relationship):

当子类对象是父类对象的一种类型时,适合使用继承。例如,狗是动物的一种类型。

共享基本行为:

当多个类具有共享的基本行为,并且这些行为在整个继承层次结构中都是一致的时,使用继承可以减少代码的重复。

抽象基类:

当希望创建一个通用的抽象基类,而具体的实现由子类提供时,可以使用继承。这对于框架和库的设计很常见。

扩展已有类:

当需要扩展已有类的功能,并且新类可以被视为原始类的扩展时,继承是一种自然的选择。这符合“是一个”关系。

5. final关键字

final 是一个关键字,它可以用于修饰类、方法和变量。final 的主要作用是表示不可改变的、不可继承的、或者不可覆盖的。

1. final 修饰类:

当一个类被声明为 final 时,它表示这个类不能被其他类继承。这通常用于防止对类的进一步修改和扩展。

2. final 修饰方法:

当一个方法被声明为 final 时,它表示这个方法不能被子类覆盖(即不能被重写)。

3. final 修饰变量(字段):

当一个变量(字段)被声明为 final 时,它表示这个变量的值只能被赋值一次,之后不能再修改(成员变量只能在定义时或者构造器中赋值)。对于基本数据类型,这意味着其数值不可改变;对于引用类型,这意味着引用不可变,但对象本身的状态可能是可变的。

class Example {// final 常量,只能被赋值一次final int CONSTANT_VALUE = 10;// final 引用,引用不可变,但对象本身的状态可能是可变的final StringBuilder stringBuilder = new StringBuilder("Hello");void modifyValues() {// 编译错误,不能修改 final 常量的值// CONSTANT_VALUE = 20;// 可以修改 final 引用所指向的对象的状态stringBuilder.append(", World!");}
}

三、多态

1. 多态的基本概念:

  • 多态(Polymorphism): 多态是面向对象编程的一个核心概念,它允许不同的子类对象被视为相同的父类对象。

  • 方法重写(Method Overriding): 子类可以提供与父类中相同签名的方法,并重新定义其实现。

2. 向上转型和向下转型:

  • 向上转型(Upcasting): 将子类对象赋给父类引用。例如:Animal myDog = new Dog();

  • 向下转型(Downcasting): 将父类引用转换为子类引用。需要使用强制类型转换,但要注意转型的安全性。

3. 运行时多态性:

  • 动态绑定(Dynamic Binding): 在运行时确定对象的类型,并调用相应的方法。

  • 运行时类型信息(RTTI): 使用 instanceof 操作符检查对象的实际类型。

4. 抽象类和接口的多态性:

  • 抽象类(Abstract Class): 抽象类可以包含抽象方法,子类必须提供实现。可以使用多态性创建指向子类对象的引用。

  • 接口(Interface): 接口定义规范,实现类提供具体实现。通过接口可以实现多态性。

5. 多态的应用场景:

  • 灵活性和可扩展性: 多态性提高了代码的灵活性,使得程序更容易适应变化和扩展。

  • 代码复用: 通过多态性,可以将同一接口的不同实现交替使用,实现代码的复用。

6. 注意事项和限制:

  • 方法私有化: 私有方法不会被继承,因此不具备多态性。

  • 静态方法和字段: 静态方法和字段属于类,而不是实例,因此不具备多态性。

  • 构造器和多态: 构造器不具备多态性,因为在对象构造之前,它的类型已经确定。

7. 建议:

  • 遵循多态的原则: 利用多态性设计灵活且易于扩展的代码。

  • 理解继承层次结构: 多态性依赖于继承关系,理解类的层次结构对正确使用多态性非常重要。

  • RTTI 的谨慎使用: 使用 instanceof 操作符时需小心,过度使用可能暗示设计上的问题。

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

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

相关文章

vulnhub靶场之DC-5

一.环境搭建 1.靶场描述 DC-5 is another purposely built vulnerable lab with the intent of gaining experience in the world of penetration testing. The plan was for DC-5 to kick it up a notch, so this might not be great for beginners, but should be ok for p…

el-select 单选时,选择后输入框的is-focus状态并没有取消

前两天在封装组件的时候,发现el-select 单选时,选择后输入框的is-focus状态并没有取消,需要手动点其它地方才会取消,于是想着找找为什么 一、通过调试源码发现,输入框在点击选项后触发blur,紧接着又触发了…

STM32学习笔记二十一:WS2812制作像素游戏屏-飞行射击游戏(11)探索游戏脚本

还记得上次在第十七章中为BOSS创建的路径动画吧。我们写了一大坨的代码来描述BOSS的运动路径,但凡是写过几年代码的人都不会干出这样的事情。-_-! 没办法,谁叫那时候还没有脚本呢。这章就来补齐这块短板。 脚本属于配置化的一种,你可以把脚…

大模型学习与实践笔记(四)

一、大模型开发范式 RAG(Retrieval Augmented Generation)检索增强生成,即大模型LLM在回答问题或生成文本时,会先从大量的文档中检索出相关信息,然后基于这些检索出的信息进行回答或生成文本,从而可以提高回…

【实用技巧】Steam Wallpaper Engine 壁纸引擎向手机导入壁纸方法

一、内容简介 本文介绍如何使用电脑上的 Wallpaper Engine (Steam 平台中的壁纸引擎)向安卓手机导入并使用壁纸。 二、所需原材料 安卓手机(以笔者使用的华为荣耀50为例)、安装有Steam以及Wallpaper Engine的电脑 三、导入方法…

c++最值查找

目录 min和max函数 min_element和max_element 例 nth_element函数 例 例题 题目描述 输入描述 输出描述 解 min和max函数 只能传入两个值或一个列表 时间复杂度为O(1),数组O(n),n为元素个数 min_element和max_element min_element(st,ed)返回地址[st,…

Rust 最新版1.75.0升级记

升级方法 稳定版 C:\>rustup update stable info: syncing channel updates for stable-x86_64-pc-windows-msvc info: latest update on 2023-12-28, rust version 1.75.0 (82e1608df 2023-12-21) info: downloading component cargo 5.9 MiB / 5.9 MiB (100 %) 3.…

宏集案例丨宏集PC Runtime软件助推食品行业生产线数字化革新

来源:宏集科技 工业物联网 宏集案例丨宏集PC Runtime软件助推食品行业生产线数字化革新 原文链接:https://mp.weixin.qq.com/s/DwzVzifUiidNr-FT3Zfzpg 欢迎关注虹科,为您提供最新资讯! 01 前言 近年来,中国食品行业…

微服务治理:为什么要分析微服务的依赖关系?

在微服务架构中,单个服务相互协作以交付功能。这些协作会在服务之间形成依赖关系,其中一个服务依靠另一个服务来完成自己的任务。虽然依赖关系使功能得以实现,但不受控制的依赖关系可能会导致一系列挑战: 复杂性: 错综复杂的依赖…

html+css实现子元素完全居中常见方案

详细过程 查看公众号文章 htmlcss实现子元素完全居中常见方案 获取更多内容,请关注微信公众号。搜索“码圈小橙子”,或扫描下方二维码获取关注

FFmpeg编程录制音频(Mac OS)

之前我们使用FFmpeg命令行工具进行了简单的音视频操作,这次在Mac OS环境下编写代码实现简单的音频录制功能。 FFmpeg命令行音频录制 首先回顾一下Mac OS环境下简单的音频录制命令行实现: ffmpeg -f avfoundation -i ":0" -t 20 -acodec pcm…

opencv拉流出现missing picture in access unit with size 4错误解决

0、应用场景问题 我们使用opencv作为拉流客户端,获取画面后进行图像处理并推流(使用ffmpeg库)。 opencv解码同样使用ffmpeg库。 我们要求opencv能根据业务不断进行拉流操作,等效的逻辑代码如下: while(1) {printf(&…

MATLAB最小二乘法曲线拟合及消除多项式趋势项代码实例

1.最小二乘法拟合基本概念 MATLAB最小二乘法曲线拟合及消除多项式趋势项代码实例 最小二乘法是一种数学优化技术,它通过最小化误差的平方和寻找数据的最佳函数匹配。优化是找到最小值或等式的数值解的问题。而线性回归就是要求样本回归函数尽可能好地拟合目标函数值,也就是说…

gazebo模型库目录(国内源)

这个是比较普遍的,一般用途: GitCode - 开发者的代码家园https://gitcode.com/geniusChinaHN/osrf.gazebo_models/tree/master/ambulance这个主要是车辆: car_demo: osrf汽车模型库https://gitee.com/geniuschinahn/car_demo还有这个是以前…

YOLOv6s,map值打印成两位小数(原本是显示0.538,变成显示为53.79)

显示结果 更改前: 更改后: 方法 将tools/eval.py中的--do_pr_metric后面改为defaultTrue即可打印出map值原本是显示0.538,变成显示为53.79,方法为👇 在YOLOv6-main/yolov6/core/evaler.py中做如下更改&#xff1a…

对回调函数的各种讲解说明

有没有跟我师弟一样的童靴~,学习和使用ROS节点时,对其中的callback函数一直摸不着头脑的,以下这么多回调函数的讲解,挨个看,你总会懂的O.o 回调函数怎么调用,如何定义回调函数: 回调函数怎么调用,如何定义…

最大公共子串

解题思路: 解题代码: UP主运用的方法很巧妙。厉害。

IPv6路由协议----BGP4+

BGP基本概念 边界网关协议BGP(Border Gateway Protocol)是一种实现自治系统AS(Autonomous System)之间的路由可达,并选择最佳路由的距离矢量路由协议。 MP-BGP是对BGP4进行了扩展达到在不同网络中应用的目的,BGP4原有的消息机制和路由机制并没有改变。MP-BGP在IPv6单播网…

day1·算法-双指针

今天是第一天,GUNDOM带你学算法,跟上我的节奏吗,一起闪击蓝桥杯! 正文展开,今天先上点小菜供大家想用,如有错误或者建议直接放评论区,我会一个一个仔细查看的哦。 双方指针问题一般是在数组中…

QT 小组件 列表框以及微调框

.cpp文件 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);QListWidgetItem *pPhone new QListWidgetItem;pPhone->setText("西瓜");pPhone->…