day13
一、private
含义:
私有化
private是访问修饰符的一种,访问修饰符规定了访问权限
作用:
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出现方法里,表示调用该方法的对象
作用:
- this.属性:调用本对象的成员变量
- this.方法:调用本对象的成员方法
- 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