一.深入变量
定义变量的语法:
数据类型 变量名 = 值;
1.变量的分类和初始值
成员变量:
全局变量/字段(Field),不要称之为属性(这是错误的),直接定义在类中,方法外面;
1): 类成员变量
使用static修饰的字段;
2): 实例成员变量
没有使用static修饰的字段;
局部变量:
变量除了成员变量,其他的都是局部变量;
1):方法内部的变量;
2):方法的形参;
3):代码块中的变量(一对{}中的变量);
变量的初始值:
初始化才会在内存中开辟空间;
1): 成员变量
默认是有初始值的(如下图);
类型 | 初始值 |
---|---|
byte,short,int | 0 |
long | 0L |
float | 0.0F |
double | 0.0D |
boolean | flase |
char | ‘\u0000’(表示空) |
引用数据类型 | null |
2): 局部变量
没有初始值,所以必须先初始化才能使用;
2.变量的作用域和生命周期
变量的作用域:
变量的作用域是指变量的存在范围,只有在这个范围内,程序的代码才能访问它;当一个变量被定义是它的作用域就确定了;
变量根据定义的位置不同,各自的作用域也不相同,主要看变量所在的那对{};
1): 成员变量
在整个类中都有效;
2): 局部变量
在开始定义的位置开始,到紧跟着结束的花括号为止;
1): 成员变量:可以先使用后定义(因为它有默认的初始值);
2): 局部变量:必须先定义而后才能使用(因为它没有默认的初始值);
变量的生命周期:
变量的作用域决定了变量的生命周期,说明作用域不同,生命周期也就不一样;
变量的生命周期指的是一个变量被创建并分配内存空间开始,到该变量被销毁并清除其所占的内存空间的为止的这样一个过程;
- | 存在的位置 | 生命周期开始 | 生命周期结束 | 在内存中的位置 |
---|---|---|---|---|
类变量 | 字段,使用static修饰 | 当所在的字节码被加载进JVM | 当JVM停止 | 方法区 |
实例变量 | 字段,没有使用static修饰 | 当创建所在类的对象的时候 | 当该对象被GC回收 | 堆 |
局部变量 | 方法形参,代码块中,方法内 | 当代码执行到初始化变量的时候 | 所在的方法/代码块结束 | 当前方法的栈帧中 |
3.局部变量的初始化和在JVM中的运行机制
局部变量定义后,必须显示初始化后才能使用,因为系统不会为局部变量执行初始化操作;这就意味着,定义局部变量后,系统并未给这个变量分配内存空间;
直到程序为这个变量赋值时,系统才会为局部变量分配内存,并将初始化值保存到该内存中;
局部变量不属于任何类或实例,因此它总是保存在其所在方法的栈内存中;
1): 基本数据局部变量:
直接把这个变量的值保存到该变量所对应的内存中;
2): 引用数据局部变量:
这个变量内存中存的是地址,通过该地址引用到该变量实际引用堆里的对象;
栈内存中的变量无需系统垃圾回收,其往往随着方法或代码块的运行结束而结束;
4.变量的定义和选择
什么时候使用成员变量和局部变量?
1): 考虑变量的生存时间,这会影响到内存开销;
2): 扩大变量作用域,不利于提高程序的高内聚;
开发中应该尽量缩小变量的作用范围,如此在内存中停留的时间越短,性能也就越高;
不要随意使用static修饰,一般定义工具类的时候static方法需要访问的变量,该变量属于类,此时才使用static修饰字段;也不要随意使用成员变量,因为存在着线程不安全的问题,尽可能的使用局部变量;
二.封装思想
1.package语句
1).项目中的包结构
在Java中管理Java文件的特殊文件夹称之为包(package);
1): 关键字
package,专门用来给当前Java文件设置包名;
2): 语法格式
package 包名.子包名.子子包名
必须把该语句作为Java文件中的第一行代码(所有代码之前);
3): 编译时命令
javac -d . hello.java
如果此时hello.java文件中没有使用package语句,表示在当前目录中生成字节码文件;
如果此时hello.java文件中使用了package语句,此时表示当前目录中先生成包名,再在包中生成字节码文件;
4): 运行命令
java 包名.类名
2).企业项目结构
1>.包名如何定义
- 1.包名必须遵循标识符规范/全部小写;
- 2.企业开发中,包名采用公司域名倒写;
- 3.不能以java打头,因为Java的安全机制会检查;
1): 格式
package 域名倒写.模块名.组件名
2>.类的名称
1): 类的简单名称
定义类的名称 PackageDemo
2): 类的全限定名称
包名.类名 com.baidu.hello.PackageDemo
3): 在开发中都是先有package而后在package中再定义类;
3).Java常见包名
包名 | 描述 |
---|---|
java.lang | 语言核心类,系统自动导入 |
java.util | java工具类,集合框架,时间,日历等 |
java.net | 网络编程接口和类以后要写和网络相关的应用 |
java.io | 流的接口和类,做文件读写操作需要用到 |
java.text | java格式化相关类,做软件国际化需要用到 |
java.sql | jdbc相关接口和类,操作java连接数据库需要用到 |
java.awt | 抽象窗口工具集相关接口和类 |
javax.swing | 图形用户界面相关接口和类 |
2.import语句
import 类的全限定名;
只能导入某一个类;
import 包名.子包名.*;
表示会引入该包下的所有的在当前文件中使用到的类;
3.static import语句
1): 语法格式
import static 类的全限定名.该类中的static成员名;
import static 类的全限定名.*; // 此时*表示当前类的任意使用到的静态成员;
通过反编译工具发现,其实所谓的静态导入也是一种语法糖/编译器级别的新特性;
在实际开发中,不会使用静态导入,因为如此分不清某一个静态方法或字段来源于哪个类;
4.理解封装
1).什么是封装
1): 把对象的状态和行为看成一个统一的整体,将二者存放在一个独立的模块中(类);
2): “信息隐藏”,把不需要让外界知道的信息隐藏起来,尽可能隐藏对象功能实现的细节,向外暴露方法;保证外界安全访问功能,把所有的字段使用private私有化,不准外界访问,把方法使用public修饰,允许外界访问;
把所有数据信息隐藏起来,尽可能隐藏多的功能,只向外暴露便捷的方法,以供调用;
2).封装的好处
1): 使调用者正确方便地使用系统功能.防止调用者随意修改系统属性;
2): 提高组件的重用性;
3): 达到组件之间的低耦合性(当某一个模块实现发生变化时,只要对外暴露的接口不变,就不会影响到其他模块);
高内聚: 把该模块的内部数据,功能细节隐藏在模块内部,不允许外界直接干预;
低耦合: 该模块只需要给外界暴露少量功能方法;
5.访问权限修饰符
1): private
表示私有的,表示类访问权限,只能在本类中访问,离开本类之后就不能直接访问;
2): 不写(缺省)
表示包私有,表示包访问权限,访问者的包必须和当前定义类的包相同才能访问;
3): protected
表示子类访问权限,同包中的可以访问,即使不同包但是有继承关系的也可以访问;
4): public
表示全局的,可以公共访问权限,如某个字段/方法,使用了public修饰,则可以在当前项目中任何地方访问;
修饰符 | 类内部 | 同一个包 | 子类 | 任何地方 |
---|---|---|---|---|
private | √ | |||
无 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
一般的字段都使用private修饰,表达隐藏,为了安全性;
拥有实现细节的方法,一般使用private修饰,不希望外界(调用者)看到该方法的实现细节;
一般的,方法我们使用public修饰,供外界直接调用;
一般不使用无(缺省),即使要使用,也仅仅是暴露给同包中的其他类;
protected一般在继承关系中,父类需要把一个方法只暴露给子类;
6.JavaBean规范
JavaBean是一种Java语言的可重用组件(类);
1).必须遵循一定的规范
1): 类必须使用public修饰;
2): 必须保证有公共无参数构造器,即使手动提供了带参数的构造器,也要提供无参数的构造器;
3): 包含了属性的操作手段(给属性赋值,获取属性值);
2).分类
1): 复杂: UI,比如Button,panel,window类;
2): 简单: domain,dao,service组件,封装数据,操作数据库,逻辑运算等;
(封装现有字段,并提供getter/setter)
3).成员
1): 方法: Method
2): 事件: event
3): 属性: property
4).属性
1): attribute: 表示状态,Java中没有该概念,很多人把字段(Field)称之为属性(attribute),不要把成员变量叫做属性;
2): property: 表示状态,但是不是字段,是属性的操作方法(getter/setter)决定的,框架中使用的大多是属性;
5).字段:
private String name;
6).getter方法
仅仅用于获取某一个字段存储的值;
注意:
如果操作的字段是boolean类型的,此时不应该叫做getter方法而是is方法,把getName变成isName;
7).setter方法
仅仅用于给某一个字段设置需要存储的值;
每个字段都得提供一对getter/setter;
在JavaBean中有属性这个概念,只有标准情况下字段名和属性名才相同;
7.this关键字
1).理解this
this表示当前对象;
this主要存在于两个位置:
1): 构造器中: 就表示当前创建的对象;
2): 方法中: 哪一个对象调用this所在的方法,那么此时this就表示哪一个对象;
当一个对象被创建之后,JVM会分配一个引用自身的引用: this;
2).this的使用
- 1.解决成员变量和参数(局部变量)之间的二义性,必须使用;
- 2.同类中实例方法互调(此时可以省略this,但是不建议省略);
- 3.将this作为参数传递给另一个方法;
- 4.将this作为方法的返回值(链式方法编程);
- 5.构造器重载的互调,this(参数)必须写在构造方法的第一行;
- 6.static不能和this一起使用;
当字节码被加载进JVM,static成员就已经存在了,但是此时对象还没有创建,没有对象,就没有this;
当有多个构造器重载时或者多个方法重载时,一般使用少参数的调用多参数的;
8.构造器和setter方法选用
创建对象并给对象设置初始值的方式有两种:
1): 方式一: 先通过无参数构造器创建出一个对象,再通过对象调用相应的setter方法;
2): 方式二: 直接调用带参数的构造器,创建出来的对象,就有了初始值;
通过构造器和通过setter方法都可以完成相同的功能
给对象设置数据:
1): setter注入(属性注入);
2): 构造注入;
如何选择
1): 如果存在带参数的构造器,方式二是比较简洁的;
2): 如果在构建对象的时候需要初始化多个数据,如果使用方式二,那么构造器就得提供N个参数,参数过大,不直观,此时方式一,简单明了;
有的时候需要根据数据来构建对象,此时优先选用构造器的方式;其他时候任选;
9.判断点和圆的关系
名词解析法: 一般的名词要么是对象要么是状态;
反馈与建议
- 博客:我的CSDN博客
- 邮箱:pengtdy@gmail.com
- QQ交流群:644402856(新)
感谢你阅读这篇博客。如果您喜欢这篇博客就请关注我和朋友一起分享吧!