Java中可以通过访问控制符来控制访问权限。其中包含的类别有:public, “友好的”(无关键字), protected 以及 private。在C++中,访问指示符控制着它后面所有定义,直到又一个访问指示符加入为止,而在Java中,每个访问指示符都只控制着对那个特定定义的访问。

为Java创建一个源码文件时,它通常叫做一个“编译单元”(有时也叫做“翻译单元”)。每个编译单元都必须有一个以.java结尾的名字。而且在编译单元内部,可以有一个公共(public)类,它必须拥有与文件相同的名字(包括大小写形式,但排除.java文件扩展名)。同时每个编译单元内都只能有一个public类,其它的类可在包外部进行隐藏,因为它们是非“公共”的。

在编译.java文件时,我们会获得一个名字完全相同的输出文件;但对于.java文件中的每个类,它们都有一个.class扩展名。一个有效的程序就是一系列.class文件,它们可以封装和压缩到一个JAR文件里。Java解释器负责对这些文件的寻找、装载和解释。

注:Java并没有强制一定要使用解释器。一些固有代码的Java编译器可生成单独的可执行文件。

Java解释器的工作程序如下:首先,它找到环境变量CLASSPATH。CLASSPATH包含了一个或多个目录,它们作为一种特殊的“根”使用,从这里展开对.class文件的搜索。从那个根开始,解释器会寻找包名,并将每个点号替换成一个斜杠,从而生成从CLASSPATH根开始的一个路径名(如package foo.bar.baz会变成foo/bar/baz或foo\bar\baz)。随后将它们连接到一起,成为CLASSPATH内的各个条目(入口)。以后搜索.class文件时,就可以从这些地方开始查找准备创建的类名对应的名字。此外,它也会搜索一些标准目录。

自动编译

为导入的类首次创建一个对象时,编译器会在适当的目录里寻找同名的.class文件。若只发现X.class,它就是必须使用的那个类。然而,如果它在相同的目录中还发现一个X.java,编译器就会比较两个文件的日期标记。如果X.java比X.class新,就会自动编译X.java生成一个最新的X.class。

Java访问指示符

如果根本不指定访问指示符,则为默认访问,它通常称为“友好”访问。这意味着当前包内的其他所有类都能访问“友好”的成员。但对包外的所有类来说,这些成员却是“私有”的,外界不得访问。由于一个编译单元只能从属于单个包,所以单个编译单元内的所有类相互间都是自动“友好”的。因此,我们也说友好元素拥有“包访问”权限。

为了获得对一个类成员的访问权限,唯一的方法就是:

  1. 使成员成为"public"。这样所有人从任何地方都可以访问它
  2. 变成一个“友好”成员,方法是舍弃所有访问控制符,并将其类置于相同的包内。这样一来,其他类就可以访问成员
  3. 一个继承的类既可以访问一个protected成员,也可以访问一个public成员(但不可以访问private成员)。只有两个类位于相同的包内时,它才可以访问友好成员
  4. 提供“访问器/变化器”方法(亦称“获取/设置”方法),以便读取和修改值。

对于private关键字,除非是那个特定的类或者该类的方法中,否则没有人能够访问private关键字修饰的成员。

当使用private对默认构造器进行定义时,可以防止对这个类的继承。

我们使用extend关键字来继承基类。语法如:

Class A extend B{}

其中A将成为B的衍生类。在衍生器的构建器中,Java会自动插入对基础类构建器的调用,当然,只会调用默认构建器,如果需要使用基类的含参构建器,则需要通过super(参数列表)来进行调用。同时,在衍生类进行初始化的时候,将首先对其基类进行初始化。需要注意的是,当基础类中不包含无参构建器时,需要在衍生类的构建器的第一行进行基类构建器的指定。

public class Test {
public static void main(String[] args) {
B b = new B();
}
} class A{
public A(){
System.out.println("construct A");
}
} class B extends A{
public B(){
System.out.println("construct B");
}
}
// output
/*
construct A
construct B
*/
public class Test {
public static void main(String[] args) {
B b = new B("hello");
}
} class A{
public A(String a){
System.out.println("construct A with param " + a);
}
} class B extends A{
public B(String b){
super(b);
System.out.println("construct B");
}
}
// output
/*
construct A with param hello
construct B
*/

许多程序设计语言都有自己的办法告诉编译器某个数据是“常数”。常数主要应用于下述两个方面:

  1. 编译期常数,它永远不变
  2. 在运行期初始化一个值,我们不希望它发生变化

对于编译期的常数,编译器(程序)可将常数值“封装”到需要的计算过程中。也就是说,计算可在编译期间提前执行,从而节省运行时的一些开销。在Java中,这些形式的常数必须属于基本数据类型,而且要用final关键字进行表达。在对这样的一个常数进行定义时,必须给出一个值。并且对于final字段,其储存的一个数据是不得改变的。

对于基本数据类型,final会将值变成一个常数,但对于对象句柄,final会将句柄变成一个常数。进行声明时,必须将句柄初始化到一个具体的对象。而且永远不能将句柄变成指向另一个对象。然而,对象本身是可以修改的。

对于自变量来说,如果我们使用final进行修饰,则不能在之后对其值进行修改,而如果是一个方法(函数)被我们使用final进行修饰,则该方法的行为在继承期间将会保持不变,而且不可被覆盖或改写。如果我们希望一个类不能被继承,我们同样也可以使用final进行修饰。

