【Java面向对象】对象和类(下)

文章目录

  • 1.静态变量、常量和方法
  • 2.可见性修饰符
    • 2.1 声明包
    • 2.2 变量和方法的可见性修饰符
    • 2.3 类的可见性修饰符
    • 2.4 私有构造方法
  • 3.数据域封装
  • 4.对象参数,对象数组
  • 5.不可变对象和类
  • 6.变量的作用域
  • 7.this引用
    • 7.1 使用 this 引用数据域
    • 7.2 使用 this 调用构造方法

1.静态变量、常量和方法

静态变量被类中的所有对象所共享。静态方法不能访问类中的实例成员 (即实例数据域和方法)。
声明一个静态变量或定义一个静态方法,就要在这个变量或方法的声明中加上修饰符static。

  • 静态变量、常量和方法被类中的所有对象所共享。静态变量 ( staticvariable), 也称为类变量 ( classvariable)。静态变量将变量值存储在一个公共的内存地址。因为是公共的地址,所以如果某一个对象修改了静态变量的值,那么同一个类的所有对象都会受到影响。
  • 实例变量是属于类的某个特定实例的,不能被同一个类的不同对象所共享。
  • 静态方法是共同的,无须创建类的实例就可以调用静态方法 (staticmethod)

用最简单的话概括就是

  • 实例方法和实例变量依赖于具体的对象,只能由对象访问。不同对象有各自独享的方法和变量。
  • 静态方法和静态变量是该类所有的对象共有(或者说静态变量是类变量,它属于整个类,不依赖于对象)。所有 对象可以访问,类也可以访问。
