Day09面向对象:封装

​​​

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 什么是匿名对象

概念:

  1. 匿名对象,就是创建了一个对象而没有使用变量接收
  2. 但是匿名对象本质也是一个对象(具体的值)
  1. int i = 10;//int数据类型    i变量     值,具体的一个数据
  2. 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) {//Stringjava.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为什么要封装? 

现实生活中封装概念的引入

  1. 大家想一想生活中封装是什么? 
  1. 例如  网购一个娃娃(充气的)  : 亲,请帮我打包严实一点,注意保密啊!

包装是网络保护隐私、安全

  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怎么封装

  1. 如何控制程序中的访问 ?

通过给类中的成员(字段,方法,构造方法)添加访问权限修饰符来实现封装(访问控制)

  1. 什么是访问权限:简单的认为访问权限就是不同级别的人能够干不同级别的事,不同级别的人能看到的页面是不同的

例子:比如做一个系统,不同人登录进去的访问权限不一样;

  1. 访问权限修饰符: 

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介绍

  1. this的概念:this指代当前对象,即,哪个对象调用就指代哪个对象
  2. this理解 示意图:

  1. 测试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使用

  1. 解决局部变量和成员变量的二义性   --->  get  set 方法以及有参构造

  

  1. 本类中构造方法之间的相互调用,但是必须是构造方法内的第一句     

----------------------------------------------以下两种使用方式作为了解----------------------------------------------

  1. 作为返回值返回  : this持有对象地址,表示该类的一个对象即是一个数据

  1. 作为参数传递  

 

5.4 this注意和小结

  1. this用途:
  1. 解决局部变量和成员变量的二义性(掌握) --> 注意 set/get方法  构造方法
  2. 在本类之间 ,构造方法之间的相互调用 this()调用无参数的构造方法,this(...)可以添加参数,表示调用有参数的构造方法 (掌握)
  3. this作为参数传递,this作为返回值 (了解)
  1. this注意事项:
  1. this不能在静态的方法中使用 : 无法从静态上下文中引用非静态成员this
  2. static类级别,this对象级别

static修饰的是属于类,被共享 。而this是某一个具体的对象地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值