Java面向对象 访问控制权限

目录

  • 访问控制权限
  • 继承
  • 多态
  • 组合
  • 代理
  • 向上转型
  • static
  • final

访问控制权限

访问控制权限⼜称为封装 ,它是⾯向对象三⼤特性中的⼀种,我之前在学习过程中经常会忽略封装,⼼想这不就是⼀个访问修饰符么,怎么就是三⼤特性的必要条件了?后来我才知道,如果你信任的下属对你隐瞒 bug,你是根本不知道的。

访问控制权限其实最核⼼就是⼀点:只对需要的类可⻅。

  • Java中成员的访问权限共有四种,分别是 public、protected、default、private,它们的可⻅性如下
privatedefaultprotectedpublic
同一类
同一包中的类
子类
其他包中的类
  • ✔表示是可以进行访问

继承

继承是所有 OOP(Object Oriented Programming) 语⾔和 Java 语⾔都不可或缺的⼀部分。只要我们创建了⼀个类,就隐式的继承⾃ Object ⽗类,只不过没有指定。如果你显示指定了⽗类,那么你继承于⽗类,⽽你的⽗类继承于 Object 类。

继承的关键字是 extends ,如上图所示,如果使⽤了 extends 显示指定了继承,那么我们可以说Father 是⽗类,⽽ Son 是⼦类,⽤代码表示如下

class Father{}class Son extends Father{}
  • 继承双⽅拥有某种共性的特征
 class Father{public void feature(){System.out.println("⽗亲的特征");}}class Son extends Father {}

如果 Son 没有实现⾃⼰的⽅法的话,那么默认就是⽤的是⽗类的 feature ⽅法。如果⼦类实现了⾃⼰的 feature ⽅法,那么就相当于是重写了⽗类的 feature ⽅法,这也是我们上⾯提到的重写了。

多态

多态指的是同⼀个⾏为具有多个不同表现形式。是指⼀个类实例(对象)的相同⽅法在不同情形下具有
不同表现形式。封装和继承是多态的基础,也就是说,多态只是⼀种表现形式⽽已。

  • 如何实现多态?多态的实现具有三种充要条件
    • 继承
    • 重写⽗类⽅法
    • ⽗类引⽤指向⼦类对象

⽐如下⾯这段代码

public class Fruit {int num;public void eat(){System.out.println("eat Fruit");}}public class Apple extends Fruit{@Overridepublic void eat() {super.num = 10;System.out.println("eat " + num + " Apple");}public static void main(String[] args) {Fruit fruit = new Apple();fruit.eat();}}

你可以发现 main ⽅法中有⼀个很神奇的地⽅,Fruit fruit = new Apple()Fruit 类型的对象竟然指向了 Apple 对象的引⽤,这其实就是多态 -> ⽗类引⽤指向⼦类对象,因为 Apple 继承于Fruit,并且重写了 eat ⽅法,所以能够表现出来多种状态的形式。

组合

组合其实不难理解,就是将对象引⽤置于新类中即可。组合也是⼀种提⾼类的复⽤性的⼀种⽅式。如果你想让类具有更多的扩展功能,你需要记住⼀句话多⽤组合,少⽤继承。

public class SoccerPlayer {private String name;private Soccer soccer;}public class Soccer {private String soccerName;    
}

代码中 SoccerPlayer 引⽤了 Soccer 类,通过引⽤ Soccer 类,来达到调⽤ soccer 中的属性和⽅法。
组合和继承是有区别的,它们的主要区别如下。

代理

除了继承和组合外,另外⼀种值得探讨的关系模型称为 代理。代理的⼤致描述是,A 想要调⽤ B 类的⽅法,A 不直接调⽤,A 会在⾃⼰的类中创建⼀个 B 对象的代理,再由代理调⽤ B 的⽅法。例如如下代码

public class Destination {public void todo(){System.out.println("control...");}}public class Device {private String name;private Destination destination;private DeviceController deviceController;public void control(Destination destination){destination.todo();}}public class DeviceController {private Device name;private Destination destination;public void control(Destination destination){destination.todo();}}

向上转型

  • 向上转型代表了⽗类与⼦类之间的关系,其实⽗类和⼦类之间不仅仅有向上转型,还有向下转型,它们
    的转型后的范围不⼀样
    向上转型 :通过⼦类对象(⼩范围)转化为⽗类对象(⼤范围),这种转换是⾃动完成的,不⽤强制。
    向下转型 : 通过⽗类对象(⼤范围)实例化⼦类对象(⼩范围),这种转换不是⾃动完成的,需要强制
    指定。

