栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java面向对象--------09

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java面向对象--------09

一、构造方法 1.1含义

与类名相同且没有返回项的方法,叫做构造方法 

1.2注意

1.没有参数的构造方法简称无参构造
2.该类中没有有参构造的情况下,无参构造会被系统默认实现(经验:写了有参构造,就把无参构造给手动写上) 

1.3作用

1.和new关键字在一起是创建对象的含义(会在堆内存中开辟空间)
2.初始化数据 

package com.qf.test01;

public class Test01 {

	public static void main(String[] args) {
		
		Person p = new Person();
		
		p.name = "张三";
		p.sex = '男';
		p.age = 18;
		
		System.out.println(p.name);
		System.out.println(p.sex);
		System.out.println(p.age);
	
		p.eat();
	}
}
package com.qf.test01;

public class Person {

	String name;
	char sex;
	int age;
	
	public Person(){
	}
	
	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 + "睡觉觉");
	}
}
1.31有参数构造方法
package com.qf.test01;

public class Test02 {

	public static void main(String[] args) {
		
		
		Person p = new Person("罗菌鱼", '男', 18);
		
		System.out.println(p.name);
		System.out.println(p.sex);
		System.out.println(p.age);
	
		p.eat();
	}
}
 1.4private关键字
package com.qf.test02;

public class A {

	private String str = "A类的成员变量";
	
	private void method01(){
		System.out.println("A类的成员方法 - method01");
	}
	
	public void method02(){
		System.out.println(this.str);
		this.method01();
	}
}
package com.qf.test02;

public class Test01 {

	public static void main(String[] args) {
		
		
		A a = new A();
		
		a.method02();
	}
}
1.5方法版五子棋
package com.qf.test01;

//五子棋类
public class GoBang {

	//棋盘长度
	int len = 20;
	//棋盘容器
	String[][] goBang = new String[len][len];
	//棋盘符号
	String add = "╋";
	String[] nums = {"⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","⒑","⒒","⒓","⒔","⒕","⒖","⒗","⒘","⒙","⒚","⒛"};
	String black = "■";
	String white = "○";

	//在构造方法中初始化棋盘数据和打印棋盘
	public GoBang() {
		//初始化数据
		init();

		//打印棋盘
		print();
	}

	//初始化棋盘数据
	private void init(){
		for (int i = 0; i < goBang.length; i++) {
			for (int j = 0; j < goBang[i].length; j++) {
				if(j == len-1){//每行的最后一列
					goBang[i][j] = nums[i];
				}else if(i == len-1){//最后一行
					goBang[i][j] = nums[j];
				}else{
					goBang[i][j] = add;
				}
			}
		}
	}

	//打印棋盘
	public void print(){
		for (String[] ss : goBang) {
			for (String str : ss) {
				System.out.print(str);
			}
			System.out.println();
		}
	}

	//判断坐标是否在棋盘范围内
	private boolean isIndexOutOfGoBang(int x, int y){
		if(x < 0 || x > len-2 || y < 0 || y > len-2){
			return false;
		}
		return true;
	}

	//判断坐标上是否有棋子
	private boolean isGoBang(int x, int y){
		if(!goBang[x][y].equals(add)){
			return false;
		}
		return true;
	}

	
	public int play(int x, int y,boolean bool){

		//判断坐标是否在棋盘范围内
		if(!isIndexOutOfGoBang(x, y)){
			return -1;
		}

		//判断坐标上是否有棋子
		if(!isGoBang(x, y)){
			return -2;
		}

		//落子
		goBang[x][y] = (bool)?black:white;
		return 1;
	}
}
package com.qf.test01;

import java.util.Scanner;

public class Test01 {

	public static void main(String[] args) {
		
		
		GoBang gb = new GoBang();

		Scanner scan = new Scanner(System.in);

		boolean bool = true;//true-黑子 false-白子

		while(true){

			//输入坐标
			System.out.println("请" + ((bool)?"黑":"白") + "子输入坐标:");
			int x = scan.nextInt()-1;
			int y = scan.nextInt()-1;

			//落子
			int play = gb.play(x, y, bool);
			
			if(play == -1){
				System.out.println("落子失败 - 坐标在棋盘范围外,请重新输入...");
				continue;
			}else if(play == -2){
				System.out.println("落子失败 - 坐标上有棋子,请重新输入...");
				continue;
			}

			//置反
			bool = !bool;

			//打印棋盘
			gb.print();
		}

	}
}
1.6构造方法内存图

