zoukankan      html  css  js  c++  java
  • Java超简明入门学习笔记(四)

    Java编程思想第4版学习笔记(四)
    第六章 访问权限控制
     
          访问权限控制是面向对象编程中的重要概念,它划分了类设计者和类使用者的界限。通过设置权限,它一方面告诉类设计者,哪个部分的修改、更新和完善是对类使用者没有影响的;另一方面也告诉了类使用者,可以使用哪些类,和哪些类成员,剩下被隐藏起来不可访问的成员都是类使用者不需要具体了解的实现细节和一些辅助抽象机制。Java通过public、protected和private关键字提供不同的访问权限。并且通过包的概念分离名字空间,并在同样的名字空间里,也有一套规则。本章就围绕访问权限控制展开。
     
         知识点1:P110,6.1,包
          Java中可以把众多类定义的文件捆绑到一个类库单元,也就是 包 里面。一些访问权限的修饰词会因为类是否和其他部分处于一个相同的包里产生影响,因此首先要学习管理、使用、制作、导入包,明确它的概念。(第二章对import的介绍只是提到了包概念的一部分),包就相当于C++中的命名空间(namespace)。
         在代码中使用包和包下的类
         正如第二章所说,包就是一个Java类库,是程序员写好、打包好的一些类、方法的集合。让不同开发者的不同类型的构件(类定义)放置于不同的包内,可以防止名字冲突。如果你想使用的类在一个包中,那么要么在代码中使用import来表示这个文件使用此包;要么直接使用这个类,但是要通过包名来体现类的具体信息,比如java.util.Date d = new java.util.Date(); 不过这种写法实在太过冗长,这种写法一般用于这种情况:有两个不同的包,他们都有一个同名的public类,当你同时import了两个包,想使用其中一个包里的类,这个类名正好也在另一个包里出现了,这时需要使用全名告诉Java的解释器你到底想要使用哪一个类。
         默认包
         我们自己编写的Java代码文件中也有一些类,如无特殊声明,这些类就处于一个“默认包”里。每一个Java代码文件是一个编译单元,虽然读者可能尚未明确public修饰一个类的意义,但一个编译单元里只能有一个public类,如果这个编译单元里有其他的非public修饰的类,那么这个类只在默认包内可见,外界无法访问这个类。因此非public修饰的类应该被设计为是只为支持public类的实现而存在的。默认包的这种特征也相当于构成了一种访问的约束条件。了解了这个特性,很容易得出:同一个包内只有里面用public修饰的类是外部可以使用的,这也说明了public修饰一个类到底意味着什么。
         静态导入一个包
         static是一个神奇的关键词,它还可以用于导入包语句中,你可以这么写:import static 包名; 以此来静态地导入一个包。这种写法让包里所有的类的静态成员直接可见,不需要再使用类名.静态成员名的方式,直接使用静态成员名,就可以访问静态成员。主要作用是可以省时间。
         
         知识点2:P110,6.1.1,Java代码是怎么产生效果的
          即使现在的语言不应该再使用解释型和编译型来区分(C语言也有解释器实现的版本,这取决于开发环境。而Java也有编译的部分),不过如果想大致理解Java写出的文本是怎么从代码编程一个可执行的软件,还是可以借用这两个概念。
         当编译一个.java文件时,再.java文件中的每个类都会有一个输出文件,而该输出文件的名成与.java文件名相同(除了后缀的部分不同,输出文件后缀为.class(编译好的java文档),输出文件中的代码有时也被称为Java字节码)。
         Java可运行程序就是这样一组可以打包并压缩为一个JAR文件的.class文件。Java虚拟机JVM具体地解释它们。关于Java代码的执行、解释、垃圾回收等等抽象设施的具体实现,都要依赖于JVM,越深入的了解JVM,就越能清晰的了解Java,不过这不属于编程语言语法的部分,因此本书也未过多提及。
     
         知识点3:P111,6.1.1,自定义一个包
          有时候我们自己是类库的开发者,不想使用可能会产生访问控制权限问题的默认包,那么我们需要自己定义一个包并把我们自己写的类放在包内进行名字保护。
         package关键字可以使你的一个文件中的所有类属于同一个包,并且自定义包名。如果想使用package语句,它必须是一个.java文件中除了空白和注释的第一行代码。这行代码看起来像这样:package 包名;
         这就表示这个文件下所有的类都是包名所代表的这个类库的一部分。包名必须是小写字母或.分隔符构成的名字。
         
         知识点4:P111,6.1.2,自定义包的编译细节
          很多人学习Java是从如何在Windows系统上配置Java开发环境学起的,大多数人都被建议配置JAVA_HOMEPATHCLASSPATH这三个环境变量。前两者是为了一些使用和查找时不用使用完整路径的遍历,方便你使用命令行手动编译并打包你的java文件,后者就和包有一些关系。
         不过现在有很多优秀的Java集成开发环境,比如IDEA,可以让程序员不再对着命令行敲命令这种原始的方式来debug和开发,也不需要通过一个静态的路径访问包了,因此配置这些环境变量并非是必须的。
         如前所述,Java的包可以表现为一些.class文件聚合的形式(也有另一种形式,不过这不是本章的内容),通常特定包的.class文件都在一个目录下,这个目录和你的CLASSPATH以及包名有关。比如你使用了package语句:package com.blahblah.util;,那Java解释器会找到你的CLASSPATH文件夹,在下面建立一个这样的子目录:.../com/blahblah/util/,把你的包名转换为相对路径,最后把.class文件塞到这个路径下。这样当编译器看到import com.blahblah.util;的语句时,它就知道去哪里找这个包了。
         当然这很费劲,如果遇到以JAR形式提供的包,你还需要把这个JAR的根路径和JAR文件名字一起加到CLASSPATH里。因此,很多集成开发环境都提供了一些图形化的按钮,你点一下,选一个包,就好了。不用管什么环境变量,.class文件的位置和jar文件的位置了。但这只解决了包管理的一部分问题:使用它的复杂性被降低了,并没有解决所有问题,比如怎么不浪费时间在检查两个包有没有重名的类上,比如保证工作室里面所有人使用的包都是某个包的4.1版本而非4.0.4版本...因此后来人们又搞出来了更多更先进的包管理工具,比如maven。它们也值得去学习。
     
         知识点5:P116,6.2,Java访问权限修饰词
         访问权限概述:    
         对于一段代码,如果它要访问一个类成员,有四种情况可以使这种访问合法:1. 被访问类成员被public修饰。2. 被访问类成员没有任何修饰,访问者和被访问者定义在同一个包内。3. 通过继承(下一章会提到)访问其父类的public/protect成员。4.使用getter/setter(后面会提到)或其他类内函数间接地访问类内的私有成员。  
         包访问权限:
         在Java中,无论是类还是类成员,都有访问权限,如果不对一个类/类成员提供任何权限修饰词,则它会拥有一个包访问权限。如果两个java文件都在同一个目录里并且它们的代码里没有package语句,则它们处于同一个默认包里,可以互相访问对方所有没有使用访问权限关键词修饰的成员。
         不加访问权限修饰词可以使一个类/类成员获得包访问权限,包中所有的类都可以对拥有包访问权限的类/类成员进行访问,它们对包外的类来说不可见。
         类成员的public访问权限:
         使用关键字public修饰一个类成员时,代表这个类成员可以被所有代码访问。
         类成员的private访问权限:
         除了这个成员所在类的其他成员,其他任何代码都无权访问。这个机制用来把类设计者要操心的部分和类使用者要了解的地方分离开。
         类成员的protected访问权限:
         如果你了解第一章和下一章都提到了的“继承”的概念,你就能很容易地理解它。protected访问权限代表它修饰的类成员只能被自己的类成员和子类(如果有的话)的类成员访问。
     
         知识点6:P121,6.4,类的访问权限
         在Java中,类本身也可以被访问权限关键词修饰,除了一种叫做内部类的特殊类可以被privateprotected关键字修饰(后面会提到),其它的类都只能被public关键字修饰。这就意味着,一般的类本身只有两种可能的访问权限:可以被任意代码访问的public访问权限包访问权限。对类的访问就是声明并使用这个类的对象。
         当然,如前所述,每个.java文件中只能有一个或零个被public修饰的类,这个类的名字必须和.java文件的文件名严格匹配。
     
         第六章 练习题
         练习1:在某个包中创建一个类,在这个类所处的包的外部创建该类的一个实例。
     1 //Test1.java
     2 package tutu;
     3 public class Test {}
     4 
     5 //MainTest.java
     6 import tutu.*;
     7 public class MainTest {
     8     public static void main(String[] args) {
     9         Test t = new Test();
    10     }
    11 }
    练习1答案
         练习2:包冲突示例,略。
         练习3:包使用练习,略。
         练习4:展示protect方法具有包访问权限,但不是public。
    1 //Test1.java
    2 package tutu;
    3 public class Test { protect func(){} }
    4 
    5 //Test2.java
    6 package  tutu;
    7 public class Test2 extands Test{
    8      public Test2(){ func(); }
    9 }
    练习4答案
         练习5、6、7:回顾书上的一些例子,略。
         练习8:效仿上一个示例,创建一个名为ConnectionManager的类,该类管理一个元素为Connection对象的固定数组。类使用者不能直接创建Connection对象,而只能通过ConnectManager类的某个static方法来获取它们,当ConnectManager之中不在有对象时,这个static方法会返回一个null引用。
     1 class Connection{
     2     private Connection(){};
     3     static Connection getAConnection(){ return new Connection(); }
     4 }
     5 
     6 class ConnectionManager{
     7     static void getConnections(){
     8         Connection[] cns = { Connection.getAConnection(),Connection.getAConnection(),Connection.getAConnection(),Connection.getAConnection() };
     9         connections = cns;
    10     }
    11     static Connection[] connections;
    12 }
    13 
    14 public class MainTest {
    15     public static void main(String[] args) {
    16         ConnectionManager.getConnections();
    17     }
    18 }
    练习8答案
       练习9:如果找到(预先设置了)目录(到环境变量),就会成功。package语句应在最前面(很多集成开发环境要通过图形界面先建一个包,才能在其下新建.java文件)。
  • 相关阅读:
    解决Laravel 开启HTTPS反向代理时Url一直是Http问题
    Laravel Passport 401 Unauthenticated.
    Windows 10 1909 (2020年1月) DVD (Chinese-Simplified)
    Office Professional Plus 2019 下载安装激活
    电脑设置U盘启动快捷键
    适用于 Laravel 的阿里云MNS队列驱动
    idea 2021版下创建springMvc项目过程
    UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)
    Mac 下打包python 程序
    Tomcat 对 servlet 的支持表
  • 原文地址:https://www.cnblogs.com/tutut/p/7285218.html
Copyright © 2011-2022 走看看