13private、封装、面向对象五子棋、this、分包、static【补充工具类,jar包导出,导出API、eclipse注释快捷键】、类加载机制

day13

一、private

含义:

私有化

private是访问修饰符的一种,访问修饰符规定了访问权限

作用:

​ 1. 修饰属性:私有化属性,不能让外界使用

  1. 修饰方法:私有化方法,不能让外界使用

应用场景:

不让让外界访问的属性和方法就用private修饰

案例

public class A {

private String str = "用良心做教育";

private void method01(){
	System.out.println("aaabbbccc -- " + str);
}

public void method02(){
	method01();
}

}
public class Test01 {
	public static void main(String[] args) {
	A a = new A();
	a.method02();
}
}

注意:

通过公有的方法调用类中私有的方法、属性

二、封装

理解:

不能直接操作属性,可以添加get/set方法

步骤:

1.私有化属性

2.添加get-获取/set-设置方法

好处:

外界不能直接操作属性(有风险),通过get/set方法操作属性,可以在方法内添加额外的功能

需求:

模拟银行用户操作余额的功能

分析:

操作余额(存钱、取钱、查看)

import java.time.LocalDateTime;

public class User {

String username;
String password;
String name;
String phone;
char sex;
private double surplus;//余额

public User() {
}

public User(String username, String password, String name, String phone, char sex, double surplus) {
	this.username = username;
	this.password = password;
	this.name = name;
	this.phone = phone;
	this.sex = sex;
	this.surplus = surplus;
}

//设置余额
public void setSurplus(double surplus){
	//额外的功能
	double num = (surplus - this.surplus);
	System.out.println(LocalDateTime.now() + " -- " + this.name + "用户操作了金额:" + ((num>0)?"+":"") + num);
	
	//设置属性
	this.surplus = surplus;
}

//获取余额
public double getSurplus(){
	//额外的功能
	System.out.println(LocalDateTime.now() + " -- " + this.name + "用户获取了金额");
	
	//返回余额
	return surplus;
}

}
public class Test01 {
	public static void main(String[] args) {
		

	User user = new User("1234567891", "123123", "奇男子", "17823466612", '男', 2000);
	
	//存钱
	//user.surplus = user.surplus+200;
	user.setSurplus(user.getSurplus() + 200);
	
	//取钱
	//user.surplus = user.surplus-1800;
	user.setSurplus(user.getSurplus() -1800);
	
	//查看
	//System.out.println(user.surplus);//400.0
	System.out.println(user.getSurplus());//400.0
}

}

思考题:操作属性有什么功能?

1.设置属性 – set

2.获取属性 – get

三、面向对象五子棋

见资源代码Gobang02

四、this - 本对象

概念:

表示本对象

理解:哪个对象调用该方法,该方法里的this就表示该对象

含义:

代表本对象,this出现方法里,表示调用该方法的对象

作用:

  1. this.属性:调用本对象的成员变量
  2. this.方法:调用本对象的成员方法
  3. this():调用本对象的构造方法(在一个构造方法中的第一句调用另外一个构造方法)

案例

import java.time.LocalDateTime;

public class User {

private String username;
private String password;
private String name;
private String phone;
private char sex;
private double surplus;//余额

public User() {
	//在当前构造方法中调用另一个构造方法
	this("默认账号", "默认密码", "亚当", "12345678901", '男', 0.0);
}

public User(String username, String name, String phone, char sex, double surplus) {
	//在当前构造方法中调用另一个构造方法
	this(username,"000000", name, phone, sex, surplus);
}

public User(String username, String password, String name, String phone, char sex, double surplus) {
	this.username = username;
	this.password = password;
	this.name = name;
	this.phone = phone;
	this.sex = sex;
	this.surplus = surplus;
}

//设置余额
public void setSurplus(double surplus){
	//额外的功能
	double num = (surplus - this.surplus);
	System.out.println(LocalDateTime.now() + " -- " + this.name + "用户操作了金额:" + ((num>0)?"+":"") + num);
	
	//设置属性
	this.surplus = surplus;
}

//获取余额
public double getSurplus(){
	//额外的功能
	System.out.println(LocalDateTime.now() + " -- " + this.name + "用户获取了金额");
	
	//返回余额
	return surplus;
}

public String getUsername() {
	return username;
}

public void setUsername(String username) {
	this.username = username;
}

public String getPassword() {
	return password;
}

public void setPassword(String password) {
	this.password = password;
}

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

public String getPhone() {
	return phone;
}

public void setPhone(String phone) {
	this.phone = phone;
}

public char getSex() {
	return sex;
}

public void setSex(char sex) {
	this.sex = sex;
}

/**

 * 转账

 * @param username 对方的账号

 * @param money 转账的金额
   */
   public void transferAccounts(String username,double money){

   //获取本对象的余额,判断是否比转账的金额更多
   if(this.getSurplus() > money){
   	
   	//将当前用户的余额的money部分转给对方账号
   	//this.setSurplus(this.getSurplus()-money);
   	setSurplus(getSurplus()-money);
   	System.out.println("已经给" + username + "转账成功");
   	
   }else{
   	System.out.println("余额不足");
   }
   }

}

