2 匿名对象以及对象的生命周期
2.1 匿名对象引入
案例: public static void main(String[] args) { //3.1. 创建对象 Student stu = new Student(); //3.2. 对象赋值 new Student().name = "苍老师"; //其实这就是匿名对象 //3.3. 对象取值 System.out.println(new Student().name);// null } |
2.2 什么是匿名对象
概念:
- 匿名对象,就是创建了一个对象而没有使用变量接收
- 但是匿名对象本质也是一个对象(具体的值)
- int i = 10;//int数据类型 i变量 值,具体的一个数据
- Student stu = new Student();//Student数据类型 stu变量 new Student();堆中的一个对象
2.3 匿名对象使用场景
1 : 只需要使用一次的情况(如:调用一次非static修饰的普通方法、作为方法实参使用)
|
2.4 对象的生命周期
1. 对象的生命周期(就是对象从开始到结束的过程)
1.1开始 : new Student() ,new的时候就开始了;堆中
1.2结束:
1.2.1 说法1(常见的说法) :当对象失去所有的引用(没有变量再指向它了)
1.2.2 说法2 : 对象真正的被销毁(对象会在堆里面占用内存,当把对象的内存空间回收了),Java有自动垃圾回收机制(GC);
6.5匿名对象和生命周期总结:
3 包(package)
3.1 包package概念
概念:简单的理解包就是一个文件夹
3.2包作用 (不是单纯的文件隔离,目的是告诉jvm知道文件隔离)
① 可以管理代码结构
500W项目(10000个文件) 没有包不好管理
② 可以避免类名冲突的问题
一个项目中有可能多个类名一样
示例:生活中例子,有很多资源 片,怎么管理这些片?文件夹
大片儿
国产
欧美
爱情
动作
爱情动作
某菲与大蟒蛇的故事.avi
日本
爱情
动作
爱情动作
爱情野兽派
叶某与小蟒蛇的故事.avi
…
3.3如何使用包
3.3.1. 定义包
包命名规范:
一般是公司域名反过来写+项目名+模块名字+子模块名
包名中应该全部都是英文,并且是小写的
例如 : itsource.cn 域名
package cn.itsource.erp.oa.domain;自动化办公
package cn.itsource.erp.sa.entity; 系统管理
注意:不要写成nc.
例如: package cn.itsource.packagedemo;//声明包 /** * 包package */ public class PackageDemo { public static void main(String[] args) { new java.util.Date(); new java.sql.Date(1L); System.out.println(); } } |
3.3.2. 导入包(其实本质是导入包中的类)
导入包的语法 : import 包名.子包名.类名;
现在用eclipse工具自动导包,快捷键:ctrl + shift + o
注意:
1. 导入包的代码应该在声明包(就是该类所在的包)的后面,声明类的前面
2. import java.util.*; 表示导入本包中所有会使用到的,util包中的类;
只会导入util包下面直接的类型,不包括util包的子包中的类型
3. java.lang是核心包,下面的直接类型是自动导入的;
例如:String、System类
lang包的子包中的类型不会自动导入,需要手动导入
4. 在一个类中会用到同名不同包的时候必须使用全限定路径
例如:同时使用java.util.Date和java.sql.Date
例如: package cn.itsource.packagedemo;//声明包 import java.util.*;// 只会导入util包下使用到的类 /** * 包package */ public class PackageDemo { public static void main(String[] args) {//String是java.lang核心包下的,程序会自动导入; new java.util.Date();// 在一个类中用同名不同包的时候必须使用全限定路径 new java.sql.Date(1L);// 在一个类中用同名不同包的时候必须使用全限定路径 } } |
3.4了解Java中的包
java/ javax(java增强包)
java.lang (java的核心包--基本包)
java.util(java的工具包 --集合框架ArrayList LinkedList)
java.io(java IO包input-output 读写文件)
java.net(网络编程)
java.awt/javax.swing(java的图形化界面)
java.math 数学相关的包
java.sql 数据库相关的包
- java.text 是文本格式化相关的包
java.time 时间相关的包
4. 封装
4.1为什么要封装?
现实生活中封装概念的引入 |
- 大家想一想生活中封装是什么?
- 例如 网购一个娃娃(充气的) : 亲,请帮我打包严实一点,注意保密啊!
包装是网络保护隐私、安全
- 台式机电脑:机箱[ 主板 显卡 内存 电源 硬盘…]
机箱是保护里面硬件的安全
以上示例的共同点总结:
都是通过物理层面封装的操作,达到从控制访问的目的
Java中为什么要封装? 因为可以任意修改对象的成员变量值不安全 案例: package cn.itsource.potting; /** * 账户类 */ public class Account { /**账户名 */ String name; /**账户余额 */ double money; public Account() { } } /** * 封装测试类 */ public class AccountTest { public static void main(String[] args) { //创建了一个对象 Account cang = new Account(); //给对象赋值 cang.name = "苍苍";//初始值 cang.money = 10000000.00;//初始值 //没有封装,可以任意修改值 cang.name = "随便";//没有封装,可以任意修改姓名,不安全 cang.money = -1000000.00;//没有封装,可以任意修改余额,不安全 } } |
4.2 封装的作用
封装是为了保护内部数据的安全:
1. 不希望在外部类中随意访问类中的成员变量
2. 达到权限要求的才能访问。
3. 只是获取数据的时候,例如 单例模式
4.3怎么封装
- 如何控制程序中的访问 ?
通过给类中的成员(字段,方法,构造方法)添加访问权限修饰符来实现封装(访问控制)
- 什么是访问权限:简单的认为访问权限就是不同级别的人能够干不同级别的事,不同级别的人能看到的页面是不同的
例子:比如做一个系统,不同人登录进去的访问权限不一样;
- 访问权限修饰符:
public 最大权限,被其修饰的成员,在任意目录下,都可以访问到 (所有类)
protected 在同包类和子类中都可以访问
默认不写 只能在同包类中访问
private 只能在当前类中访问
4.4封装的步骤
1. 私有化成员变量(用private修饰成员变量)
2. 为每一个成员变量提供合理的
getXxx()方法 获取成员变量的值,如果当前成员变量类型是boolean类型,将getXxx()改为 isXxx()
setXxx(...)方法 设置成员变量的值
3. 提供一个无参构造
4. 该类用public修饰
封装案例: /** * 账户类 */ public class Account {// 4. 该类用public修饰 /**账户名 1. 私有化成员变量(用private修饰成员变量) */ private String name; /**账户余额 1. 私有化成员变量(用private修饰成员变量) */ private double money; /**是否是VIP账户 1. 私有化成员变量(用private修饰成员变量) */ private boolean vip; /** * 2. 为每一个成员变量提供合理的 * getXxx()方法 获取成员变量的值,如果当前成员变量类型是boolean类型,将getXxx()改为 isXxx() * * setXxx(...)方法 设置成员变量的值 * @return */ public String getName(){ return name; } /** * 2. 为每一个成员变量提供合理的 * getXxx()方法 获取成员变量的值,如果当前成员变量类型是boolean类型,将getXxx()改为 isXxx() * * setXxx(...)方法 设置成员变量的值 */ public void setName(String n){ name = n;//将n赋值给成员变量name } public double getMoney(){ return money; } public void setMoney(double m){ //可以在方法中限制权限 money = m;//将m赋值给成员变量money } public boolean isVip(){ return vip; } public void setVip(boolean v){ vip = v;//将v赋值给成员变量vip } /** * 3. 提供一个无参构造 */ public Account() { } public Account(String n,double m,boolean v) { //给成员变量赋值 name = n; money = m; vip = v; } } |
4.5 封装的注意事项
1. 不是只有private才叫封装,private只是最大限度的封装而已。
2. get和set方法都是只能获取或者赋值一个成员变量
不能set(String n,double m,boolean v)赋值3个成员变量
3. 单一职能原则:功能最小化,不要想着一个方法写完所有的功能,因为代码复用率高
5.this(掌握两种使用语法)
5.1 this引入
案例: public class Student { private String name; public Student() { } public String getName() { return name; } public void setName(String name) {//name按照简明知意原则,应该将n改为name name = name; } } 测试类: public class StudentTest { public static void main(String[] args) { //调用有参构造,创建对象并且直接赋值 Student stu = new Student(); stu.setName("隔壁老王"); System.out.println(stu.getName());//null(发现赋值是失败的,取的是默认值null) } } |
这是为什么呢?请看内存分析图
怎么解决这个问题呢? 使用this
5.2 this介绍
- this的概念:this指代当前对象,即,哪个对象调用就指代哪个对象
- this理解 示意图:
- 测试this
public class Student { public void printThis() { System.out.println("this = " + this); } } 测试类: public class StudentTest { public static void main(String[] args) { /* * this表示的是当前对象,可看成this就是指代当前对象的地址; */ Student stu1 = new Student(); System.out.println("stu1=" + stu1); stu1.printThis();//this所在方法正在被stu1调用 则 this指代stu1的地址 //this指代当前对象,换了其他对象,this代表的就是其对象了 Student stu2 = new Student(); System.out.println("stu2=" + stu2); stu2.printThis();//this所在方法正在被stu2调用 则 this指代stu2的地址 } } 打印结果: stu1 = Student@15db9742 this = Student@15db9742 stu2 = Student@6d06d69c this = Student@6d06d69c |
5.3 this使用
- 解决局部变量和成员变量的二义性 ---> get set 方法以及有参构造
- 本类中构造方法之间的相互调用,但是必须是构造方法内的第一句
----------------------------------------------以下两种使用方式作为了解----------------------------------------------
- 作为返回值返回 : this持有对象地址,表示该类的一个对象即是一个数据
- 作为参数传递
5.4 this注意和小结
- this用途:
- 解决局部变量和成员变量的二义性(掌握) --> 注意 set/get方法 构造方法
- 在本类之间 ,构造方法之间的相互调用 this()调用无参数的构造方法,this(...)可以添加参数,表示调用有参数的构造方法 (掌握)
- this作为参数传递,this作为返回值 (了解)
- this注意事项:
- this不能在静态的方法中使用 : 无法从静态上下文中引用非静态成员this
- static类级别,this对象级别
static修饰的是属于类,被共享 。而this是某一个具体的对象地址