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

本文详细探讨了Java中的变量,包括变量的分类、初始值、作用域和生命周期,强调了局部变量的初始化机制。此外,还介绍了封装的重要性,讲解了包管理、import语句、访问权限修饰符和JavaBean规范,强调了this关键字的使用场景,并讨论了构造器和setter方法的选择策略。
摘要由CSDN通过智能技术生成

一.深入变量

定义变量的语法:

数据类型 变量名 = 值;
1.变量的分类和初始值

成员变量:
全局变量/字段(Field),不要称之为属性(这是错误的),直接定义在类中,方法外面;

1): 类成员变量
使用static修饰的字段;

2): 实例成员变量
没有使用static修饰的字段;

局部变量:
变量除了成员变量,其他的都是局部变量;
1):方法内部的变量;
2):方法的形参;
3):代码块中的变量(一对{}中的变量);

变量的初始值:
初始化才会在内存中开辟空间;

1): 成员变量
默认是有初始值的(如下图);

类型初始值
byte,short,int0
long0L
float0.0F
double0.0D
booleanflase
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.utiljava工具类,集合框架,时间,日历等
java.net网络编程接口和类以后要写和网络相关的应用
java.io流的接口和类,做文件读写操作需要用到
java.textjava格式化相关类,做软件国际化需要用到
java.sqljdbc相关接口和类,操作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.判断点和圆的关系

名词解析法: 一般的名词要么是对象要么是状态;


反馈与建议

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值