Java访问一口气讲完!o(*≧▽≦)ツ┏━┓

Java this关键字

Java面向对象设计 - Java this关键字

什么是 this?

Java有一个名为 this 的关键字。它是对类的当前实例的引用。

它只能在实例的上下文中使用。

以下代码显示如何使用this关键字。

public class Main {int varA = 1;int varB = varA; // Assign value of varA to varBint varC = this.varA; // Assign value of varA to varC
}

当实例变量或类变量被具有相同名称的另一个变量隐藏时,我们需要使用关键字this限定一个实例变量,并使用类名称定义一个类变量。

使用 this 来区分当前对象。

Java 中为解决变量的命名冲突和不确定性问题,引入关键字 this 代表其所在方法的当前对象的引用:

  1. 构造方法中指该构造器所创建的新对象;
  2. 方法中指调用该方法的对象;
  3. 在类本身的方法或构造器中引用该类的实例变量(全局变量)和方法。

this 只能用在构造器或者方法中,用于获得调用当前的构造器方法的对象引用。可以和任何的对象引用一样来处理这个this对象。

说明:
  1. 当实例变量和局部变量重名,JAVA 平台会按照先局部变量、后实例变量的顺序寻找。即,方法中使用到的变量的寻找规律是先找局部变量,再找实例变量。如果没用找到,将会有一个编译错误而无法通过编译。
  2. 如果使用 this.a,则不会在方法(局部变量)中寻找变量 a ,而是直接去实例变量中去寻找,如果寻找不到,则会有一个编译错误。
  3. 在一个方法内,如果没有出现局部变量和实例变量重名的情况下,是否使用 this 关键字是没有区别的。
  4. 在同一个类中,Java 普通方法的互相调用可以省略 ​this. ​,而直接使用方法名 + 参数。因为 Java 编译器会帮我们加上。

例子

下面的代码显示了如何使用 this 关键字来引用一个实例变量,它的名字被一个局部变量隐藏。

public class Main {int num = 2014; // An instance variablevoid printNum(int num) {System.out.println("Parameter num: " + num);System.out.println("Instance variable num: " + this.num);}public static void main(String[] args) {Main tt6 = new Main();tt6.printNum(2000);}
}

上面的代码生成以下结果。

注意

下面的代码显示了如何使用 this 关键字来引用一个实例变量,它的名字被一个局部变量隐藏。

例如,以下代码非常常见:

Student 类声明了一个实例变量 id。在其 setId() 方法中,它还命名参数 id,并使用 this.id 引用实例变量。

它还使用 this.id 在其 getId() 方法中引用实例变量id。

public class Student {private int id; // An instance variablepublic void setId(int id) {this.id = id;}public int getId() {return this.id;}
}

我们可以使用关键字 this 来限定实例方法名称。以下代码显示使用关键字 this 调用 m2() 方法的 m1() 方法。

public class Main {void m1() {// Invoke the m2() methodthis.m2(); // same as "m2();"}void m2() {// do something}
}

Java 访问级别成员

Java面向对象设计 - Java访问级别成员

类可以是public或default(或包级别)。

类成员的访问级别确定程序的哪个区域可以访问它。以下四个访问级别修饰符之一可以用于类成员:

  • public
  • private
  • protected
  • Default 或者 package-level访问

前三种类型的访问级别使用以下三个关键字之一指定:public,private或protected。

第四种类型称为默认访问级别(或包级别),并且通过不使用访问修饰符来指定。

如果使用 public 关键字将类成员声明为public,则可以从Java代码中的任何位置访问它,如果类本身是可访问的。

如果使用 private 关键字将类成员声明为private,则只能在声明类的主体内访问,而在其他任何地方都不能访问。

如果使用 protected 关键字将类成员声明为protected,则可以从同一个包或从类的后代访问,即使后代位于不同的包中也是如此。

如果我们不为类成员使用任何访问级别修改器,则它具有包级别访问权限。具有包级别访问权限的类成员可以从同一个包访问。

类成员的访问级别可以从最严格到最不严格,作为private,package-level,protected和public。

例子

以下代码显示如何使用不同的访问级别:

public class Main {private int num1; // private access levelint num2; // package-level accessprotected int num3; // protected access levelpublic int num4; // public access levelpublic static int count = 1; // public access level// private access levelprivate void m1() {}// package-level accessvoid m2() {}// protected access levelprotected void m3() {}// public access levelpublic void m4() {}// private access levelprivate static void doSometing() {}
}

注意

可以为类的实例和静态成员指定访问级别。

它是一个约定,指定访问级别修改器作为声明中的第一个修饰符。

要声明静态公共字段,请首先使用 public 修饰符,然后使用 static 修饰符作为约定。

我们必须考虑类及其成员的访问级别,以确定类成员是否可访问。

以下代码显示了如何在创建Java bean时使用访问级别修饰符。

class Account {private double balance;public double getBalance() {return this.balance;}public int save(double amount) {if (amount < 0.0 || Double.isNaN(amount) || Double.isInfinite(amount)) {System.out.println("Invalid credit amount:  " + amount);return -1;}this.balance = this.balance + amount;return 1;}public int spend(double amount) {if (amount < 0.0 || Double.isNaN(amount) || Double.isInfinite(amount)) {System.out.println("Invalid debit amount:  " + amount);return -1;}if (this.balance < amount) {System.out.println("Insufficient  fund. Debit   attempted: " + amount);return -1;}this.balance = this.balance - amount;return 1;}
}public class Main {public static void main(String[] args) {Account ac = new Account();double balance = ac.getBalance();System.out.println("Balance = " + balance);ac.save(2);ac.spend(1);balance = ac.getBalance();System.out.println("Balance = " + balance);// Attempt to credit and debit invalid amountsac.save(-2);ac.spend(Double.POSITIVE_INFINITY);balance = ac.getBalance();System.out.println("Balance = " + balance);// Attempt to debit more than the balanceac.spend(200.00);balance = ac.getBalance();System.out.println("Balance = " + balance);}
}

上面的代码生成以下结果。

Java final关键字 

Java面向对象设计 - Java final关键字

final关键字不允许修改或替换其原始值或定义。

final关键字可以在以下三个上下文中使用:

  • 变量声明
  • 类声明
  • 方法声明

final 变量

如果一个变量被声明为final,它只能被赋值一次。最终变量的值在设置后不能修改。

变量声明包括局部变量的声明,方法/构造函数的形式参数,实例变量和类变量。

变量声明包括局部变量的声明,方法/构造函数的形式参数,实例变量和类变量。

final int YES  = 1;

我们可以只设置一次final变量的值。

有两种方法来初始化final变量:

  • 在声明时予以初始化。
  • 将其初始化延迟到稍后的时间。

但是,我们必须在第一次读取最终变量之前初始化它。

  • final局部变量

    你可以声明一个局部变量fi​​nal。如果将局部变量声明为空的最终变量,则必须在使用前初始化它。

  • final参数

    我们可以声明一个参数final。当调用方法或构造函数时,参数将使用实际参数的值自动初始化。

    因此,您不能更改方法或构造函数体内的最终形式参数的值。

  • final实例变量

    我们可以声明一个实例变量final和blank final。

    空白最终实例变量必须初始化一次,并且只有在调用类的任何构造函数时才初始化一次。

  • final类变量

    我们可以声明一个类变量final和blank final。我们必须在其中一个静态初始化器中初始化一个空的最终类变量。

  • final引用变量

    引用变量存储对象的引用。最终引用变量意味着,一旦引用一个对象(或null),它就不能被修改以引用另一个对象。

以下代码显示了test2()方法的最终形式参数x:

public void  test2(final int x)  {

如果我们有一个类的多个静态初始化器,我们必须在一个静态初始化器中初始化所有空的最终类变量一次。

public class Main {public static final int YES = 1;public static final int NO = 2;public static final String MSG;static {MSG = "final static variable";}
}

final 类

如果一个类被声明为final,它不能被扩展(或子类化)。

final 方法

如果一个方法声明为final,它不能在包含该方法的类的子类中重新定义(覆盖或隐藏)。

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

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

相关文章

深入探索Docker核心原理:从Libcontainer到runC的演化与实现

随着容器技术的发展&#xff0c;Docker从早期的Libcontainer逐步演化到runC&#xff0c;推动了容器运行时的标准化进程。Libcontainer是Docker容器的核心管理工具&#xff0c;而runC则在此基础上发展成为符合OCI&#xff08;Open Container Initiative&#xff09;标准的轻量级…

8.2Roberts算子边缘检测

基本概念 Roberts算子是一种简单的一阶导数边缘检测算子&#xff0c;它通过计算图像在水平和垂直方向上的梯度来检测边缘。在OpenCV中&#xff0c;Roberts算子可以通过手动应用卷积核来实现。Roberts算子是一组2x2的小型滤波器&#xff0c;用于检测图像中的垂直和水平边缘。 …

GEE 案例:利用sentinel-2数据计算的NDVI指数对比植被退化情况

目录 简介 NDVI指数 数据 函数 ui.Chart.image.series(imageCollection, region, reducer, scale, xProperty) Arguments: Returns: ui.Chart 代码 结果 简介 利用sentinel-2数据计算的NDVI指数对比植被退化情况 NDVI指数 NDVI&#xff08;Normalized Difference Ve…

遥感图像目标检测数据集-DOTA数据集

DOTA数据集(v1.0版本和v1.5版本)&#xff0c;训练集1411张&#xff0c;验证集458张&#xff0c;测试集若干&#xff0c;共16种类别。数据集图片大小不一&#xff0c;需要进行裁剪&#xff0c;可设置裁剪重叠大小以及裁剪图片大小。此处按照默认参数裁剪&#xff0c;重叠200像素…

二极管选型

稳压二极管&#xff08;齐纳二极管&#xff09; 肖特基二极管 发光二极管 TVS二极管

记录一下ElementUI 3 在浏览器导入, table表格显示问题

当时问题忘了截图, 现在通过文字记录一下问题 我直接在html了引入 vue3 和 ElementUI 3 , 使用了table组件, 但是表格的td 总是只显示一列, 问题是我的 el-table-column 标签 没有结束标签 , 在vue文件模块化里写不需要结束标签, 在浏览器里无法直接识别出来, 所以他是渲染了第…

基于yolov8的肉鸡健康状态检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的肉鸡健康状态检测系统是一个先进的目标检测应用&#xff0c;旨在通过图像分析实现对肉鸡健康状态的快速、准确评估。该系统利用了YOLOv8模型的尖端技术&#xff0c;该模型由Ultralytics公司开发&#xff0c;具有卓越的检测精度和速度。 YOLOv8模型采…

C++---类与对象一

类的定义 class className{//成员字段//成员函数 };class定义类的关键字&#xff0c;className是自己决定的类名&#xff0c;{ } 为类的主体&#xff0c;花括号里是类的内容。类的内容大致分为类的成员属性&#xff08;变量&#xff09;和类的成员函数。注意定义类后面需要跟;…

理解人工智能、机器学习与深度学习的关系

1. 人工智能&#xff08;AI&#xff09;宏观的智能概念 人工智能&#xff08;Artificial Intelligence, AI&#xff09;是一个广泛的领域&#xff0c;涉及设计和开发能够表现出智能行为的计算机系统。这些系统可以模拟或执行类似于人类的认知功能&#xff0c;如学习、推理、决…

react 路由 react-router/react-router-dom

react-router-dom中包含react-router 安装前者即可 npm install react-router-dom -Simport { BrowserRouter as Router, Route, Link, Switch } from react-router-dom <Switch>组件&#xff0c;和switch语法一样&#xff0c;遇到匹配就结束&#xff0c;后面的<Route…

如何全面优化MySQL性能

MySQL数据库性能优化是一项复杂而细致的任务&#xff0c;它涉及到数据库设计、查询优化、服务器配置等多个方面。以下是几个关键的步骤和策略&#xff0c;旨在帮助提升MySQL数据库的运行效率&#xff1a; 优化数据库设计 选择合适的数据类型&#xff1a;合理选择数据类型不仅能…

树——数据结构

这次我来给大家讲解一下数据结构中的树 1. 树的概念 树是一种非线性的数据结构&#xff0c;它是由n(n>0&#xff09;个有限结点组成一个具有层次关系的集合。 叫做树的原因&#xff1a;看起来像一棵倒挂的树&#xff0c;根朝上&#xff0c;叶朝下。 特殊结点&#xff1a…

vmware中的ubuntu系统扩容分区

1.虚拟机关机 右击虚拟机/设置&#xff0c;进入虚拟机设置 3.启动虚拟机&#xff0c;进入命令行 4.fdisk -l查看要扩展的分区名 5.resize要扩容的分区 su root parted /dev/sda resizepart 3 100% fdisk -l resize2fs /dev/sda3 df -T完成 6.其他 进入磁盘管理 fdisk /d…

Doker学习笔记--黑马

介绍&#xff1a;快速构建、运行、管理应用的工具 在不同的服务器上部署多个应用&#xff0c;但是往往不同应用之间会有冲突&#xff0c;因为它们所依赖的环境&#xff0c;函数库&#xff0c;配置都不一样&#xff0c;此时docker在运行时形成了一个隔离环境&#xff08;容器&am…

idea上传jar包到nexus

注意&#xff1a;确保idea中项目为maven项目&#xff0c;并且在nexus中已经创建了maven私服。 1、配置pom.xml中推送代码配置 <distributionManagement> <repository> <id>releases</id> <url>http://127.0.0.1:8001/repository/myRelease/<…

c++9月18日

1&#xff0c;斐波那契数列 int str 0;int num 0;int kgo 0;int qto 0;cout<<"请输入字符串";string str1;getline(cin,str1);for(int i0;i<(int)(str1.size());i){if((str1.at(i)>65&&str1.at(i)<90)||(str1.at(i)>97&&str1.…

【oj刷题】二分查找篇:二分查找算法的原理和应用场景

前言&#xff1a; 二分查找算法&#xff0c;又称折半查找算法&#xff0c;是一种在有序数组中查找特定元素的高效查找方法。它通过将搜索区间不断缩小一半&#xff0c;从而在对数时间内找到目标元素。二分查找是基于分治策略的一种典型应用&#xff0c;能够高效的处理许多问题&…

Golang Beego+Vue打造的高校科研工作管理系统,让信息发布更及时,项目管理更透明

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

基于深度学习的眼部疾病检测识别系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 眼部疾病的早期诊断对于防止视力下降乃至失明至关重要。然而&#xff0c;专业的医疗资源分布不均&#xff0c;尤其是在偏远地区&#xff0c;人们很难获得专业的眼科医生提供的及时诊断服务。本系统…

密码学基础 C#实现门限共享密码算法

加密社 概念 门限秘密共享是一种密码学技术&#xff0c;将秘密 S 分割为 n 个部分&#xff0c;并将这些部分分发给 n 个参与者。所谓门限&#xff0c;是在分割这些秘密的时候&#xff0c;设置一个大小位于 1 和 n 之间的 k 值&#xff0c;使得给定任意 k−1 个或更少的秘密份额…