static

static 是 Java 中的关键字,它的意思是 静态的 ,static 可以⽤来修饰成员变量和⽅法,static⽤在没有创建对象的情况下调⽤ ⽅法/变量。

  • ⽤ static 声明的成员变量为静态成员变量,也成为类变量。类变量的⽣命周期和类相同,在整个应⽤程序执⾏期间都有效。
static String name = "ikvn";
  • 使⽤ static 修饰的⽅法称为静态⽅法,静态⽅法能够直接使⽤类名.⽅法名 进⾏调⽤。由于静态⽅法不依赖于任何对象就可以直接访问,因此对于静态⽅法来说,是没有 this 关键字的,实例变量都会有 this 关键字。在静态⽅法中不能访问类的⾮静态成员变量和⾮静态⽅法,
static void printMessage(){System.out.println("cxuan is writing the article");}

static 除了修饰属性和⽅法外,还有静态代码块 的功能,可⽤于类的初始化操作。进⽽提升程序的性能。

public class StaicBlock {static{System.out.println("I'm A static code block");}}

由于静态代码块随着类的加载⽽执⾏,因此,很多时候会将只需要进⾏⼀次的初始化操作放在 static 代码块中进⾏。

final

  • final 的意思是最后的、最终的,它可以修饰类、属性和⽅法。
    • final 修饰类时,表明这个类不能被继承。final 类中的成员变量可以根据需要设为 final,但是要注
      意 final 类中的所有成员⽅法都会被隐式地指定为 final ⽅法。
    • final 修饰⽅法时,表明这个⽅法不能被任何⼦类重写,因此,如果只有在想明确禁⽌该⽅法在⼦
      类中被覆盖的情况下才将⽅法设置为 final
    • final 修饰变量分为两种情况,⼀种是修饰基本数据类型,表示数据类型的值不能被修改;⼀种是
      修饰引⽤类型,表示对其初始化之后便不能再让其指向另⼀个对象。

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

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

相关文章

uniapp的配置和使用

①安装环境和编辑器 注册小程序账号 微信开发者工具下载 uniapp 官网 HbuilderX 下载 首先先下载Hbuilder和微信开发者工具 (都是傻瓜式安装),然后注册小程序账号: 拿到appid: ②简单通过demo使用微信开发者工具和…

在Linux系统中设置全局HTTP代理的步骤与技巧

在Linux系统中,设置全局HTTP代理可以方便我们统一管理和控制网络请求。这不仅可以帮助我们加速网络访问,还可以在某些情况下绕过网络限制或实现匿名上网。下面,我将为你详细介绍在Linux系统中设置全局HTTP代理的步骤与技巧。 步骤一&#xf…

windows10安装配置nvm以达到切换nodejs的目的

前言 各种各样的项目,各种node环境,还有node_modules这个庞然大物。。想想都觉得恐怖。 所以现在有了:nvm-切换node环境,pnpm–解决重复下载同样类库的问题。 下面将就如何在win10下配置进行说明 nvm下载配置 nvm的github下载地…

Python DNS操作详解

在网络世界中,DNS(Domain Name System)扮演着重要的角色,它是一种分布式数据库系统,用于将域名(如 google.com)转换为相应的 IP 地址(如 172.217.7.206)。DNS 可以被视为…

【Flink】SQL-CLIENT中出现 Could not find any factory for identifier ‘kafka‘

在Flink的sql-client客户端中执行sql代码时出现如下错误,版本Flink1.13.6 [ERROR] Could not execute SQL statement. Reason: org.apache.flink.table.api.ValidationException: Could not find any factory for identifier kafka that implements org.apache.flink.table.fa…

nginx: [error] invalid PID number ““ in “/usr/local/nginx/logs/nginx.pid“

问题描述 执行nginx -s reload时,出现如下错误 [rootiZuf65h6i43ltlzhqolumyZ conf]# ../sbin/nginx -s reload nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"解决办法 因为每一个nginx进程都对应一个id&…

配置ARM交叉编译工具的通用步骤

ARM交叉编译工具是用于编译在ARM架构上运行的代码的工具。这些工具允许开发者在一种架构(通常是x86或x64)上编写和编译代码,然后将其移植到ARM架构上运行。 ARM交叉编译工具链通常包括编译器、链接器、调试器和其他必要的工具,用…