经验

私有化属性:eclipse工具栏 ------->Source------->Select getters and setters to create—>勾选需要生成属性的get和set方法;

Source中还有一些自动生成,如构造方法等等;

五、分包

基本作用:防止了类的重名问题

项目作用:项目中有众多的类,把相同功能的类放在同一个包中,方便管理

工具类:com.dream.util/tool

实体类:com.dream.vo/bean/entity/bto/pojo

数据库类:com.dream.dao/mapper

六、static

含义:

静态的

关键字

作用:

1.修饰属性
概念区分:

1.成员属性:每个对象独享一份

	String str1;

2.静态属性:每个对象共享一份

	static String str2;

3.静态属性何时创建?

​ 使用到类,JVM会判断方法区中是否有该类的class文件,如果没有,就把该类的class文件加载到方法区

​ JVM会扫描该类的所有属性,并把属性添加到静态区中(1.开辟空间 2.赋系统的默认值)

4.静态属性何时销毁?

​ 项目结束时,静态属性才会被销毁,所以静态属性的生命周期很长,项目中使用时需警慎

5.静态属性的应用场景?

​ 该类所有的对象需要共享的属性,就可以设置为静态

静态属性内存图

由于静态属性存在静态区,其属性不允许重复,不同调用赋值会覆盖掉
静态属性内存图

小结

​ 类加载到方法区时,JVM会扫描该类的所有属性
​ 并把静态属性加载到静态区中,静态属性属于类属性,
​ 该类所有的对象都共享该属性
​ 静态属性直到项目结束时才会被回收

​ 注意:静态属性使用类名调用

A.str2 = "xxx";
//注意:静态属性属于类的属性,直接使用类名调用。使用对象调用会出现警告,但可以运行
//a1.str2 = "xxx";

成员属性对象调用

a1.str1 = "aaa";
2.修饰方法
概念区分

静态方法属于类方法,直接用类名调用

成员方法 vs 静态方法 应用场景

成员方法:必须使用对象调用,也就是说调用成员方法之前必须创建对象(开辟空间)

静态方法:属于类的方法,直接使用类名调用,纯功能的方法就可以设计成静态方法(工具类),比如MyArrays

应用场景:工具类
jar包导入并添加路径,jar包导出,导出API

(1)Java项目打成jar包:选中项目(也可以先点Export再选项目,多个项目导出)---->eclipse的工具的File或右键---->Export------>java–JAR file---->保存路径

【Web项目同理WAR file】

(2)Java项目导入jar包:先选中项目新建一个文件夹(Folder)命名如lib----->将jar所需扔到lib---->再选中改jar右键Build Path选add to Build Path---->就会多出一个第三方jar包文件夹(原来有一个自带的)

导入jar到该项目就可以使用里面的工具类

(3)Java项目导出API:选中项目---->eclipse的工具的File或右键---->Export------>java–Javadoc---->Java comand添加工具路径【ps:C:\Program Files\Java\jdk1.8.0_144\bin\javadoc.exe】---->Destination选保存路径【生成的是一个个的html网页,所以需要选中文件夹,或者在路径后面加一个文件名ps:UtilsAPI,反正没有收纳很乱】

查看API就点击index.html首页进入查看【文档注释才可以显示,注意文档注释和多行注释】

eclipse注释快捷键

单行注释:Ctrl + /【 添加/消除//注释 】

多行注释: Ctrl+Shift+/ 【 添加/**/注释 】Ctrl+Shift+\【取消/* */注释】