在同时有static且进行继承时,程序的初始化顺序为:装载程序首先会注意到它的基础类,随后将之载入。无论是否准备生成那个基础类的一个对象,这个过程都会发生。若基础类中含有另一个基础类,则另一个基础类随即也会载入,以此类推。接下来,会在根基础类执行static初始化,再在下一个衍生类执行,以此类推。此时,所有必要的类已经装载完毕,所以能够创建对象。首先这个对象中的所有基本数据类型都会设成它们的默认值,而将对象句柄设置为null。随后会调用基础类构建器。基础类的构建采用与衍生类构建器完全相同的处理过程。基础类构建器完成之后,实例变量会按本来的顺序得以初始化。最后,执行构建器剩余的主体部分。

Thinking in Java学习杂记(1-4)

Thinking in Java学习杂记(第7章)

Thinking in Java学习杂记(5-6章)的更多相关文章

  1. Thinking in Java学习杂记(第7章)

    将一个方法调用同一个方法主体连接到一起就称为"绑定"(Binding).若在程序运行以前执行绑定,就叫做"早期绑定".而Java中绑定的所有方法都采用后期绑定技 ...

  2. 20145330《Java学习笔记》第一章课后练习8知识总结以及IDEA初次尝试

    20145330<Java学习笔记>第一章课后练习8知识总结以及IDEA初次尝试 题目: 如果C:\workspace\Hello\src中有Main.java如下: package cc ...

  3. Java 学习笔记 ------第三章 基础语法

    本章学习目标: 认识类型与变量 学习运算符的基本使用 了解类型转换细节 运用基本流程语法 一.类型(基本类型) 所谓基本类型,就是在使用时,得考虑一下数据用多少内存长度存比较经济,利用程序语法告诉JV ...

  4. Java 学习笔记 ------第四章 认识对象

    本章学习目标: 区分基本类型与类类型 了解对象与参考的关系 从打包器认识对象 以对象观点看待数组 认识字符串的特性 一."=" 和 "==" 当=用于基本类型时 ...

  5. Java 学习笔记 ------第五章 对象封装

    本章学习目标: 了解封装的概念与实现 定义类.构造函数与方法 使用方法重载与不定长度自变量 了解static方法 一.Java封装概念 在面向对象程式设计方法中,封装(英语:Encapsulation ...

  6. Java 学习笔记 ------第六章 继承与多态

    本章学习目标: 了解继承的目的 了解继承与多态的关系 知道如何重新定义方法 认识java.lang.object 简介垃圾回收机制 一.继承 继承是java面向对象编程技术的一块基石,因为它允许创建分 ...

  7. [core java学习笔记][第十一章异常断言日志调试]

    第11章 异常,断言,日志,调试 处理错误 捕获异常 使用异常机制的技巧 使用断言 日志 测试技巧 GUI程序排错技巧 使用调试器 11.1 处理错误 11.1.1异常分类 都继承自Throwable ...

  8. [core java学习笔记][第四章对象与类]

    4.3 用户自定义类 4.3.1 类数组的声明 需要两次new Employee[]=staff=new Employedd[3]; staff[0]=new Employedd(参数列表); sta ...

  9. thinking in java学习笔记:14章 类型信息

    14.2 Class 对象 https://github.com/zhaojiatao/javase 1.什么是Class对象,Class对象是用来做什么的? Class对象是java程序用来创建类的 ...

随机推荐

  1. mysql 分表实现方法详解

    如果你需要进行mysql分表了我们就证明你数据库比较大了,就是把一张表分成N多个小表,分表后,单表的并发能力提高了,磁盘I/O性能也提高了.并发能力为什么提高了呢,因为查寻一次所花的时间变短了,如果出 ...

  2. FastDfs安装文档

    安装顺序 libfastcommon fdfs_tracker ==> 依赖:Gcc.libevent.perl fdfs_storage FastDFS-nginx-module nginx ...

  3. cocoapods iOS类库管理工具的安装与使用

    CocoaPods是一个管理Swift和Objective-C的Cocoa项目的依赖工具.他可以优雅地帮助你扩展你的项目.简单的说,就是替你管理Swift和Objective-C的Cocoa项目的第三 ...

  4. unittest实战(一):用例框架

    import unittest class forTest0(unittest.TestCase): @classmethod def setUpClass(cls) -> None: prin ...

  5. 5行js代码搞定导航吸顶效果

    一.HTML布局 首先写HTML布局 <body> <div id="wrap"></div> </body> 二.CSS样式 给点 ...

  6. 微信SEO怎么做-最新微信SEO干货

    星辉信息科技进行微信SEO已经很多年了,结合多年的微信SEO经验通过浅谈微信SEO.微信SEO的3大优势.微信SEO的6个排名技巧.企业和个人微信SEO的4大优化战略来讲,可以完美解决B端C端微信获客 ...

  7. jenkins操作

    jenkins忘记用户名以及登录密码的解决方法 1.jenkins 根目录下找到config.xml,修改配置  <useSecurity>true</useSecurity> ...

  8. 由世界坐标系转换到摄像机坐标系的lookAt()函数

    在学习图形学和opengl的时候,都涉及到坐标转化,从物体坐标转换为世界的坐标,从世界的坐标转换为摄像机的坐标. 在世界坐标到摄像机转换的过程中常用lookAt函数得到转化矩阵.GLM官方文档对它的解 ...

  9. Iterm2 快捷操作

    窗口操作 新建窗口:Command + N 关闭所有窗口:Shift + Command + W 窗口之间切换 前一个窗口: Command + [ 后一个窗口:Command + ] 进入窗口1,2 ...

  10. Java自学路线图之Java框架自学

    Java自学路线图的框架分为两个阶段,第一阶段的Java框架包含六个内容:MyBatis,Spring,SpringMVC,Maven高级,Git,Dubbo. 在Java自学过程中掌握框架的使用,对 ...