Java SE(7)——类和对象(二)

1.包(package)

1.1 包的定义

在Java中,是一种用于组织和管理类,接口和其他包的机制。主要作用是防止命名冲突,并提供一种访问控制机制

1.2 package关键字

在这里插入图片描述
package关键字的主要作用是声明当前类在哪个包里面。
当然,用户也可以自定义包,在自定义的包中编写用户自己的代码。不过,自定义包的时候应该遵循以下规范

  • 1.包名需要尽量指定成唯⼀的名字, 通常会用公司的域名的颠倒形式(比如:com.baidu.www)
  • 2.包名使用小写,一般使用英文
  • 3.如果一个java文件没有package语句,那么该java文件是被储存在一个默认包中(如:src)
  • 包名应与java文件实际的存储路径一致

1.3 使用import导入类

在Java中,JDK已经提供了很多现成的类供我们使用,如果我们要使用就有两种方式
(1)使用类的全限定名:包名+类名(一般不推荐)
在这里插入图片描述
(2)先导入包,再使用类名(常见用法)
在这里插入图片描述
在这里插入图片描述
这段代码的作用是:将java.util包(文件夹)下面的Arrays类导入到当前的java文件中,当用户需要使用Arrays时,编译器就会根据该代码的路径去定位Arrays类,这就体现了包的访问控制机制
如果需要使用java.util包里的其他类,可以这么导入

import java.util.*;

星号的意思不是导入java.util包里的全部类,而是当我们需要使用java.util里的某类时,根据这个路径去定位目标类

注意:
在这里插入图片描述
Date类在javautil和java.sql包中都有,如果使用星号来导入类,就无法区分使用哪个包中的Date类,解决办法如下:

  • 1.要么导入import java.util.Date,要么导入import java.sql.Date
  • 2.使用类的全限定名

2.访问限定修饰符(Access Modifiers)

Java中的访问限定修饰符一共有四个:publicprotecteddefaultprivate。主要用于控制方法变量可见性访问权限

2.1 default

如果没有使用任何访问限定修饰符,就是default(包私有)访问权限

修饰类时: 在这里插入图片描述
修饰成员变量/方法时: 在这里插入图片描述
在这里插入图片描述

2.2 pubilc

被public声明的类/变量/方法都可以被任意的其他类访问,无论它们是否在同一包里
修饰类时:
在这里插入图片描述
修饰成员变量/方法时:
在这里插入图片描述

2.3 封装&private

2.3.1 封装的概念

封装是面相对象编程的三大基本特性之一(其他两个是继承多态,后面的博文再介绍),指的是将类的数据(属性)和操作数据的方法绑定在一起,并对外隐藏内部实现的具体细节,仅提供必要的接口与外界交互。以电脑为例,电脑对外提供的接口就只是:开关机、通过键盘输入,显示器,USB插孔等,用户使用这些设备和电脑进行交互,完成日常事务
在这里插入图片描述
对于使用电脑的我们而言,只需要知道鼠标、键盘、开关机键等设备怎么使用就行了,至于为什么按了开机键电脑能亮起来,这个我们就不需要关心了。而要实现封装,就离不开private修饰符

2.3.2 private

使用private修饰的成员变量/方法只能在定义它们的类中访问,在外部类中一般是不能访问的(这里不考虑反射)
在这里插入图片描述
如果要访问使用private修饰的成员变量,可以对外提供一个get和set方法作为公开的接口,代码实现如下:

public class MyDate {private String year;private String month;private String day;/*//public MyDate() {this("2025","5","1");}public MyDate(String year, String month, String day) {this.year = year;this.month = month;this.day = day;}*///public String getYear() {return year;}public void setYear(String year) {this.year = year;}public String getMonth() {return month;}public void setMonth(String month) {this.month = month;}public String getDay() {return day;}public void setDay(String day) {this.day = day;}
}
class Test{public static void main(String[] args) {MyDate myDate = new MyDate();//使用get方法获取private修饰的成员变量System.out.println(myDate.getYear());System.out.println(myDate.getMonth());System.out.println(myDate.getDay());//使用set方法修改private修饰的成员变量myDate.setYear("2025");myDate.setMonth("5");myDate.setDay("1");//使用get方法获取private修饰的成员变量System.out.println(myDate.getYear());System.out.println(myDate.getMonth());System.out.println(myDate.getDay());}
}

运行结果如下:
在这里插入图片描述

