Think in Java ---Chapter 6 访问控制权限

本文详细介绍了Java中访问控制权限的作用及修饰符如何影响类库的重构与使用,解释了包(package)与类的关系、包如何组织类、import关键字的使用习惯、编译单元的概念、类文件的生成与加载过程、CLASSPATH环境变量的作用以及如何解决类路径冲突等问题。

1.访问控制权限源于让类库开发者能更好的重构,保证与类库使用者隔离。让类库使用者知道哪些是可用的哪些是不可用的。
2.控制权限修饰符还会受package命令的影响。package命令解决访问控制权限缺少的将构件捆绑到一个内聚的类库单元的功能。
3.包内有一组类,出于单一的命名空间下面。包与类类似文件夹和文件的目录包含关系。即包路径会分解为文件夹的目录结构。
4.import关键字是为了省去显式的命名空间前缀在类名前的使用。
5.养成好的命名空间的习惯。package必须写在第一句。包名路径必须都是小写。
5.5 import和package 用处是用来解决你的类放在任何环境下出现冲突的问题。
6.一个编译单元,就是一个只有一个与.java文件同名的public类,其他可能有一些不是public的类。其他的类为主类提供功能,外界是看不到这些主类的,只能看见public主类。
7.对编译单元编译后,每一个类会生成一个字节码class文件。 然后这种就提供给JIT机制动态加载到方法区。
8.与c这种编译型语言的编译-连接-生成可执行文件不同,java的可执行文件.jar文件是一组.class文件打包后压缩形成的,由java解释器(有JIT机制)进行查找,装载,解释。
9.类库是一组类文件,即java文件,即多个编译单元。
10.java解释器寻找class文件的方式:先将包路径的点‘.’替换为斜杠,转化为相对文件路径,然后和CLASSPATH环境变量中的一个或者多个根目录相加,产生一个.class文件的绝对路径,此外解释器还会去找某些涉及java解释器所在位置的标准目录例如jre目录。如果CLASSPATH环境变量中有多个目录与刚才的相对路径相加后都存在要寻找的.class文件,则会以第一个为准,这时就要注意防止命名空间错误!
一句话,CLASSPATH是类搜索的根目录,可以有多个。
可以加上'.'给CLASSPATH,使得可以查找当前路径。
11.使用上面10的寻找方法后,再检查访问控制修饰符,根据当前import类和本类的目录关系来确定访问是否合法。
12.如果导入了两个使用的包,只要不使用那些同时存在两个包中的类就不会报错。
13.使用import static com.yml.Print.
导入一个包,可以用静态的方法在任意一个类中直接调用Print类的方法和变量了。
14.java没有C的条件编译功能是因为C主要使用条件编译用于跨平台,而java原生跨平台。
15.要想实现用于调试的条件编译功能,先创建两个包,debug和debugoff,包含一个相同的类,有一个静态的debug方法,第一个版本显示语句,第二个不显示任何语句。然后用import static 将分别将两个类轮流导入进一个测试程序中,就可使用条件编译效果。
16.当出现找不到类的时候,检查CLASSPATH,还有当前java文件的package语句。实在不行注释掉所有package,然后把所有java文件放在一个目录下。
17.如果出现类运行不对的时候,检查CLASSPATH是不是在多个路径下有同名的类class文件。
18.package是管理.java文件的。CLASSPATH是管理.class字节码类文件路径查找的,一般是import受影响。两个东西管理的东西不同,但是又相关。
19.结合第6条,默认的访问控制符号是包内访问。
20.在脑中想一下4种访问权限的表格。如果一个类想访问另一个类的成员,可以有几种权限和场景?
21.使用getter和setter。
22.没写package的都在默认包中,因此他们是处于同包之中的,因此所有无访问控制符号的成员都可互相访问,只有private才不能。
23.将一个类仅有的一个无参构造方法设为private,可以使用静态单例方法配合锁返回唯一实例,或者有数量限制的实例数量。这个类无法被继承!!
24.不是所有的父类成员都可能继承到子类,要受访问控制修饰有选择的继承到子类。!!
25.将类中成员按照public, protected, 默认, private排列,方便类库使用者阅读。
26.对于类只可以有默认和public两种权限控制协议。因此,对于一个类能做到的最小访问权限就是使用单例模式(或类似的使用静态方法获取实例)的了。例如ODBC的Connection对象的获取。
27.再来一遍:相同目录下的所有不具有明确package声明的文件,都被视作是该目录下默认包的一部分。

