Java基础-第六章(面向对象2)

2018-02-27 11:35:00来源:oschina作者:PengTdy人点击

分享

一.深入变量

定义变量的语法:


数据类型 变量名 = 值;
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): 方法: Method2): 事件: event3): 属性: 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(新)

感谢你阅读这篇博客。如果您喜欢这篇博客就请关注我和朋友一起分享吧!

微信扫一扫

第七城市微信公众平台