首页 > 编程语言 >java面对对象基础

java面对对象基础

时间:2024-08-05 15:24:08浏览次数:17  
标签:map arr java 对象 System 面对 int return public

1.对象的内存布局

类实例化为对象:类实例化为对象的语句一定要加括号,否则编译不通过
//类名 生成对象名=new 类名()

//类名 生成对象名=new 类名()
Tool Mytool=new Tool();
class Tool{
	public boolean oddOreven(int num){
		if(num%2!=0){
			return true;
		}else{
			return false;
		}
	}
} 

(1)对象包括属性和方法;
在这里插入图片描述
java中对象的赋值是地址的传递(和数组传递机制类似)在这里插入图片描述
置p1=Null的时候,堆区的对象内容不会被置空,只会释放p1

2.对象-方法的访问修饰符

一共四种:public,protected,默认,private;(不写明则为默认)
(1)方法使用的注意事项
在这里插入图片描述
方法调用时也必须要加括号

3.程序:猴子吃桃&汉诺塔&走迷宫

“猴子吃桃”
public class Recursion{

	public static void main(String[] args){
		Tool MyTool=new Tool();
		int day=1;
		int receiveNum=MyTool.peachNum(day);
		System.out.println("day "+day+" has "+receiveNum+" peaches");
	}

}


class Tool{
	public int peachNum(int day){
		/*猴子吃桃,每天吃掉前一天的一半,再多吃一个
		第10天时,还没开始吃,桃子只剩下一个,问第一天有多少个桃子
		做法:day10=day9/2-1---->day9=2*(day10+1)---->4个
		同理:day1=2*(day2+1)
		 */
		if(day==10){
			return 1;
		}else if(day>=1&&day<=9){
			return 2*(peachNum(day+1)+1);
		}else{
			System.out.println("please input num 1~10");
			return -1;
		}
	}
}
“汉诺塔”
public class HanoiTower{
	public static void main(String[] args){
		Tower myTool=new Tower();
		myTool.move(5,'A','B','C');
	}
}

class Tower{

	//将所有盘子从a柱移到c柱上
	public void move(int num,char a,char b,char c){//num:盘子总数;a,b,c:三根柱子的名字
		if(num==1){
			System.out.println(a+" --> "+c);
		}else{
			/*
			盘子数不是一个时,将盘子分成两堆,最下面一个为一堆,上面的
			所有为一堆;
			(1)需要将上面的所有先借助c挪到b上;
			(2)然后将最下面一个从a挪到c上;
			(3)最后借助a将b上面的那堆移到c上;
			 */
			//(1)需要将上面的所有先借助c挪到b上;
			move(num-1,a,c,b);	//从a开始挪,借助c,最后挪至b上;
			//(2)然后将最下面一个直接从a挪到c上;
			System.out.println(a+" --> "+c);
			//(3)最后借助a将b上面的那堆移到c上;
			move(num-1,b,a,c);	//从b开始挪,借助a,最终挪到c;
		}
	}
}
/*
小老鼠出迷宫的代码
作者:shawya
 */
public class MiGong{

	public static void main(String[] args){
		//(1)首先用一个8行7列的二维数组来表示迷宫
		//(1)数组中值为0表示:可以走;1:障碍物
		int[][] map;
		map=new int[8][7];
		//将第一行和最后一行,第一列和最后一列上的元素值全部置为1,表示边界墙
		for(int i=0;i<7;i++){
			map[0][i]=1;
			map[7][i]=1;
		}
		for(int j=0;j<8;j++){
			map[j][0]=1;
			map[j][6]=1;
		}
		//再添加地图中间的障碍物
		map[3][1]=1;
		map[3][2]=1;

		//打印原始迷宫
		System.out.println("before findway,the map is:");
		for(int i=0;i<8;i++){
			for(int j=0;j<7;j++){
				System.out.print(map[i][j]+" ");
			}
			System.out.println();
		}


		//执行走迷宫的方法
		Tool MyFind=new Tool();
		Tool.findway(map,1,1);
		//打印走完后的迷宫,2表示通路
		System.out.println("after findway,the map is:");
		for(int i=0;i<8;i++){
			for(int j=0;j<7;j++){
				System.out.print(map[i][j]+" ");
			}
			System.out.println();
		}


	}
}