  • 1.降低代码的耦合性:封装可以降低对象和对象之间的耦合度,当对象内部发生变化时,只需要修改对象内部即可,不会影响到外部程序,因为公开的接口是不会发生改变的。例如,当上述MyDate类中的year变量修改为Year1时,对外提供的接口还是getYear和setYear,不会影响到外部代码
  • 2.降低代码的复杂性:封装是隐藏了对象内部的实现细节,只提供了公开的接口给外部,使用起来更加简单
  • 3.提高安全性:封装可以隐藏对象的具体实现细节,阻止外部程序直接访问对象的内部状态,从而保护数据被意外修改或破坏

注意:

  • 1.类不能使用private修饰
  • 2.访问限定修饰符不能修饰方法内部的局部变量,因为局部变量超出该方法范围就不能访问了
  • 3.protected等到讲继承的时候在做介绍

3.static修饰符

static可以修饰成员变量/方法,至于static有什么用,这里先举个例子看看不适用static和使用static修饰的区别

3.1 static修饰成员变量

在这里插入图片描述
static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所
有对象所共享的
。当classroom不使用static修饰时,classroom变量存储在对象内部;当classroom使用static修饰时,classroom变量没有存储在对象内部。这是因为static成员属于本身,而不属于某个对象,在整个内存中只存在一份副本,被所有对象共享,存储在方法区中。
以上面的代码为例,假如实例化的所有学生对象都属于同一个班的学生,当classroom不不使用static修饰时,每个对象内部都会保存一份classroom成员变量;当使用static修饰后,classroom变量不依附于对象而存在,存储在方法区中,被所有的学生对象共享。使用static修饰后的直接好处是,classroom变量在内存中只有一份,而不需要保存多份
静态/类变量特性:

  • 1.不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
  • 2.既可以通过对象的引用访问,也可以通过类名访问,但⼀般更推荐使用类名访问
  • 3.静态/类变量存储在方法区
  • 4.生命周期和一致(随类的加载而创建,随类的卸载而销毁)

3.2 static修饰成员方法

在Java中,使用static修饰的方法称为静态方法,是类的方法,不属于某个对象

public class Student {public String name;public int age;//静态成员变量public static String classroom;//构造方法public Student(String name, int age) {this.name = name;this.age = age;}//静态方法public static String getClassroom(){return classroom;}
}

静态方法的特性:

  • 1.是类的方法,不属于某个对象
  • 2.既可以通过对象的引用访问,也可以通过类名访问,但⼀般更推荐使用类名访问
  • 3.静态方法内部不允许使用非静态的成员变量和方法
    在这里插入图片描述
    因为在调用非静态成员变量/方法时,会使用this引用,但是静态方法不属于某个对象,无法传递this引用。如果需要在静态方法中访问非静态成员变量/方法,只能通过对象来访问
public class Student {public String name;public int age;//静态成员变量public static String classroom;//构造方法public Student(String name, int age) {this.name = name;this.age = age;}//public void print(){System.out.println(name + " " + age);}//静态方法public static String getClassroom(){//实例化对象Student student = new Student("王五",20);return student.name;}
}

3.3 静态成员变量的初始化

静态成员变量一般不适用构造方法来初始化,因为构造方法是给某个对象来初始化变量,而静态变量是类的变量,被所有对象共享。所有静态成员变量的初始化分为:就地初始化静态代码块初始化

3.3.1 就地初始化

在定义变量的时候指定初始值

public static String classroom = "100";

3.3.2 静态代码块初始化

那么接下来就要介绍什么是代码块了

4.代码块

使用{}包围起来的代码就叫做代码块,根据代码块定义的位置和使用的关键字可分为四种

4.1 普通代码块

普通代码块:在方法中定义的代码块

public class demo1 {public static void main(String[] args) {{int a = 1;System.out.println("a = " + a);}int a = 2;System.out.println("a = " + a);}
}

运行结果:
a = 1
a = 2

4.2 构造/实例代码块

构造/实例代码块:在类中定义的代码块,一般用于初始化非静态成员变量

public class Student {public String name;public int age;//构造方法public Student(String name, int age) {this.name = name;this.age = age;}//public void print(){System.out.println(name + " " + age);}//构造/实例代码块{this.name = "八戒";this.age = 1000;}
}
class Test{public static void main(String[] args) {Student student1 = new Student("张三",18);student1.print();}
}

运行结果:
张三 18

根据运行结果可以判断出,实例代码块的执行时间比构造方法早(和定义的位置无关,因为上述代码中构造方法定义在前,但仍然是实例代码块先执行)

注意: 如果非静态成员变量有就地初始化操作,此时实例代码块和非静态成员变量谁先赋值就取决于它们定义的位置关系
在这里插入图片描述

4.3 静态代码块

public class Student {public String name;public int age;//静态成员变量public static String classroom;//构造方法public Student(String name, int age) {this.name = name;this.age = age;}//静态代码块static {classroom = "100";System.out.println("静态代码块执行");}
}
class Test{public static void main(String[] args) {Student student1 = new Student("张三",18);Student student2 = new Student("李四",19);System.out.println("classroom = " + Student.classroom);}
}

执行结果:
静态代码块执行
classroom = 100

注意:

