美文网首页善倾的知识体系构建之路程序员
包声明,包导入和注释以及变量

包声明,包导入和注释以及变量

作者: 善倾 | 来源:发表于2018-05-31 15:42 被阅读2次

    注释

    先讲注释,程序与注释的关系就好比人和衣服的关系。不写注释,并不会影响程序的执行,人不穿衣服也能生存,但谁会不穿衣服呢?人穿衣服的时候,还想穿的美美的呢!所以,注释也要写的美。

    注释的作用?

    • 增加代码可维护性,就是让人知道这代码用来干嘛的
    • 调试程序的一种方式
    • 使用 Annotation 来简化代码开发,代替 xml 配置文件

    注释的分类

    • 说明性注释:描述类和方法的注释,用文档注释书写
    • 功能性注释:描述属性在程序中的功能的注释,一般用单行注释书写

    关于 Javadoc

    至于具体的注释风格,以及 JDK 提供的 Javadoc 程序用来生成 API 文档的相关细节,在实际编码时用到了慢慢补充就可以了。

    • Javadoc 默认只能提取 public 和 protected 修饰的方法和字段
    • Javadoc 默认只能提取 public 修饰的类和接口
    • 文档注释中可以插入 HTML 标签,用于排版
    • @author,@param 等常用的标签,慢慢积累

    包导入,包声明

    包导入 import 关键字的作用是

    • 当该字节码文件在执行过程中,需要用到了本包中没有的字节码文件时,就会主动在当前目录下去寻找 import 关键字指明的字节码文件,import 关键字后面接的就是一个类字节码文件的全名。

    包声明 package 关键字有以下作用

    • 源码的角度来看,按照包名创建相应文件夹来管理 .java 源文件,体现了分包管理的机制,也为 java 程序的权限机制提供了必要条件。
    • 字节码的角度看,一个类的完整名字(包名.类名)是把包名也包含进去了的。所以说,当 java.exe 程序需要执行字节码文件的真正含义是,在当前目录下执行某个名字为类的全名的字节码文件,即必须指明类的全名!
    package practice1;
    import practice2.MyPoint2;
    
    public class MyPoint1 {
        public static void main(String[] args) {
            MyPoint1 p = new MyPoint1();
            System.out.println(p.getClass().getName());
            System.out.println("MyPoint1");
            
            //同包下的类
            Person person1 = new Person();
            System.out.println(person1);
            
            //practice2包下的类
            MyPoint2 point2 = new MyPoint2();
            System.out.println(point2);
        }
    
    }
    
    
    

    结合以上代码,从 IDE 工具的角度来理解为什么是这样的。只有理解IDE 为你做的每一个工作,才真正达到了可以使用 IDE 的层次。

    新建一个工程为 test ,在 practice1 包下新建 MyPoint1 和 Person 类,在 practice2 包下新建 MyPoint2 类。以上在文件资源管理器中看到的情况是,IDE 帮你在磁盘中创建 test 目录,并且它下面还有 bin 和 src 目录,src 目录下按照包名创建相应文件夹来放置 .java 源文件。

    当你在 IDE 工具中点击运行按钮时,其实 IDE 帮你做了以下工作。首先在 test 目录下执行 javac -d bin src/*/*.java,即把 src 目录下的所有子目录以及各子目录下的 .java 都编译了,按照包名在 bin 目录下组织存放相关的 .class 文件。

    然后,在 bin 目录下执行java practice1.MyPoint1,JVM 就会加载practice1.MyPoint1.class 到内存中,开始执行程序。

    所以,以后在使用 IDE 工具的图形化界面操作的时候,多想想它在底层都为你做了什么?只有这样才能到达使用 IDE 工具的做高境界,使用 IDE 工具是为了帮助自己简化工作,而不是让自己依赖 IDE ,没有 IDE 就无法工作了。

    变量

    所谓变量就是在内存当中按照其数据类型分配固定大小的一个存储空间,专门用来存储数据,这个数据可以随时改变。与之相对应的叫做常量,即它在内存当中的值不可改变。

    要真正理解变量之间的区别,其实只要心中时刻想着内存图,理解它在内存当中的划分,就不可能会出错。

    变量内存分布图

    局部变量

    局部变量定义在方法和类的语句块里面,作用范围有限,它存放在栈区。

    • 当局部变量和全局变量在作用域内冲突时,会被默认认为是局部变量,正所谓山高皇帝远嘛!这完全可以通过规范化命名来避免冲突啊。

    • 局部变量是在对应的方法栈帧里面分配空间的,由于栈这种数据结构本身是不稳定的,所以并不需要 GC 来负责回收内存。

    • 所有在栈里面的局部变量都不会有默认的值,只是一个随机的垃圾值。

    • 方法的形参也是这个方法内部的局部变量,在方法被调用时有了初始值

    全局变量

    全局变量定义在类里头,且在被创建的时候就会根据其数据类型有一个默认的初始值,它存放在堆区或者方法区。

    静态全局变量

    静态全局变量在类的字节码文件被加载到类代码区时,JVM 下一步要做的就是在静态数据区给静态全局变量开辟空间。

    静态全局变量会和该类进行静态绑定,并且当该类的对象在堆区开辟空间时,也会有一个和静态变量同名的实例变量存在,指向静态数据区的内存空间。也就是说这个实例全局变量的值是该静态数据在静态数据区的地址!

    类是通过静态绑定机制来调用静态方法和变量的,而对象则是通过引用机制实现的此功能。

    由于静态全局变量是依赖于类而存在,所以它的生存周期很长,一直在内存中存在,所以没事还是不要乱用静态全局变量。同时也会增大程序的耦合性,因为这个类和这个类的所有对象都可以使用和改变这个属性。

    实例全局变量

    实例全局变量是依赖于对象而存在的,每一个对象都完整且单独拥有这些实例属性。理解了每一个对象在堆内存当中都有一个完整、独立的内存空间,其他好像没什么好说的了。

    对象尽量不要创建在普通方法中,当该方法退栈时,局部变量消失,它在堆内存的对象会变成游离态,变成了垃圾。这一块内存区域因为没有对象的句柄而用不上,又无法用来创建其他对象,就造成了内存泄露。当一块内存没有使用价值,又无法被重新利用时,就好像这块内存没有了一样,就叫做内存泄漏。

    不是有 GC 吗?不会回收啊?你还真是 too young 啊!Java 垃圾回收机制尽管有用也没有那么牛皮吧?即使是自己生产对象,使用内存的 c++ 程序员,都没法用好内存,一个不了解你的程序能这么智能?所以说,GC 只是能够改善内存,不可能那么理想化的。

    Java 中的实参和形参中只有值传递。栈中的基本类型直接把它的内容给了形参,给的是值,栈中的引用类型给的是地址,这是因为它的内容就是对象在堆区的地址啊。

    相关文章

      网友评论

        本文标题:包声明,包导入和注释以及变量

        本文链接:https://www.haomeiwen.com/subject/hhiqsftx.html