认识Java-类和对象(下) 上一篇文章已经初步认识了类和对象今天我们来在此基础上进一步地学习类和对象在实际开发过程中我们要写很多的类但是在前面我们已经说了一个.java文件最好只写一个类那有很多类地时候我们怎么解决这个时候就有了包这个概念一. 包1.作用包是Java中组织类的一种方式用来防止类名冲突和提高代码的可读性。我们可以把包理解成一个文件夹这个文件夹既可以存放别的包也可以存放.java文件(类)。对着这张截屏再来解释下上面包的作用java-SE-basic是项目名称src是源代码根目录里面的day01,day02是包名最下面day05包里面存放的是.java文件类2.自定义包一个项目的所有包都在src里面在idea中右击src,选择新建选择软件包输入包名回车即可按照上面的操作新建Test1包和Test2包这个时候在Test1或者Teste2里面新建的.Java文件(类)最上面会有一行package语句提示当前类在那个包中以Test2里面的animal类为例3.如何使用非当前.java文件中的类基于上面创建的Test1包和Test2包来讲这个问题1.要使用的类不和当前文件位于两个包中不同包如上图 我们想在example这个Java文件里面使用Test2包里面的animal类创建dog对象那就需要做一件事情——导包语句是import 包名.类名下面看代码示例可以看到在example类里面我们成功用animal类创建了dog这个对象并对成员变量赋值调用成员方法这里我们先不管成员方法变量前面的public这个是访问权限修饰符下面会讲到2.父子包wenju包是Test1包的子包example类在父包Test1下WenJu类在wenju包里面这个时候我们如果想在example类里面用WenJu类创建pencil对象还是做导包这件事情语句是import 父包名.子包名.类名运行结果符合我们的预期使用import语句导包还有一种比较简单的写法import 包名.*这表示把包里面的所有类都导过来这个时候我们突然想到一个问题如果有两个·不同的包但是它们里面有名字相同的类这个时候如果我们把这个两个包里面名字相同的类都导过来会出现什么情况怎么解决4.同时导入不同包中的同名类java中已经提供了许多类供我们使用例如之前输入使用的Scanner类我们以Java提供的Date类为例java.util包和java.sql里面都有Date类我们新建一个java文件在里面同时导入这两个包的Date类并创建对象程序出现警告原因就是虽然不同的包里面可以有同名的类但是我们不能用import同时导入两个同命类解决方法是一个类用import导入另一个写完整包的路径(全限定名)这算是另一种导包的方法下面看代码示例我们看到这下就没有报错了问题解决。写完整包的路径(全限定名)的格式就是把原来写在import后面的语句直接当做类名拿来创建对象二.封装1.概念面向对象语言的三大特点封装继承多态。类和对象就是用来封装的。封装的概念将数据和操作数据的方法有机结合隐藏对象的属性和实现细节仅对外公开接口来和对向进行交互。简单的理解就是我们每个人都有家这个家隐藏了我们在家里的行为睡觉吃饭等和属性财产等我们通过家的大门门铃猫眼接口来和别人进行交流对象交互下面看代码示例在这里插入代码片publicclasshome{publicStringname;privatedoublevalue;//value只能在home类里面使用publicintpeopleNum;//peopleNum的可以在类外使用//先不管这里的public和private下面会讲}publicclassHome{publicstaticvoidmain(String[]args){home home1newhome();home1.nameHHH;home1.peopleNum10;System.out.println(home1.name家有home1.peopleNum个人);}}最终会打印HHH家有10个人由于value被private修饰只能在Home类里面使用那如果我们要设置在Test类里面设置或者使用value该怎么做这个时候我们就要手动写接口了setvaluegetvalue)看示例在外部类Test里面我们无法通过类名.value来访问value只能通过setValue和getValue这两个接口来访问value至于setValue和getValue是怎么操作value的我们在Test里面并不知道这就体现了封装的特性 套壳子遮细节2.访问限定符封装的好处之一就是提高代码的安全性说到安全就会有有权限这个说法有些时候一些成员变量和成员方法我们需要它们只能在特定的地方使用比如上面的的value只能在它所在的Home类里面使用Java提供了四种限定符来实现这种功能。看下图protected会在继承中讲到default表示什么修饰符都不加。三.static关键字static关键字可以修饰成员变量和成员方法1.static修饰成员变量定义一个People类两个人的家是同一个我们怎么定义家这个属性在这里插入代码片classPeople{publicStringname;publicStringhomename;}publicclassTest{publicstaticvoidmain(String[]args){Peoplep1newPeople();Peoplep2newPeople();}}这样定义这两个人都有家这个属性但是家是它们两个人共有的并不单独属于谁因此这样定义是有点瑕疵的而static就可以解决这个问题在这里插入代码片classPeople{publicStringname;publicstaticStringhomename1-101;}publicclassTest{publicstaticvoidmain(String[]args){Peoplep1newPeople();Peoplep2newPeople();}}这个时候homename这个变量就不再属于某个具体的对象了而是属于People这个类被这个类所有的对象共享static修饰成员变量的特性总结属于类不属于对象static修饰的成员变量也叫类变量/静态变量在内存中只有一份被该类的所有对象共享任何一个对象修改了它其他对象看到的值都会改变。随类加载而创建静态变量在类加载时就被初始化不依赖任何对象的创建即使没有new对象也可以通过类名.变量名直接访问。访问方式既可以通过对象名.变量名访问也可以通过类名.变量名访问推荐使用后者更能体现它属于类的特性。生命周期静态变量的生命周期与类相同从类加载开始到程序结束类卸载才销毁比普通成员变量实例变量存活时间更长。存储位置静态变量存放在方法区JDK8及以后是堆中的元空间而普通成员变量存放在堆中每个对象自己的空间里。下面通过代码来验证这些特性classPeople{publicStringname;publicstaticStringhomename1-101;}publicclassTest{publicstaticvoidmain(String[]args){Peoplep1newPeople();Peoplep2newPeople();// 1. 通过对象访问System.out.println(p1.homename);// 1-101System.out.println(p2.homename);// 1-101// 2. 通过类名直接访问推荐System.out.println(People.homename);// 1-101// 3. 验证共享性p1修改p2和类名访问都跟着变p1.homename2-202;System.out.println(p2.homename);// 2-202System.out.println(People.homename);// 2-202// 4. 不创建对象也能访问静态变量People.homename3-303;System.out.println(People.homename);// 3-303}}运行结果1-101 1-101 1-101 2-202 2-202 3-303可以看到无论通过哪个对象修改homename所有对象以及类名访问到的值都保持一致这正是静态变量「共享」特性的体现。2.static修饰成员方法static不仅可以修饰成员变量还可以修饰成员方法被static修饰的方法叫做静态方法类方法它和静态变量一样属于类而不属于某个具体的对象。static修饰成员方法的特性总结属于类不属于对象静态方法属于类本身不依赖任何对象即使没有创建对象也可以通过类名.方法名()直接调用。访问方式既可以通过对象名.方法名()调用也可以通过类名.方法名()调用推荐使用后者更能体现它属于类的特性。静态方法中不能直接访问非静态成员静态方法在类加载时就存在而此时对象可能还没有创建所以静态方法中不能直接访问实例变量和实例方法只能访问静态成员。静态方法中不能使用this和superthis和super都代表某个具体的对象而静态方法不依赖对象所以无法使用。非静态方法可以访问静态成员实例方法中既可以访问实例成员也可以访问静态成员因为对象创建时类一定已经加载了。静态方法只能访问静态变量静态方法中只能直接访问静态成员静态变量和静态方法不能直接访问实例变量和实例方法因为静态方法不依赖对象而存在而实例成员必须依赖对象才能访问。下面通过代码来验证这些特性classPeople{publicStringname;// 实例变量publicstaticStringhomename1-101;// 静态变量// 静态方法publicstaticvoidshowHome(){// 静态方法中可以直接访问静态变量System.out.println(家在homename);// 下面这行会报错静态方法中不能直接访问非静态成员// System.out.println(name);}// 非静态方法publicvoidshowName(){// 非静态方法中既可以访问实例变量也可以访问静态变量System.out.println(我叫name家在homename);}// 静态方法中调用静态方法publicstaticvoidshowAll(){showHome();// 静态方法可以直接调用另一个静态方法// showName(); // 这行会报错静态方法中不能直接调用非静态方法}}publicclassTest{publicstaticvoidmain(String[]args){// 1. 不创建对象直接通过类名调用静态方法推荐People.showHome();// 家在1-101// 2. 通过对象调用静态方法不推荐但可以Peoplep1newPeople();p1.showHome();// 家在1-101// 3. 非静态方法必须通过对象调用p1.name张三;p1.showName();// 我叫张三家在1-101// 4. 静态方法中调用静态方法People.showAll();// 家在1-101}}运行结果家在1-101 家在1-101 我叫张三家在1-101 家在1-101可以看到静态方法只能直接访问静态成员静态变量和静态方法不能直接访问实例成员。如果静态方法中想访问实例成员必须先创建对象再通过对象来访问这一点在写代码时要特别注意。运行结果家在1-101 家在1-101 我叫张三家在1-101可以看到静态方法可以直接通过类名调用不需要创建对象而普通方法必须通过对象来调用。同时静态方法中只能访问静态成员这一点在写代码时要特别注意。

相关新闻

最新新闻

解决word文档中行尾中文破折号被分断的问题

解决word文档中行尾中文破折号被分断的问题

在中英文混排文档中,往往需要设置“允许西文在单词中间换行”(如下图),排版时单词间隔才比较均匀。 但是,这样会导致行尾中文破折号有时也分断成两行,如下图: 怎么快速解决Word文档中行尾中文破…

2026/8/26 17:31:38
C语言中的分支和循环语句(下)

C语言中的分支和循环语句(下)

上一片博客讲解了我对选择结构相关基本知识的理解,这篇将讲解循环结构相关语句。本篇学习目标:学完本篇后,你将能够:区分 while、do-while、for 三种循环的语法格式与适用场景;使用嵌套循环解决二维数组遍历等实际问题…

2026/8/26 17:31:38
鸿蒙AGC设备管理:设备删除(二)

鸿蒙AGC设备管理:设备删除(二)

在上一篇文章中介绍了如何注册和管理设备。当后续不再使用某个已注册的设备时,可以将该设备从列表中删除。 一、设备删除步骤 步骤1:进入设备页面 登录AppGallery Connect,选择"证书、APP ID和Profile"。在左侧导航栏选择"…

2026/8/26 17:31:38
告别手工分表:金仓时序数据库超表架构落地的一次实战复盘

告别手工分表:金仓时序数据库超表架构落地的一次实战复盘

一、金仓时序数据库超表架构,难在哪 先撂个结论:手工分表这套办法,毛病不在“分”上,在于分完之后,所有的活儿都得你自己干。 做过时序数据的人应该都懂。按月建表嘛,xxx_202501、xxx_202502,一…

2026/8/26 17:31:38
【RAG实战】FastAPI + LlamaIndex Agent 流式对话踩坑实录

【RAG实战】FastAPI + LlamaIndex Agent 流式对话踩坑实录

FastAPI LlamaIndex Agent 流式对话踩坑实录:取消标志残留、中间件缓冲、事件丢失全记录 文章目录 FastAPI LlamaIndex Agent 流式对话踩坑实录:取消标志残留、中间件缓冲、事件丢失全记录前言一、项目背景事件类型 二、问题一:BaseHTTPMid…

2026/8/26 17:31:37
Grok4.5是什么?怎么选、和其他大模型有什么区别:一篇讲清定位与适用场景

Grok4.5是什么?怎么选、和其他大模型有什么区别:一篇讲清定位与适用场景

对刚开始关注大模型的开发者来说,最近经常会看到 Grok4.5 这个名字。很多人第一反应是:它到底值不值得试?适合写代码、做问答,还是只是一波热度?如果你平时也会在 AI模型聚合平台 neneai.cn 这类工具站上对比不同模型&…

2026/8/26 17:26:37