  • 1.不论实例化多少对象,静态代码块只会执行一次。上述代码实例化了两个对象,但是静态代码块只执行了一次
  • 2.如果存在多个静态代码块,编译时会按照定义的先后顺序来执行
  • 3.如果静态成员变量有就地初始化操作,此时静态代码块和静态成员变量谁先赋值就取决于它们定义的位置关系
public class Student {public String name;public int age;//静态代码块1static {classroom = "100";System.out.println("静态代码块1执行");}//静态代码块2static {classroom = "200";System.out.println("静态代码块2执行");}//静态成员变量public static String classroom = "300";//构造方法public Student(String name, int age) {this.name = name;this.age = age;}
}
class Test{public static void main(String[] args) {Student student1 = new Student("张三",18);Student student2 = new Student("李四",19);System.out.println("classroom = " + Student.classroom);}
}

执行结果:
静态代码块1执行
静态代码块2执行
classroom = 300

4.4 同步代码块

使用synchronized修饰的代码块,主要和多线程有关,这里不再详细讲解,我以前的博客中讲过

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

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

相关文章

Manus联合创始人:公司产品基于Claude和阿里千问大模型开发

3月11日消息,日前,Manus官方在社交平台转发了公司联合创始人、首席科学家季逸超对Manus的技术解读,季逸超在评论区回复网友关于“Manus使用了哪一个基础大模型”这一问题时回复称,“我们用过Claude,也用过不同版本的Qw…

欺骗单页应用(SPA)渲染隐藏路由 -- trouble at the spa b01lersCTF

题目信息:I had this million-dollar app idea the other day, but I can’t get my routing to work! I’m only using state-of-the-art tools and frameworks, so that can’t be the problem… right? Can you navigate me to the endpoint of my dreams? 题目…

大数据引领行业革命:深度解析与未来趋势

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 在信息化、数字化、智能化日益发展的今天,大数据技术已经成为推动产业变革的重要引擎。它不仅仅是一个技术工具,更是各行各业创新和优化的核心动力。无论是大企业还是初创公司,大数据的应用已经成为提升效…

[machine learning] Transformer - Attention (二)

本文介绍带训练参数的self-attention,即在transformer中使用的self-attention。 首先引入三个可训练的参数矩阵Wq, Wk, Wv,这三个矩阵用来将词向量投射(project)到query, key, value三个向量上。下面我们再定义几个变量: import torch inpu…

施磊老师rpc(三)

文章目录 mprpc框架项目动态库编译框架生成动态库框架初始化函数-文件读取1. 为什么要传入 argc, argv2. 读取参数逻辑3. 配置文件设计 init部分实现 mprpc配置文件加载(一)配置文件加载类成员变量主要方法**src/include/mprpcconfig.h** 配置文件**bin/test.conf** 实现配置文…

文献分享:通过简单的生物偶联策略将肽双特异性抗体(pBsAbs)应用于免疫治疗

背景 双特异性抗体是将单克隆抗体的两个不同抗原结合位点融合成一个单一实体的人工分子。它们已经成为一种很有前景的下一代抗癌治疗方法。尽管双特异性抗体的应用令人着迷,但双特异性抗体的设计和生产仍然繁琐而富有挑战性,导致研发过程漫长&#xff0…

二、shell脚本--变量与数据类型

1. 变量的定义与使用 定义变量:简单直接 在 Shell 里定义变量相当容易: 基本格式: variable_namevalue关键点 ❗:赋值号 的两边绝对不能有空格!这绝对是初学者最容易踩的坑之一 😨,务必留意&#xff01…

java_Lambda表达式

1、背景 lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。lambda表达式就和方法一样样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式和一个代码块)。La…

给QCustomPlot添加一个QScrollBar滚动条、限制缩放范围、自动设置大小和右边栏垂直缩放