转载于:https://www.cnblogs.com/yumingle/p/6661454.html

Unable to start the daemon process. This problem might be caused by incorrect configuration of the daemon. For example, an unrecognized jvm option is used. Please refer to the User Manual chapter on the daemon at https://docs.gradle.org/7.5/userguide/gradle_daemon.html Process command line: E:\AS2023\jbr\bin\java.exe --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.prefs/java.util.prefs=ALL-UNNAMED --add-opens java.prefs/java.util.prefs=ALL-UNNAMED --add-opens java.base/java.nio.charset=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/java.util.concurrent.atomic=ALL-UNNAMED -Xmx8192M -Dfile.encoding=UTF-8 -Duser.country=CN -Duser.language=zh -Duser.variant -cp C:\Users\Chen Ting\.gradle\wrapper\dists\gradle-7.5-all\dwa490h3ro6flroizg9zas0ro\gradle-7.5\lib\gradle-launcher-7.5.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 7.5 Please read the following process output to find out more: ----------------------- FAILURE: Build failed with an exception. * What went wrong: java.net.BindException: Address already in use: bind * Try: > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. * Exception is: org.gradle.api.UncheckedIOException: java.net.BindException: Address already in use: bind at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:62) at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:41) at org.gradle.cache.internal.locklistener.FileLockCommunicator.<init>(FileLockCommunicator.java:51) at org.gradle.cache.internal.locklistener.DefaultFileLockContentionHandler.getCommunicator(DefaultFileLockContentionHandler.java:263) at org.gradle.cache.internal.locklistener.DefaultFileLockContentionHandler.reservePort(DefaultFileLockContentionHandler.java:255) at org.gradle.cache.internal.DefaultFileLockManager.lock(DefaultFileLockManager.java:109) at org.gradle.cache.internal.DefaultFileLockManager.lock(DefaultFileLockManager.java:96) at org.gradle.cache.internal.DefaultFileLockManager.lock(DefaultFileLockManager.java:91) at org.gradle.cache.internal.OnDemandFileAccess.updateFile(OnDemandFileAccess.java:51) at org.gradle.cache.internal.SimpleStateCache.update(SimpleStateCache.java:87) at org.gradle.cache.internal.FileIntegrityViolationSuppressingPersistentStateCacheDecorator$1.create(FileIntegrityViolationSuppressingPersistentStateCacheDecorator.java:50) at org.gradle.cache.internal.FileIntegrityViolationSuppressingPersistentStateCacheDecorator.doUpdate(FileIntegrityViolationSuppressingPersistentStateCacheDecorator.java:67) at org.gradle.cache.internal.FileIntegrityViolationSuppressingPersistentStateCacheDecorator.update(FileIntegrityViolationSuppressingPersistentStateCacheDecorator.java:47) at org.gradle.launcher.daemon.registry.PersistentDaemonRegistry.store(PersistentDaemonRegistry.java:232) at org.gradle.launcher.daemon.server.DaemonRegistryUpdater.onStart(DaemonRegistryUpdater.java:80) at org.gradle.launcher.daemon.server.Daemon.start(Daemon.java:171) at org.gradle.launcher.daemon.bootstrap.DaemonMain.doAction(DaemonMain.java:125) at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:50) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:60) at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:37) at org.gradle.launcher.daemon.bootstrap.GradleDaemon.main(GradleDaemon.java:22) Caused by: java.net.BindException: Address already in use: bind at java.base/sun.nio.ch.Net.bind0(Native Method) at java.base/sun.nio.ch.Net.bind(Net.java:555) at java.base/sun.nio.ch.DatagramChannelImpl.bindInternal(DatagramChannelImpl.java:1194) at java.base/sun.nio.ch.DatagramChannelImpl.bind(DatagramChannelImpl.java:1164) at java.base/sun.nio.ch.DatagramSocketAdaptor.bind(DatagramSocketAdaptor.java:107) at java.base/java.net.DatagramSocket.createDelegate(DatagramSocket.java:1426) at java.base/java.net.DatagramSocket.<init>(DatagramSocket.java:330) at java.base/java.net.DatagramSocket.<init>(DatagramSocket.java:389) at org.gradle.cache.internal.locklistener.FileLockCommunicator.<init>(FileLockCommunicator.java:49) ... 22 more * Get more help at https://help.gradle.org ----------------------- Check the JVM arguments defined for the gradle process in: - gradle.properties in project root directory 报错分析
07-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值