class Tool{
	public static boolean findway(int[][] map,int i,int j){//传参:地图,起始点坐标
		//0:可以走但还未尝试的点;1:障碍物;2:可以走通的点;3:走不通的点
		//如果map[6][5]=2,则说明已经找到了通路
		//在每个位置的找路方向是:先右侧-下侧-左侧-上侧
		if(map[6][5]==2){//递归退出条件是当重点的元素值为2,即最后一个点通路
			return true;
		}else{
			if(map[i][j]==0){
				//假设能走通:
				map[i][j]=2;
				//按照搜索顺序进行搜索
				if(findway(map,i,j+1)){//右
					return true;
				}else if(findway(map,i+1,j)){//下
					return true;
				}else if(findway(map,i,j-1)){
					return true;
				}else if(findway(map,i-1,j)){
					return true;
				}else{
					map[i][j]=3;
					return false;
				}

			}else{//当前元素值为1,2,3都说明它已经被处理过了,所以直接return就行
				return false;
			}
		}
	}
}
“八皇后”
public class EightQueen{

	public static void main(String[] args){
		int[] arr=new int[8];
		Queen myTool=new Queen();
		myTool.put(arr,0);
	}

}


class Queen{
	public boolean put(int[] arr,int i){
	/*
	将八皇后棋盘(8x8)当做一个一维数组arr[0~7]=val;
	数组的下标表示每一行,值表示每一行放棋子的位置;
	思考:
	递归终止条件:
	如果只有一行,那就直接放在第一个
	如果有多个:其实要对比的就是首先下标对应的位置不能存在元素,其次不能和前一个下标位置形成对角
	 */
		if(i==8){
			print(arr);
			return true;
		}else{
			for(int k=0;k<8;k++){
				arr[i]=k;
				if(judge(arr,i)){
					put(arr,i+1);
				}
			}
			return false;
		}
	}
	

	public void print(int[] arr){
		for(int m=0;m<8;m++){
			System.out.print(arr[m]);
		}
		System.out.println();
	}


	public boolean judge(int[] arr,int curRow){//判断当前行放置的是否满足条件
		for(int n=0;n<curRow;n++){//判断已经摆放的列不能和现有的列相同,并且他们不能在一条斜线上
			if(arr[n]==arr[curRow]||Math.abs(curRow-n)==Math.abs(arr[curRow]-arr[n])){
				return false;
		}
	}
		return true;
	}
}

4.方法的重载

(1)方法重载有利用接口编程,并且减少了起名记名的麻烦;
(2)方法重载的细节:
方法名必须相同,形参必须不完全相同,返回值类型无要求;
在这里插入图片描述

5.方法-可变形数

(1)可变形参的表达形式为

public void my_func(int… num){}//这里的…表示参数个数不确定

(2)可变形参使用注意事项
在这里插入图片描述

6.变量的作用域

(1)类中全局变量的有初始化默认值,初始化可以不赋值;但局部变量没有初始值,初始化必须赋值;(放在类中即为全局变量,在整个类中生效,放在方法中则为局部变量)
(2)类中的全局变量可以加修饰符(public,private等),局部变量不能加修饰符
在这里插入图片描述

7.构造器在这里插入图片描述

在这里插入图片描述
(1)构造器细节在这里插入图片描述

8.对象创建流程分析

在这里插入图片描述

上述案例中,对象创建时内存执行流程如下:
(1)首先从方法区加载Person类的放到堆区,也就是加载编译得到的Person.class文件;
(2)然后属性age和name初始化,分别为0和Null;
(3)接下来执行age=90;
(4)然后才会进行构造器的初始化,name=n,age=a;此时“小倩”、“20”才派上用场;
(5)最后才将堆的地址传给p;
最后的p只是对象的引用,真正的对象在堆中

8.this

(1)this用来指对象本身,它存在于对象的堆中,并且值为对象的地址;
在这里插入图片描述
(2)this使用注意事项
在这里插入图片描述

9.匿名对象

在这里插入图片描述

