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

注释

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

注释的作用?

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

注释的分类

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

关于 Javadoc

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

  • Javadoc 默认只能提取 public 和 protected 修饰的方法和字段
  • Javadoc 默认只能提取 public 修饰的类和接口
  • 文档注释中可以插入 HTML 标签,用于排版
  • @author,@param 等常用的标签,慢慢积累
  • @Deprecation 英文含义是弃用的意思。可以用来修饰类、属性、方法。JDK 提供的标准类会随着版本不断更新,所以会出现一些之前设计的不好的,后续版本提供了新的、更好的替代品,所以把之前的设计用@Deprecation 注解来标注它已经过时了,不推荐使用。但是之所以仍然存在,没有彻底剔除掉它,是为了向下兼容。避免以前的项目当中用到了这些方法,而导致项目不能正确运行。这也是没办法的事情了!

包导入,包声明

import 和 package 都是在对字节码文件进行操作,和源码没关系,因为源码是给人看的,字节码才是给机器运行的,对机器而言根本就不存在源码这种东西。import 是用来指定去哪里找字节码文件,package 是用来指定这个 java 文件编译后的字节码放到指定的目录下。平时看到的分包管理源代码的机制,其实是 IDE 工具的一厢情愿,碰巧它能用来分类管理源代码而已。不使用 IDE 工具的时候,源代码根本就不需要按照包名来建立相应文件夹管理,同样可以直接编译,成功运行。这便是一个有力证明!

包导入 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 就无法工作了。

变量

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

按照数据类型的角度分类

变量按照数据类型的角度分类,可以分为基本数据类型变量和引用数据类型变量。

基本数据类型变量

Java 中基本数据类型变量无论在哪种操作系统、哪种硬件架构中,它们都占据固定不变的存储大小。能做到这一点就是因为 java 程序是运行在虚拟机上的,这也是 java 程序移植性更好的原因之一。

引用数据类型变量

对于引用数据类型变量,如果把对象比作电视机的话,那么遥控器就是这个对象的引用。在 Java 这种完全面向对象的语言中,想要对对象进行操作,只要拥有这个对象的引用就可以了。这个引用可以任意带走,无论在哪里,都可以通过它来使用对象。这在复杂的分层项目当中,将对象引用的值,也就是对象在内存中的地址,作为参数到处传递的过程中,体现的淋漓尽致。这个比喻出自《 Java 编程思想》一书。

按照内存中的不同位置分类

变量按照内存中的不同位置分类,可以分为局部变量,实例全局变量和静态全局变量。要真正理解变量之间的区别,其实只要心中时刻想着内存图,理解它在内存当中的划分,就不可能会出错。

_Java 内存模型图.png

局部变量

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

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

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

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

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


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

静态全局变量

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

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

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

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

实例全局变量

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

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

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

Java 中只有值传递

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • 注释 先讲注释,程序与注释的关系就好比人和衣服的关系。不写注释,并不会影响程序的执行,人不穿衣服也能生存,但谁会不...
    善倾阅读 199评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,559评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • 近期的目标是时间管理,所以今天我的咖啡冥想内容是 1.今天早上起床按照樊登教的方法,拉筋,弓腿,拍面, 揉...
    96291458eb20阅读 187评论 0 1
  • 在这个跨界打劫、飞速变化的时代,你永远也无法想象下个竞争对手,你也很难猜到新兴的什么行业就打败了传统的什么行业。 ...
    锡山闲谈阅读 240评论 0 0