二、无返回项构造方法   2.1含义

与类名相同且没有返回项的方法,叫做构造方法 

2.2注意 

1.没有参数的构造方法简称无参构造
2.该类中没有有参构造的情况下,无参构造会被系统默认实现(经验:写了有参构造,就把无参构造给手动写上)

2.3作用 

1.和new关键字在一起是创建对象的含义(会在堆内存中开辟空间)

2.初始化数据 

package com.qf.test01;

public class Person {

	String name;
	char sex;
	int age;
	
	static String str = "aaa";
	
	
	public Person(){
	}
	
	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 + "睡觉觉");
	}
}
package com.qf.test01;

public class Test01 {

	public static void main(String[] args) {
		
		Person p = new Person();
		
		p.name = "张三";
		p.sex = '男';
		p.age = 18;
		
		System.out.println(p.name);
		System.out.println(p.sex);
		System.out.println(p.age);
	
		p.eat();
	}
}
 2.31有参构造
package com.qf.test01;

public class Test02 {

	public static void main(String[] args) {
		Person p = new Person("罗菌鱼", '男', 18);
		
		System.out.println(p.name);
		System.out.println(p.sex);
		System.out.println(p.age);
	
		p.eat();
	}
}
2.4private关键字
package com.qf.test02;

public class A {

	private String str = "A类的成员变量";
	
	private void method01(){
		System.out.println("A类的成员方法 - method01");
	}
	
	public void method02(){
		System.out.println(this.str);
		this.method01();
	}
}
package com.qf.test02;

public class A {

	private String str = "A类的成员变量";
	
	private void method01(){
		System.out.println("A类的成员方法 - method01");
	}
	
	public void method02(){
		System.out.println(this.str);
		this.method01();
	}
}
 三、封装 3.1含义 

对成员变量的一种保护措施 

3.2步骤

1.私有化属性(目的:让外界不能调用)
2.添加set(设置-传参)/get(获取-返回属性)方法 

3.3好处 

外界不能随便调用成员变量,必须通过get/set方法,我们可以在set/get方法中去编写额外的功能
总结:所有的属性都要封装 

3.4需求 

需求:模拟银行用户的操作金额的过程

分析:
       银行有个用户类 -- User
       实际操作的是User类的对象 

package com.qf.test03;

import java.time.LocalDateTime;

//用户类
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){
		this.money = money;
		
		//LocalDateTime.now() -- 获取当前系统的时间
		System.out.println(this.username + " -- " + LocalDateTime.now() + "设置了money属性:" + this.money);
	}
	
	public double getMoney(){
		
		//LocalDateTime.now() -- 获取当前系统的时间
		System.out.println(this.username + " -- " + LocalDateTime.now() + "查看了money属性:" + this.money);
		
		return money;
	}
	
	
}
package com.qf.test03;

public class Test01 {

	public static void main(String[] args) {

		User user = new User("1445584980", "123123", 10000);
		
		//1.获取user对象中money属性->1000
		//2.10000减1800->8200
		//3.将8200设置给user对象中的money属性
		//user.money = user.money-1800;
		//获取user对象的money属性
		//System.out.println(user.money);//8200
		
		//1.获取user对象中money属性->1000
		//2.10000减1800->8200
		//3.将8200设置给user对象中的money属性
		user.setMoney(user.getMoney()-1800);
		
		//获取user对象的money属性
		System.out.println(user.getMoney());//8200
	}
}
四、this关键字 4.1含义 

方法中的this表示调用该方法的对象 

4.2作用 

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

package com.qf.test04;

public class Person {
	
	private String name;
	private char sex;
	private int age;
	
	public Person() {
		//调用有参构造
		this("亚当", '男', 0);
	}