class Circle{int radius;static numOfObjests = 0;Circle(){radius = 1;numOfObjects++;}Circle(int n){radius = n;numOfObjects++;}static int getNum(){return numOfObject;}double getArea(){return radius*radius*Math.PI;}
}pulbic class Test{public static void main(String[] args){Circle c1 = new Circle(); // r=1Circle c2 = new Circle(5); // r=5// 实例变量System.out.println(c1.radius);System.out.println(c2.radius);// 静态变量System.out.println(c1.numOfObject);System.out.println(c2.numOfObject);System.out.println(Class.numOfObject);// 实例方法System.out.println(c1.getArea());System.out.println(c2.getArea());// 静态变量System.out.println(c1.getArea());System.out.println(c2.getArea());System.out.println(Class.getArea());}
}

2.可见性修饰符

2.1 声明包

可见性修饰符可以用于确定一个类以及它的成员的可见性。
可以在类、方法和数据域前使用 public 可见性修饰符,表示它们可以被任何其他的类访问。如果没有使用可见性修饰符,那么默认类、方法和数据域是可以被同一个包中的任何一个类访问的。这称作 包私有 (package-private) 或 包访问 (package-access)

包可以用来组织类。为了完成这个目标,需要在程序中出现下面这行语句,作为程序中第一条非注释和非空白行的语句。
如果定义类时没有声明包,就表示把它放在默认包中。
Java 建议最好将类放入 包中,而不要使用默认包。

package packageName;

2.2 变量和方法的可见性修饰符

  • private私有的修饰符限定访问权限在它自己的类内
  • 默认修饰符限定访问权限在包内
  • public公共的修饰符可以无限定地访问

2.3 类的可见性修饰符

加public表示该类可以被任何类通过import访问。
不加则只能被包内的类访问,也称保留类。

值得注意的是public class 虽然可以被任何类访问,但若是所访问类中的方法不加public或者static,将会出现一个warning,所以当要访问其他包中的public类中的方法,则需要加上public或者static才能进行访问。

(引用原文链接:https://blog.csdn.net/qq_45766131/article/details/115567730)

2.4 私有构造方法

大多数情况下,构造方法应该是公共的。
但是,如果想防止用户创建类的实例,就该使用私有构造方法。例如:因为 Math 类的所有数据域和方法都是静态的,所以没必要创建Math类的实例。Math成为了一个提供方法的类,不用于创建对象,而是提供一些列的静态方法。

3.数据域封装

将数据域设为私有可以保护数据,并且使得类易于维护。
为了避免对数据域的直接修改,应该使用 private 修饰符将数据域声明为私有的,这称为数据域封装(datafield encapsulation)

私有数据域不能被对象从定义该私有域的类外访问。但是经常会有客户端需要存取、修改数据域。为了访问私有数据域,可以提供一个获取(getter)方法返回数据域的值。为了更新数据域,可以提供一个设置( setter)方法给数据域设置新值。获取方法也称为访问器(accessor), 而设置方法称为修改器(mutator)。

// 获取方法的函数签名
public returnType getPropertyName()
public boolean isPropertyName()// 设置方法的函数签名
public void setPropertyName(dataType propertyvalue)

示例

Circle.java
public class Circle{private double radius = 1;public double getRadius(){return radius;} public void setRadius(double r){radius = (r>=0)?r:0;}
}Test.java
public class Test{piblic static void main(String[] args){Circle c = new Circle();c.radius; // 错误,radius是私有的,外面拿不到c.getRadius(); // 正确,getRadius()公有的,先通过公有的getRadius()“打入内部”,再在类内拿到私有的radius}
}

4.对象参数,对象数组

给方法传递一个对象,是将对象的引用传递给方法
引用上的按值传参在语义上最好描述为按共享传参 (pass-by-sharing), 也就是说,在方法中引用的对象和传递的对象是一样的。

数组既可以存储基本类型值,也可以存储对象。

Circle[] circleArray = new Circle[10];
for(int i=0;i<10;i++)circleArray[i] = new Circle(i);

5.不可变对象和类

通常,创建一个对象后,它的内容是之后允许改变的。有时候也需要创建一个一旦创建其内容就不能再改变的对象。我们称这种对象为不可变对象(immutable object), 而它的类就称为不可变类(immutable class)。例如:String 类就是不可变的。

如果一个类是不可变的,那么

  • 所有数据域都是私有的。
  • 没有修改器方法(公共的设置方法)
  • 没有返回一个指向可变数据域的引用的访问器方法

6.变量的作用域

一个类中的实例变量和静态变量称为类变量 (class variable) 或数据域 ( datafield) 。在方法内部定义的变量称为局部变量。

**实例变量和静态变量的作用域是整个类,无论变量是在哪里声明的。**无论在何处声明,类变量的作用域都是整个类。类的变量和方法可以在类中以任意顺序出现。
但是当一个数据域是基于对另一个数据域的引用来进行初始化时则不是这样。在这种情况下,必须首先声明另一个数据域。如下:

public class A{int i = 1;int j = i + 1;
}

类变量只能声明一次,但是在一个方法内不同的非嵌套块中,可以多次声明相同的变量名。
如果一个局部变量和一个类变量具有相同的名字,那么局部变量优先,而同名的类变量将被隐藏 ( hidden)(一般都是优先使用范围小的)。

7.this引用

关键字 this 是一个对象可以用来引用自身的引用名。可以用 this 关键字引用对象的实例成员。

7.1 使用 this 引用数据域

如果一个局部变量和一个类变量(实例变量和静态变量)具有相同的名字,那么局部变量优先,而同名的类变量将被隐藏。隐藏的静态变量可以简单地通过 ClassName.staticvariable引用。隐藏的实例变量可以使用关键字 this.variable来访问

class A{public int a = 1;public static int b = 2;public void set(int a,int b){this.a = a;A.b = b;}
}

7.2 使用 this 调用构造方法

关键字 this 可以用于调用同一个类的另一个构造方法。

class Person{private age;public Person(int age){this.age = age;}public Person(){this(1); // 调用前一个有参构造,传入1}
}

Java 要求,在构造方法中语句 this(arg-list) 应在任何其他可执行语句之前出现。
如果一个类有多 个构造方法,最好尽可能使用this(参数列表) 实现它们。通常,无参数或参数少的构造方法可以用 this(arg-list) 调用参数较多的构造方法。这样做通常可以简化代码,使类易于阅读和维护

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

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

相关文章

【学术会议征稿】第八届控制工程与先进算法国际论坛(IWCEAA 2024)

第八届控制工程与先进算法国际论坛 8th International Workshop on Control Engineering and Advanced Algorithms(IWCEAA 2024) 第八届控制工程与先进算法国际论坛&#xff08;IWCEAA 2024&#xff09;将于2024年11月1-3日在中国南京隆重举行。会议旨在为从事算法、控制工程与…

昇思25天学习打卡营第七天|应用实践/生成式/Diffusion扩散模型

心得 这个课程是一个劝退的课程。讲述了Diffusion扩散模型实现原理。提供了这个原理的一些公式推导。当然看这个推导是需要一定的数学基础的。这个课程这么写&#xff0c;是为了让那些数学不怎么好的&#xff0c;知难而退吗&#xff1f; 这个课程还是一个比较难以复制粘贴的课…

C#面:MVC中的TempData\ViewBag\ViewData区别?

TempData 保存在Session中&#xff0c;Controller每次执⾏请求的时候&#xff0c;会从Session中先获取 TempData&#xff0c; ⽽后清除Session&#xff0c;获取完TempData数据&#xff0c;虽然保存在内部字典对象中&#xff0c;但是其集合中的每个条⽬访问⼀次后就从字典表中删…

使用Scikit-Learn决策树:分类问题解决方案指南

如何用scikit-learn的决策树分类器解决分类问题 1. 引言 在本教程中&#xff0c;我们将探讨如何使用scikit-learn&#xff08;sklearn&#xff09;库中的决策树分类器解决分类问题。决策树是一种强大的机器学习算法&#xff0c;能够根据输入数据的特征属性学习决策规则&#…

[短笔记] Ubuntu配置环境变量的最佳实践

结论&#xff1a; 不确定是否要设为系统&#xff0c;则先针对当前用户设&#xff0c;写~/.profile确定为系统级&#xff0c;写/etc/environment&#xff0c;注意无需export不推荐写在~/.bashrc&#xff08;Ubuntu不推荐&#xff0c;理由见references&#xff09; References&…

陪玩系统小程序模式APP小程序H5系统搭建开发

随着移动互联网的营及和游戏行业的蓬轨发展&#xff0c;陪玩服务应远而生并迅速唱起&#xff0c;陪玩系统小程序作为连接游戏玩家与陪玩师的桥梁&#xff0c;其模式系统的搭建与开发是得尤为重要&#xff0c;本文将洋细凰述陪玩系统小程宗模式系统的搭建开发流程&#xff0c;包…

Nginx入门到精通四(反向代理2)

下面内容整理自bilibili-尚硅谷-Nginx青铜到王者视频教程 Nginx相关文章 Nginx入门到精通一&#xff08;基本概念介绍&#xff09;-CSDN博客 Nginx入门到精通二&#xff08;安装配置&#xff09;-CSDN博客 Nginx入门到精通三&#xff08;Nginx实例1&#xff1a;反向代理&a…

Spring Security 授权

基于request的授权 HttpSecurity 权限配置 Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize -> {authorize// 放行请求:针对含有 admin 权限的用户放行 /user/get 接口.requestMatchers("/us…

【Druid 未授权访问漏洞】解决办法

【Druid 未授权访问漏洞】解决办法 漏洞描述 Alibaba Druid 未授权访问【原理扫描】 Alibaba Druid是一款Java语言开发的数据库连接池。Druid能够提供强大的监控和扩展功能。 Alibaba Druid 默认情况下未设置访问控制&#xff0c;攻击者可以登录以获取敏感信息 修改web.xml…

深入理解 React 18 中的 memo 和 useCallback:优化你的组件性能

深入理解 React 18 中的 memo 和 useCallback&#xff1a;优化你的组件性能 在现代前端开发中&#xff0c;性能优化是一个永恒的话题。React 18 引入了一些新的特性和改进&#xff0c;使得性能优化变得更加容易和高效。今天&#xff0c;我们将深入探讨两个非常重要的 Hooks&am…

UE4-光照渲染、自动曝光、雾

目录 一.光源种类 二.灯光的移动性 三.自动曝光 四.指数级高度雾 五.实现光束 一.光源种类 1.定向光源 用来模拟现实中的太阳光。 2.点光源 比如现实中的灯泡 3.聚光源 4.矩形光源 是这几个光源中性能开销最大的&#xff0c;一般不用到游戏场景中&#xff0c;因为游…

【文心智能体】前几天百度热搜有一条非常有趣的话题《00后疯感工牌》,看看如何通过低代码工作流方式实现图片显示

00后疯感工牌体验&#xff1a;https://mbd.baidu.com/ma/s/6yA90qtM 目录 前言比赛推荐工作流创建工作流入口创建工作流界面工作流界面HTTP工具卡点地方 总结推荐文章 前言 前几天百度热搜有一条非常有有趣《00后疯感工牌》。 想着通过文心智能体去一键生成00后疯感工牌是不是…

Qt 多语言

记录Qt多语言的实现过程 目录 1.项目配置文件.pro配置 2.程序中的字符串用tr()封装 3.生成翻译文件 4.使用Qt语言家修改翻译文件 4.1使用Qt语言家打开 4.2 .更改文件配置 5. 生成qm文件 6.代码执行切换语言 6.1入口处 6.2 事件执行 0.效果 1.项目配置文件.pro配置 T…

js执行机制----事件循环

前言 问题 一般情况下,我们都认为js是顺序执行的 但是遇到下列情况 setTimeout(function(){console.log(定时器开始啦) });new Promise(function(resolve){console.log(马上执行for循环啦);for(var i 0; i < 10000; i){i 99 && resolve();} }).then(function(…

AI技术在企业招聘中的应用案例分析

一、引言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;其在企业招聘领域的应用也越来越广泛。AI技术不仅改变了传统的招聘流程&#xff0c;还提高了招聘的效率和准确性&#xff0c;为企业招聘人员提供了更加便捷、高效的方式。本文将以某大型互联网公司…

opencv—常用函数学习_“干货“_2

目录 五、矩阵计算函数 归一化矩阵 (normalize) 转置矩阵 (transpose) 求矩阵的逆 (invert) 翻转矩阵 (flip) 旋转矩阵 (rotate) 求矩阵的行列式 (determinant) 求矩阵的迹 (trace) 求矩阵的特征值和特征向量 (eigen) 六、代数运算 矩阵加法 (add) 矩阵减法 (subtra…

通过手机控制家用电器的一个程序的设计(一)

一、概述 设计一款安卓平台上的家庭智能控制软件&#xff0c;通过语音识别指令控制家用电器。该软件结合离线语音识别技术、红外线和WIFI通讯技术&#xff0c;实现对家电的智能控制&#xff0c;如开关机、调温度、调频道等操作。 二、主要功能模块 离线语音识别模块 功能&…

嵌入式人工智能(7-树莓派4B的IIC总线连接OLED显示中文与图片)

1、IIC总线 IIC总线&#xff08;Inter-Integrated Circuit&#xff09;是一种串行通信总线&#xff0c;也被称为I2C总线。它由飞利浦&#xff08;Philips&#xff09;公司在1980年代开发&#xff0c;用于连接微处理器和外部设备。 IIC总线使用两根信号线&#xff1a;SDA&…

删除windows系统里磁盘的恢复分区

说下我的情况 我买了块固态磁盘&#xff0c;插上主板&#xff0c;发现它自带了系统&#xff0c;这样我开机就会转到这块磁盘&#xff0c;即使在boot里改变也不行&#xff0c;后面我格式化了对应的盘符&#xff0c;但在磁盘管理里&#xff0c;发现有个EFI系统分区和恢复分区存在…

C++中的语句详细介绍:简单语句、条件、循环迭代语句、跳转语句、异常处理语句、try语句等

文章目录 C中的语句(1)简单语句A.空语句B.复合语句 (2)条件语句(3)迭代语句A.常规for循环B.范围for循环C.while和do...while (4)跳转语句A.break语句B.continue语句C.goto语句 (5)异常处理语句A.标准异常B.throw抛出异常 (6)try语句 C中的语句 (1)简单语句 简单语句包括&#…