文档注释: ALT + SHIFT +J 或者多行注释再加个*号

在类上面(直接按ALT + SHIFT +J )

/**
 * @author 奇男子
 *
 */

方法上面的(鼠标焦点放在方法里,然后 ALT + SHIFT +J )

/**

  • 删除学生
  • @param classId 目标班级号
  • @param id 目标学号
  • @return 删除状态码
    */
    public int delete(String classId,String id);
需求:

模仿Java的MyArrays,编写自己的MyMyArrays

目的:

1.掌握工具类的概念

2.回顾之前的知识点

3.理解文档注释的作用

代码见Utils

3.静态代码块
概念区分

静态代码块是类加载到方法区时才会被调用,该代码块只能初始化静态变量

代码块是创建对象时优先于构造方法调用,该代码块可以初始化成员变量和静态变量

构造方法是创建对象时调用,该方法可以初始化成员变量和静态变量

成员变量 vs 静态变量

成员变量:属于对象的变量,每个对象独享一份

静态变量:属于类的变量,每个对象都共享一份

public class A {

String str1;//成员属性
static String str2;//静态属性

//静态代码块:class文件加载到方法区时调用
//作用:操作静态属性,不能操作成员属性
static{
	A.str2 = "eee";//底层实现:A.str2 = "eee";
	System.out.println("静态代码块 --" + A.str2);
}

//代码块:创建对象时优先于构造方法调用
//作用:操作成员属性和静态属性
{
	str1 = "ccc";//底层实现:this.str1 = "ccc";
	str2 = "ddd";//底层实现:A.str2 = "ddd";
	System.out.println("代码块-- " + str1 + " -- " + str2);
}

//构造方法:创建对象时调用构造方法
//作用:操作成员属性和静态属性
public A() {
	str1 = "aaa";//底层实现:this.str1 = "aaa";
	str2 = "bbb";//底层实现:A.str2 = "bbb";
	System.out.println("构造方法 -- " + str1 + " -- " + str2);
}
}
经验:

1.创建对象时,在构造方法中初始化数据

2.项目中可以在静态代码块中初始化静态属性

七、类加载机制

使用某个类时,如果该类的class文件没有加载到内存时,则系统会通过以下三个步骤来对该类进行初始化
1.类的加载(Load) → 2.类的连接(Link) → 3.类的初始化(Initialize)

  • 类的加载(Load):将类的class文件读入内存,并为之创建一个java.lang.Class的对象,此过程由类加载器(ClassLoader )完成
  • 类的连接(Link):将类中的数据加载到各个内存区域中
  • 类的初始化(Initialize):JVM负责对类进行初始化

类加载机制内存图

加载过程
类加载机制内存图

面试题

1.面试题1输出结果
public class A {
		static A a = new A();
		static int value1;
		static int value2 = 0;
		
		public A() {
			value1++;
			value2++;
		}

}
public class Test01 {
	public static void main(String[] args) {
	System.out.println(A.value1);//1
	System.out.println(A.value2);//0
}
}

准备阶段1:JVM给静态属性在静态区中开辟空间
//A a;
//int value1;
//int value2;

准备阶段2:JVM给静态属性赋系统默认值
//A a = null;
//int value1 = 0;
//int value2 = 0;

初始化阶段:java程序代码才开始真正执行
//A a = new A();
//int value1 = 1;
//int value2 = 0;

new对象调用无参构造方法value1和value2都得1,然后执行赋值语句value1不变,value2赋值为0

2.面试题2输出结果
public class A {
		static int value1;
		static int value2 = 0;
		static A a = new A();
		
		public A() {
			value1++;
			value2++;
		}

}
public class Test01 {
	public static void main(String[] args) {
	System.out.println(A.value1);//1
	System.out.println(A.value2);//1
}
}

准备阶段1:JVM给静态属性在静态区中开辟空间
//int value1;
//int value2;
//A a;

准备阶段2:JVM给静态属性赋系统默认值
//int value1 = 0;
//int value2 = 0;//0是系统赋的默认值
//A a = null;

初始化阶段:java程序代码才开始真正执行
//int value1 = 1;
//int value2 = 1;
//A a = new A();

先执行赋值语句value1不改变系统默认赋值的0,value2被语句赋值为0;再new对象调用无参构造方法value1和value2都得1

深入类加载机制

见资源的深入类加载机制.md

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值