实现效果 实现思路 从QCustomPlot类派生一个类,进行个性化设置,在轴矩形的上边设置Margin,放一个滚动条,设置滚动条的样式 常量定义 #define NQSCRB 1000构造函数初始化 // 设置QScrollBar的样式// 顶部空--5,左侧空--6

实验-组合电路设计1-全加器和加法器(数字逻辑)

目录 一、实验内容 二、实验步骤 2.1 全加器的设计 2.2 加法器的设计 三、调试过程 3.1 全加器调试过程 2.加法器的调试过程 四、实验使用环境 五、实验小结和思考 一、实验内容 a) 介绍 在这次实验中,你将熟悉 Logisim 的操作流程,并且学习…

Linux进程控制与替换详解

进程创建 fork函数初识 在linux中fork函数是非常重要的函数,它从已存在进程中创建⼀个新进程。新进程为子进程,而原进程为父进程。 进程调用fork,当控制转移到内核中的fork代码后,内核做: • 分配新的内存块和内核数据结构给子进程 • 将父进程部分数据结构内容拷贝至…

Vue3学习笔记2——路由守卫

路由守卫 全局 router.beforeEach((to, from, next) > {})router.afterEach((to, from, next) > {}) 组件内守卫 beforeRouteEnter((to, from, next) > {})beforeRouteUpdate((to, from, next) > {})beforeRouteLeave((to, from, next) > {}) 路由独享 be…

AI与无人零售:如何通过智能化技术提升消费者体验和运营效率?

引言:无人零售不只是无人值守 你走进一家无人便利店,没有迎宾、没有收银员,甚至没有一个人在场,但你刚拿起商品,货架旁的摄像头就悄悄“看懂”了你的动作,系统已经在后台为你记账。你以为只是没人管&#x…

如何在3dMax中使用UVW展开修改器?

UVW展开(Unwrap UVW)修改器是3dmax中的一个强大工具,允许对纹理如何应用于3D模型进行精确控制。 与更简单的UVW Map修改器不同,Unwrap UVW修改器提供了高级选项,用于手动编辑纹理映射,对于详细和复杂的模型来说是必不可少的。 在本文中,我们将探讨增强您对Unwrap UVW修…

【Linux】进程优先级与进程切换理解

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、进程优先级 1. 什么是进程优先级 2. 为什么有进程优先级 3. 进程优先级的作用 4. Linux进程优先级的本质 5. 修改进程优先级 二、进…

【Hive入门】Hive高级特性:事务表与ACID特性详解

目录 1 Hive事务概述 2 ACID特性详解 3 Hive事务表的配置与启用 3.1 启用Hive事务支持 3.2 创建事务表 4 Hive事务操作流程 5 并发控制与隔离级别 5.1 Hive的锁机制 5.2 隔离级别 6 Hive事务的限制与优化 6.1 主要限制 6.2 性能优化建议 7 事务表操作示例 7.1 基本…

二叉树算法精解(Java 实现):从遍历到高阶应用

引言 二叉树(Binary Tree)作为算法领域的核心数据结构,在搜索、排序、数据库索引、编译器语法树构建等众多场景中都有着广泛应用。无论是初学者夯实算法基础,还是求职者备战技术面试,掌握二叉树相关算法都是不可或缺的…

ES6入门---第二单元 模块二:关于数组新增

一、扩展运算符。。。 1、可以把ul li转变为数组 <script>window.onloadfunction (){let aLi document.querySelectorAll(ul li);let arrLi [...aLi];arrLi.pop();arrLi.push(asfasdf);console.log(arrLi);};</script> </head> <body><ul><…

Nature正刊:新型折纸启发手性超材料,实现多模式独立驱动,变形超50%!

机械超材料是一种结构化的宏观结构&#xff0c;其几何排列方式具有独特的几何结构&#xff0c;从而具有独特的力学性能和变形模式。超材料的宏观特性取决于中观尺度晶胞的具体形状、尺寸和几何取向。经典的结构化晶胞&#xff0c;例如以拉伸为主的八面体桁架单元和以弯曲为主的…

Servlet(二)

软件架构 1. C/S 客户端/服务器端 2. B/S 浏览器/服务器端&#xff1a; 客户端零维护&#xff0c;开发快 资源分类 1. 静态资源 所有用户看到相同的部分&#xff0c;如&#xff1a;html,css,js 2. 动态资源 用户访问相同资源后得到的结果可能不一致&#xff0c;如&#xff1a;s…