	public Person(String name, char sex, int age) {
		this.name = name;
		this.sex = sex;
		this.age = age;
	}

	public String getName() {
		return name;
	}

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

	public char getSex() {
		return sex;
	}

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

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	public void eat(){
		System.out.println(this.name + "吃饭饭");
	}
	
	public void sleep(){
		System.out.println(this.name + "睡觉觉");
	}
	
	public void writeCode(){
		System.out.println(this.name + "写代码");
	}

	//休息的方法
	public void rest(){
		//利用this调用成员方法
		this.eat();
		this.writeCode();
		this.sleep();
	}
}
package com.qf.test04;

public class Test01 {

	public static void main(String[] args) {
		
		
		Person p = new Person();
		
		p.rest();
	}
}
五、static修饰属性 5.1属于类的变量 

 类加载到方法区时,JVM会扫描该类的所有属性
     并把静态属性加载到静态区中,静态属性属于类属性,
     该类所有的对象都共享该属性
     静态属性直到项目结束时才会被回收
     应用场景:该类所有的对象都共享的变量,就把该变量设置为静态变量 

5.2应用场景 

该类所有的对象都共享的变量,就把该变量设置为静态变量 

package com.qf.test05;

public class A {
	
	//成员变量
	String str1;

	//静态变量
	static String str2;
}
package com.qf.test05;

public class Test01 {

	public static void main(String[] args) {
		
		
		A a1 = new A();
		A a2 = new A();
	
		a1.str1 = "aaa";
		a2.str1 = "bbb";
		System.out.println(a1.str1);//aaa
		System.out.println(a2.str1);//bbb
		
//		a1.str2 = "xxx";
//		a2.str2 = "yyy";
//		System.out.println(a1.str2);//yyy
//		System.out.println(a2.str2);//yyy
	
		A.str2 = "xxx";
		A.str2 = "yyy";
		System.out.println(A.str2);//yyy
		System.out.println(A.str2);//yyy
	}
}
5.3类加载面试题 5.31 面试题1 
package com.qf.test06;

public class A {
	//准备阶段1:为静态变量开辟空间
	//A a;
	//int value1;
	//int value2;
	//准备阶段2:为静态变量赋系统默认值
	//A a = null;
	//int value1 = 0;
	//int value2 = 0;
	//初始化阶段
	//A a = new A();
	//int value1 = 0;
	//int value2 = 1;

	static A a = new A();
	static int value1 = 0;
	static int value2;
	
	public A() {
		value1++;
		value2++;
	}
}
package com.qf.test06;

public class Test01 {

	public static void main(String[] args) {
		
		
		System.out.println(A.value1);//0
		System.out.println(A.value2);//1
	}
}
 5.32面试题2
package com.qf.test07;

public class A {
	//准备阶段1:为静态变量开辟空间
	//int value1;
	//int value2;
	//A a;

	//准备阶段2:为静态变量赋系统默认值
	//int value1 = 0;
	//int value2 = 0;
	//A a = null;	

	//初始化阶段
	//int value1 = 1;
	//int value2 = 1;
	//A a = new A();

	static int value1 = 0;
	static int value2;
	static A a = new A();
	
	public A() {
		value1++;
		value2++;
	}
}
package com.qf.test07;

public class Test01 {

	public static void main(String[] args) {
		
		
		System.out.println(A.value1);//1
		System.out.println(A.value2);//1
	}
}
六、总结

1.构造方法
    与类名相同且没有返回项的方法
    作用:
        1.和new一起,创建对象
        2.初始化数据
    
2.private
    修饰属性:私有化属性,不能让外界调用
    修饰方法:私有化方法,不能让外界调用
    
3.封装
    私有化属性
    添加get、set方法
    
4.this(方法中的this表示调用该方法的对象)
    this.属性:调用本对象的成员属性
    this.方法:调用本对象的成员方法
    this():调用本对象的构造方法
    
5.分包(防止类的重名)

6.static修饰属性
    类加载到方法区时会在静态区加载静态属性
    项目结束时(main方法结束时),静态属性才会被回收
    
7.扩展 - 类加载机制

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/841603.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号