【开源】JAVA+Vue+SpringBoot实现班级考勤管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统基础支持模块2.2 班级学生教师支持模块2.3 考勤签到管理2.4 学生请假管理 三、系统设计3.1 功能设计3.1.1 系统基础支持模块3.1.2 班级学生教师档案模块3.1.3 考勤签到管理模块3.1.4 学生请假管理模块 3.2 数据库设…

OpenCV 图像处理六(傅里叶变换、模板匹配与霍夫变换)

文章目录 一、傅里叶变换1.1 NumPy实现和逆实现1.1.1 NumPy实现傅里叶变换Demo 1.1.2 NumPy实现逆傅里叶变换Demo 1.2 OpenCV实现和逆实现1.2.1 OpenCV实现傅里叶变换Demo 1.2.2 OpenCV实现逆傅里叶变换Demo 1.3 频域滤波1.3.1低频、高频1.3.2 高通滤波器构造高通滤波器Demo 1.…

JavaScript 涉及模式之外观模式

外观模式 我们为啥要使用外观模式呢,其实我们在使用各种 js 库的时候常常会看到很多的外观者模式,也正是这些库的大量使用,所以使得兼容性更广泛,通过外观者模式来封装多个功能,简化底层操作方法 const A {g: functi…

基金分类

一、按基金运作方式分类 (一)封闭式基金 是基金份额总额在期限内固定不变,在期限内不可申购和赎回。 (二)开放式基金 是基金份额总额不固定,在期限内可以申购和赎回。 这里的开放式基金特指传统的开放式基…

Django前后端分离之后端实践

django-admin startproject djweb 生成djweb项目 django-admin startapp news 生成news应用 配置models文件 class NewInfo(models.Model):title models.CharField(max_length30)content models.TextField()b_date models.DateField()read models.IntegerFie…

linux查看当前连接的IP

linux下查询当前所有连接的ip_linux查看某个ip的连接-CSDN博客 netstat -ntu | grep tcp | awk {print $5} | cut -d: -f1 | sort | uniq -c | sort -nr

Blazor Wasm Gitee 码云登录

目录: OpenID 与 OAuth2 基础知识Blazor wasm Google 登录Blazor wasm Gitee 码云登录Blazor SSR/WASM IDS/OIDC 单点登录授权实例1-建立和配置IDS身份验证服务Blazor SSR/WASM IDS/OIDC 单点登录授权实例2-登录信息组件wasmBlazor SSR/WASM IDS/OIDC 单点登录授权实例3-服务端…

C语言中在main函数之后运行的函数

在 Linux 平台上&#xff0c;atexit 函数同样是一个用于注册终止处理函数的库函数&#xff0c;它是 C 标准库 <stdlib.h> 的一部分。atexit 函数允许你注册一个或多个函数&#xff0c;这些函数会在 main 函数执行结束后&#xff0c;或者在调用 exit 函数时&#xff0c;由…

ClickHouse--01--简介

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. ClickHouse 简介1.1 大数据处理场景1.2 什么是 ClickHouse1.3 OLAP 场景的特征 2. ClickHouse 特性2.1 完备的 DBMS 功能2.2 列式存储行式存储: 在数据写入和修改…

OpenEuler20.03LTS SP2 上安装 OpenGauss3.0.0 单机部署过程(二)

开始安装 OpenGauss 数据库 3.1.7 安装依赖包 (说明:如果可以联网,可以通过网络 yum 安装所需依赖包,既可以跳过本步骤。如果网络无法连通,请把本文档所在目录下的依赖包上传到服务器上,手工安装后,即无需通过网络进行 Yum 安装了): 上传:libaio-0.3.111-5.oe1.x8…

保研机试算法训练个人记录笔记(四)——哈希算法

目录 两数之和 字母异位词分组 最长连续序列 力扣热题100——哈希算法 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答…

wireshark抓包问题及学习

wireshark抓包问题及学习 【场景1】服务A请求服务B经常超过3s&#xff0c;报错i/o timeout&#xff0c;想看下是否网络波动或者负载太高。需要抓包分析。 问题1&#xff1a; 超时时间不定&#xff0c;且请求量过大&#xff0c;一直抓了存文件里抓包文件过大。 解决学习&…

三、搜索与图论

DFS 排列数字 #include<iostream> using namespace std; const int N 10; int a[N], b[N]; int n;void dfs(int u){if(u > n){for(int i 1; i < n; i)cout<<a[i]<<" ";cout<<endl;return;}for(int i 1; i < n; i){if(!b[i]){b[…