标签:map,arr,java,对象,System,面对,int,return,public
From: https://blog.csdn.net/renxiaoyaxiaotia/article/details/140751477

相关文章

  • Java基础语法
    关键字和保留字在Java编程语言中,关键字和保留字是语言的基本组成部分。它们有特定的含义并在Java程序中扮演着重要的角色。理解这些关键字和保留字对于编写有效的Java代码至关重要。1.关键字(Keywords)关键字是Java语言中具有特殊含义的词,它们在编译器中被预定义并用于执行特定......
  • 我可以将 Python 与 javascript 结合起来用于网站或应用程序吗
    我不知道如果j添加Python和javascript可以吗我尝试过。但决定在继续之前询问一下是否可以继续但是如果我只使用javascript还是只使用python会更好吗?我只需要建议或答案将Python与Javascript结合用于网站或应用程序不仅完全可行,而且也是一种非常常见的做法!二者......
  • Python 网络抓取与请求和美丽的汤被需要 javascript 阻止
    我正在尝试从网站上抓取文本。我使用简单的代码:requests.get(url_here)。我的代码直到最近才有效。现在,当我使用请求时,我收到一条消息,而不是获取网站的文本:“该网站需要启用JavaScript!您使用的浏览器不支持JavaScript,或者已关闭JavaScript。“我已验证我的浏览器确实......
  • Java基于XXLJOB的定时任务实现阶梯式通知方式
    数据库表设计CREATETABLE`tx_order_push_info`(`order_no`varchar(64)DEFAULTNULLCOMMENT'交易单号',`order_id`decimal(11,0)DEFAULTNULLCOMMENT'交易单Id',`push_status`decimal(2,0)DEFAULTNULLCOMMENT'推送状态',`push_count......
  • Java RMI技术详解与案例分析
    JavaRMI(RemoteMethodInvocation)是一种允许Java虚拟机之间进行通信和交互的技术。它使得远程Java对象能够像本地对象一样被访问和操作,从而简化了分布式应用程序的开发。一些应用依然会使用RMI来实现通信和交互,今天的内容我们来聊聊RMI的那些事儿。一、先来了解一下概念RMI......
  • 重学面向对象-基础篇02包和访问控制
    包和访问控制基础概念包:用于区分类位置,将类分类package包的命名规则:英文和数字的组合,最好以域名形式com.test访问权限控制:private:私有,无法被除当前类以外的任何位置访问什么都不写:默认,只能被类本身和同包中的其他类访问protected:受保护,标记为受保护的内容可以能被类本身和......
  • java笔记4
    7.封装封装是面向对象编程的四大基本特性之一,它将对象的数据(属性)和行为(方法)组合在一起,并隐藏内部的实现细节。何为封装封装是创建对象的过程,确保对象的内部状态只能通过对象提供的方法来访问和修改。访问修饰符private关键字private修饰的成员只能在类的内部访问,不能被......
  • 重学面向对象-基础篇01类与对象
    类与对象基础概念类:一类事物,比较概括性(动物)对象:类的实例,具体的某样事物(猫)属性:类的成员变量,表示某事物所具有的特征(性别)方法:对象可以做出的一些行为,是语句的集合,为了完成某件事情而存在(抓老鼠)方法定义时编写的参数,我们一般称为形式参数,而调用方法实际传入的参数,我们称为实际......
  • 面向对象设计基本原则
    本文由ChatMoney团队出品引言在软件开发过程中,随着系统复杂度的增加和业务变更,程序员面临诸多挑战,如耦合性、内聚性、可维护性、可扩展性和可重用性。设计模式能有效地解决这些问题。设计模式蕴含了面向对象的精髓,掌握面向对象设计和分析是掌握设计模式的基础。它能帮助我们......
  • 2024最全 Java 面试八股文(程序员必备)
     一、Java基础篇1.接口和抽象类的区别相似点:(1)接口和抽象类都不能被实例化(2)实现接口或继承抽象类的普通子类都必须实现这些抽象方法不同点:(1)抽象类可以包含普通方法和代码块,接口里只能包含抽象方法,静态方法和默认方法,(2)抽象类可以有构造方法,而接口没有(3)抽象类中的成员变......