Day09
一、构造方法/构造器
含义:与类名相同,且没有返回项的方法
作用:
1.和new关键字一起表示创建对象
2.初始化数据注意:
1.如果写了有参构造,系统不会默认实现无参构造
2.构造方法可以重载经验:写了有参构造,自己把无参构造写上
public class Person { //属性 String name; char sex; int age; //构造方法 -- 无参构造 public Person(){ System.out.println("Person的无参构造"); this.name = "彭于晏"; this.sex = '男'; this.age = 43; } //构造方法 -- 有参构造 public Person(String name,char sex,int age){ this.name = name; this.sex = sex; this.age = age; } //成员方法 public void eat(){ System.out.println(this.name + "吃饭饭"); } public void sleep(){ System.out.println(this.name + "睡觉觉"); } //静态方法 public static void method(){ System.out.println("静态方法"); }
public static void main(String[] args) { // Person p = new Person(); // p.name = "小康"; // p.sex = '男'; // p.age = 23; Person p = new Person("小康", '男', 23); System.out.println(p.name); System.out.println(p.sex); System.out.println(p.age); p.eat(); p.sleep(); }
二、this
知识点:this
含义:this表示调用该方法的对象作用:
1.this.属性:调用本对象的成员属性
2.this.方法:调用本对象的成员方法
3.this():在构造方法的第一句调用另外一个构造方法public class Person { //属性 String name; char sex; int age; //构造方法 -- 无参构造 public Person(){ //this():在构造方法的第一句调用另外一个构造方法 this("彭于晏", '男', 46); System.out.println("Person的无参构造"); } //构造方法 -- 有参构造 public Person(String name){ this(name, '男', 46); } public Person(String name,char sex,int age){ this.name = name; this.sex = sex; this.age = age; } //成员方法 public void eat(){ //this.属性:调用本对象的成员属性 System.out.println(this.name + "吃饭饭"); } public void sleep(){ //this.属性:调用本对象的成员属性 System.out.println(this.name + "睡觉觉"); } public void writerCode(){ //this.属性:调用本对象的成员属性 System.out.println(this.name + "写代码"); } public void study(){ //this.方法:调用本对象的成员方法 this.eat(); this.writerCode(); this.sleep(); } //静态方法 public static void method(){ System.out.println("静态方法"); }
三、private
知识点:private
理解:private是访问修饰符的一种,表示私有
扩展:访问修饰符可以修饰属性和方法作用:
1.修饰属性:该属性不能在类的外面使用
2.修饰方法:该方法不能在类的外面使用应用场景:
1.不想让外界直接调用的属性就使用private修饰
2.不想让外界直接调用的方法就使用private修饰public class A { private String attr = "A类的私有化属性"; private void method01(){ System.out.println(this.attr); System.out.println("A类的私有化方法"); } public void method02(){ method01(); }
四、封装
知识点:封装
概念:将属性封装到对象的内部,通过get/set方法去操作属性
步骤:
1.私有化属性
2.添加get(获取)/set(设置)方法
好处:
将属性封装到对象的内部,外界不能直接操作属性
必须通过get/set方法去操作属性
可以在get/set方法中做额外的功能经验:属性都必须封装
需求:模拟银行用户操作金额的过程
分析:怎么操作金额?
1.设置金额
2.获取金额经验:操作属性 --> 设置和获取
public class User { private String username; private String password; private double money; public User() { } public User(String username, String password, double money) { this.username = username; this.password = password; this.money = money; } 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 void setMoney(double money){ //额外的功能 double num = money - this.money; System.out.println(LocalDateTime.now() + "设置了金额:" + num); this.money = money; } public double getMoney(){ return this.money; }
五、面向对象版本五子棋
public class Gobang { //棋盘长度 private int length = 20; //棋盘容器 private String[][] gobang = new String[length][length]; //棋盘坐标 private String[] nums = {"⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","⒑","⒒","⒓","⒔","⒕","⒖","⒗","⒘","⒙","⒚","⒛"}; //棋盘符号 private String add = "┼"; private String black = "●"; private String white = "○"; public Gobang() { this.init(); this.printGobang(); } //初始化棋盘 private void init(){ for (int i = 0; i < gobang.length; i++) { for (int j = 0; j < gobang[i].length; j++) { if(j == length-1){//每行的一列,设置行数 gobang[i][j] = nums[i]; }else if(i == length-1){//最后一行,设置列数 gobang[i][j] = nums[j]; }else{ gobang[i][j] = add; } } } } //打印棋盘 public void printGobang(){ for (String[] strings : gobang) { for (String str : strings) { System.out.print(str); } System.out.println(); } } //判断坐标是否在棋盘内 public boolean isIndexOutOfGobang(int x,int y){ if(x<0 || x>length-2 || y<0 || y>length-2){ return false; } return true; } //判断坐标上是否有棋子 public boolean isPiece(int x,int y){ if(!gobang[x][y].equals(add)){ return false; } return true; } //落子 public int play(int x,int y,boolean flag){ if(!isIndexOutOfGobang(x, y)){ return -1; } if(!isPiece(x, y)){ return -2; } String piece = (flag)?black:white; gobang[x][y] = piece; return 1; } //判断输赢 public boolean leftAndRight(int x,int y,boolean flag){ String[][] gobang = this.gobang; int length = this.length; String piece = (flag)?black:white; int count = 1; int tempX = x; int tempY = y; //计算左边连续棋子 while(tempY > 0){ tempY--; if(gobang[tempX][tempY].equals(piece)){ count++; }else{ break; } } tempY = y; //计算右边连续棋子 while(tempY < length-2){ tempY++; if(gobang[tempX][tempY].equals(piece)){ count++; }else{ break; } } if(count >= 5){ return true; } return false; } public boolean upAndDown(int x,int y,boolean flag){ String[][] gobang = this.gobang; int length = this.length; String piece = (flag)?black:white; int tempX = x; int tempY = y; int count = 1; //计算上边连续棋子 while(tempX > 0){ tempX--; if(gobang[tempX][tempY].equals(piece)){ count++; }else{ break; } } tempX = x; //计算下边连续棋子 while(tempX < length-2){ tempX++; if(gobang[tempX][tempY].equals(piece)){ count++; }else{ break; } } if(count >= 5){ return true; } return false; } public boolean leftDiagonal(int x,int y,boolean flag){ String[][] gobang = this.gobang; int length = this.length; String piece = (flag)?black:white; int count = 1; int tempX = x; int tempY = y; //计算左上边连续棋子 while(tempX > 0 && tempY>0){ tempX--; tempY--; if(gobang[tempX][tempY].equals(piece)){ count++; }else{ break; } } tempX = x; tempY = y; //计算下边连续棋子 while(tempX < length-2 && tempY < length-2){ tempX++; tempY++; if(gobang[tempX][tempY].equals(piece)){ count++; }else{ break; } } if(count >= 5){ return true; } return false; } public boolean rightDiagonal(int x,int y,boolean flag){ String[][] gobang = this.gobang; int length = this.length; String piece = (flag)?black:white; int count = 1; int tempX = x; int tempY = y; //计算右上边连续棋子 while(tempX > 0 && tempY < length-2){ tempX--; tempY++; if(gobang[tempX][tempY].equals(piece)){ count++; }else{ break; } } tempX = x; tempY = y; //计算下边连续棋子 while(tempX < length-2 && tempY > 0){ tempX++; tempY--; if(gobang[tempX][tempY].equals(piece)){ count++; }else{ break; } } if(count >= 5){ return true; } return false; } }
package com.qf.test; import java.util.Scanner; public class Test { /** * 知识点:面向对象版五子棋 */ public static void main(String[] args) { Gobang gobang = new Gobang(); Scanner scan = new Scanner(System.in); boolean flag = true;//true-黑子 false-白子 while(true){ //输入坐标 System.out.println("请" + ((flag)?"黑":"白") + "子输入坐标:"); int x = scan.nextInt() - 1;//-1是因为用户看到的界面是坐标(从1开始),数组是下标(从0开始) int y = scan.nextInt() - 1;//-1是因为用户看到的界面是坐标(从1开始),数组是下标(从0开始) //落子 int play = gobang.play(x, y, flag); if(play == -1){ System.out.println("坐标错误 - 坐标超出棋盘范围,请重新输入"); continue; }else if(play == -2){ System.out.println("坐标错误 - 坐标上已有棋子,请重新输入"); continue; } //打印棋盘 gobang.printGobang(); //判断输赢 boolean leftAndRight = gobang.leftAndRight(x, y, flag); boolean upAndDown = gobang.upAndDown(x, y, flag); boolean leftDiagonal = gobang.leftDiagonal(x, y, flag); boolean rightDiagonal = gobang.rightDiagonal(x, y, flag); if(leftAndRight||upAndDown||leftDiagonal||rightDiagonal){ System.out.println(((flag)?"黑":"白") + "子赢"); break; } //置反 flag = !flag; } } }
六、分包
知识点:分包
- 理解:最基本的功能就是防止类的重名
- 项目中的功能:做类的分类(一个项目有成千上万的类,需要分包做管理)
com.qf.utils/tools -- 工具类的包
com.qf.pojo/entity/vo -- 实体类的包
com.qf.map/mapper -- 操作数据库类的包
com.qf.biz/service -- 操作业务类的包
- 命名规范:网络倒序
com/net/cn.公司名.项目名/功能名
七、static
知识点:static
理解:静态的
作用:
1.静态属性
2.静态方法
3.静态代码块
知识点:static修饰属性
应用场景:该类每个对象共享的属性就用static修饰public static void main(String[] args) { Person p1 = new Person(); Person p2 = new Person(); p1.setName("小康"); p2.setName("波多野结衣"); System.out.println(p1.getName());//小康 System.out.println(p2.getName());//波多野结衣 // p1.star = "地球"; // p2.star = "火星"; // System.out.println(p1.star); // System.out.println(p2.star); // 会输出两个火星 //注意:静态属性属于每个对象共享的属性,直接使用类名调用 Person.star = "地球"; System.out.println(Person.star); } ```![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/807c8f16973942cf9a5f2768d04adcfa.png#pic_center)
编写一个类的步骤:
- 1.属性
- 2.私有化属性
- 3.构造方法 - 无参构造、有参构造
- 4.get/set的
- 5.独有的方法 – eat()、sleep()…
类加载的步骤:
1.将calss文件加载到方法区2.JVM扫描class文件–字面值常量加载到常量池
3.JVM扫描class文件–静态属性加载到静态区,赋系统默认值,赋代码初始值
小结:
1.成员变量–每个对象独享一份
2.静态变量–每个对象共享一份
static静态变量的生命周期
1.创建:类加载到方法区时
2.销毁:项目结束时
static修饰方法:
静态方法可以在不创建类实例的情况下调用。
应用场景:工具类(该类中的方法都是静态的)public class MyArrays { public static void sort(int[] arr){ for(int i=0;i<arr.length-1;i++){ for(int j=0;j<arr.length-1-i;j++) if(arr[j]>arr[j+1]){ int temp = arr[j]; arr[j] = arr[j+i]; arr[j+i] = temp; } } } public static int binarySearch(int[] arr,int key){ int start=0; int end = arr.length-1; while(start<=end){ int mid = (start+end)/2; if(key<arr[mid]){ end = mid-1; }else if(key > arr[mid]){ start = mid+1; }else{ return mid; } } return -start-1; } public static int[] copyOf(int[] arr,int newLength){ int copyLen = arr.length; if(copyLen>newLength){ copyLen = newLength; } int[] newArr = new int[newLength]; for(int i=0;i<copyLen;i++){ newArr[i] = arr[i]; } return newArr; } public static int[] copyOfRange(int[] arr,int start,int end){ int length = end-start; int[] newArr = new int[length]; int index=0; for(int i=start;i<end;i++){ newArr[index++]=arr[i]; } return newArr; } public static void fill(int[] arr,int start,int end,int key){ for(int i=start;i<end;i++){ arr[i] = key; } } public static void fill(int[] arr,int key){ fill(arr,0,arr.length,key); } public static String toString(int[] arr){ String str = "["; for (int element:arr){ if(str.length()!=1){ str+=","; } str+=element; } str +="]"; return str; } }
八、导出、导入jar包
jar包:只能使用,无法查看代码
导出:创建项目,创建包,把工具类放进去,把包按照jar包的形式导出。
导入:选择项目创建文件夹lib,拷贝jar包进去,添加路径,就能使用了。
九、导出API
选中包导出,以Javadoc形式导出到一个创建的文件夹内,找到index_html,点开就能看到文档的注释(注意多行注释不能显示)。
十、静态代码块
知识点:静态代码块
经验:
初始化成员属性一般在构造方法中进行
初始化静态属性一般在静态代码块中进行
public class A { //成员属性 String str1; //静态属性 static String str2; //静态代码块:类加载到方法区时调用,可以初始化静态属性 static{ str2 = "ccc";//A.str2 = "bbb"; System.out.println("A类的静态代码块:" + str2); } //代码块:创建对象时优先于构造方法调用,可以初始化成员属性和静态属性 { str1 = "bbb";//this.str1 = "bbb"; str2 = "bbb";//A.str2 = "bbb"; System.out.println("A类的代码块:" + str1 + " -- " + str2); } //构造方法:创建对象时调用,可以初始化成员属性和静态属性 public A() { str1 = "aaa";//this.str1 = "aaa"; str2 = "aaa";//A.str2 = "aaa"; System.out.println("A类的构造方法:" + str1 + " -- " + str2); }
练习
利用面向对象的思想描述下面的场景 小明把大象装进冰箱