Day09

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);
    	}
    

练习

利用面向对象的思想描述下面的场景 
小明把大象装进冰箱
  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值