A010_匿名对象_包_封装_this


面向对象:封装

1.内容介绍

1. 匿名对象&对象生命周期(了解)
2. 包(package)(理解)
3. 封装的概念(了解)
4. 封装语法(重点掌握封装步骤)
5. this关键字的运用(简单,理解)(重点)

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个文件) 没有包不好管理
② 可以避免类名冲突的问题
一个项目中有可能多个类名一样

示例:生活中例子,有很多资源 片,怎么管理这些片?文件夹
大片儿
国产
欧美
—爱情
—动作
—爱情动作
日本
—爱情
—动作
—爱情动作
—爱情野兽派

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为什么要封装?
现实生活中封装概念的引入

1.大家想一想生活中封装是什么?
a. 例如 网购一个娃娃(充气的) : 亲,请帮我打包严实一点,注意保密啊!
包装是网络保护隐私、安全
b. 台式机电脑:机箱[ 主板 显卡 内存 电源 硬盘…]
机箱是保护里面硬件的安全

以上示例的共同点总结:
都是通过物理层面封装的操作,达到从控制访问的目的

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.如何控制程序中的访问 ?
通过给类中的成员(字段,方法,构造方法)添加访问权限修饰符来实现封装(访问控制)

2.什么是访问权限:简单的认为访问权限就是不同级别的人能够干不同级别的事,不同级别的人能看到的页面是不同的
例子:比如做一个系统,不同人登录进去的访问权限不一样;

3.访问权限修饰符:

	public		最大权限,被其修饰的成员,在任意目录下,都可以访问到 (所有类)
	protected	在同包类和子类中都可以访问
	默认不写		只能在同包类中访问
	private		只能在当前类中访问
4.4 封装的步骤(重点)
  1. 该类用public修饰
  2. 私有化成员变量(用private修饰成员变量)
  3. 提供一个无参构造
  4. 为每一个成员变量提供合理的
    getXxx()方法 获取成员变量的值,如果当前成员变量类型是boolean类型,将getXxx()改为 isXxx()
    setXxx(…)方法 设置成员变量的值
封装案例:
/**	
*  账户类	
*/
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理解 示意图:
在这里插入图片描述
3.测试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 方法以及有参构造
在这里插入图片描述
在这里插入图片描述

2.本类中构造方法之间的相互调用,但是必须是构造方法内的第一句
在这里插入图片描述
----------------------------------------------以下两种使用方式作为了解----------------------------------------------
3.作为返回值返回 : this持有对象地址,表示该类的一个对象即是一个数据
在这里插入图片描述
4.作为参数传递
在这里插入图片描述

5.4 this注意和小结

1.this用途:

  • 1 解决局部变量和成员变量的二义性(掌握) --> 注意 set/get方法 构造方法
  • 2 在本类之间 ,构造方法之间的相互调用 this()调用无参数的构造方法,this(…)可以添加参数,表示调用有参数的构造方法 (掌握)
  • 3 this作为参数传递,this作为返回值 (了解)

2.this注意事项:

  • 1.this不能在静态的方法中使用 : 无法从静态上下文中引用非静态成员this
  • 2.static类级别,this对象级别
    static修饰的是属于类,被共享 。而this是某一个具体的对象地址

6.课程总结

6.1重点
封装、this
6.2难点
this

7. 作业

  1. 课堂的代码 都敲2~3遍(static、this)
  2. 定义一个Model类,里面有姓名、性别、年龄、胸围、腰围 字段,请使用标准封装+this进行测试;
    建议:写上this(…)的使用
  3. 练习:
    Java的API中有如下设计好的类:
    String,请练习以下几个方法:
    构造方法:String(String str) 创建一个包含指定的str数据的String对象
    普通方法:
    1.char charAt(int index) 返回 index索引处的char字符。 下标[0,length()-1]
    2.boolean endsWith(String suffix) 判断当前字符串是否以指定的后缀suffix结尾。
    3.boolean startsWith(String prefix) 判断当前字符串是否以指定的前缀prefix开头。
    4.boolean isEmpty() 当 length()为 0时,返回 true 。
    5.int length() 返回此字符串的长度
    6.String toUpperCase() 将此字符转换为全大写
    7.String toLowerCase()将此字符转换为全小写
    8.String substring(int beginIndex, int endIndex) 从当前字符串中beginIndex和endIndex之间截取子串(含头不含尾)

8. 面试题

9. 扩展知识或课外阅读推荐

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值