java学习笔记(三)

127 阅读5分钟

这是自己写的家庭经济收入支出情况

改进后的: import java.util.Scanner;//未考虑界面是循环的 class MoneyDetails { public static void main(String[] args) { String details1 = "";//先要设置才有下面的details+= 这里只说了收入没有支出的+= int shouruj=0,zhichuj=0; String shourus="无",zhichus="无"; int money=10000;

	while (true)//★
	{
		
		Scanner scan = new Scanner(System.in);
		System.out.println("----------------家庭收支记账软件----------------");
		System.out.println("				  1收支明细");
		System.out.println("				  2登记收入");
		System.out.println("				  3登记支出");
		System.out.println("				  4退  出\n");
		System.out.print("				  请选择(1-4): _");//不加ln
		//char key = Utility.readMenuSelection();//★应该与System有点像
		int key = scan.nextInt();
		System.out.println();
		switch (key)
		{
			case 2:

			//case '2'://''重要
				System.out.print("本次收入金额:");
				shouruj = scan.nextInt();
				System.out.print("本次收入说明:");
				shourus = scan.next();
				money=money+shouruj;
				details1 += "收入  "+money+" "+shouruj+"  "+shourus+"\n";//★正因为+=所以才有收入一条条出现
				break;
			case 3:

				System.out.print("本次支出金额:");
				zhichuj = scan.nextInt();
				System.out.print("本次支出说明:");
				zhichus = scan.next();
				money=money-zhichuj;
				break;	
			case 1:
				System.out.println("----------------当前收支明细记录----------------");
				System.out.println("收支   账户金额   收支金额 说 明");
				System.out.println(details1);
				System.out.println("支出  "+money+" "+zhichuj+"  "+zhichus);
				break;
			case 4:
				System.out.print("确认是否退出(Y/N):_");
				String tui = scan.next();
				if (tui.equals("y"))//注意这里是""因为是string
				{
					return;
				}else{
					continue;	
				}
			default:
				System.out.println("请重新输入");
				break;

​ } ​ }

​ ​ }

}

未用Utility因为这是他自己写的,还是不用为好

break结束当前switch或者全部循环,当for中有switch时结束的时switch for进行下一次循环

包名小写

f11快捷运行,java项目最开头必须有 package 包名;

静态初始化:int[] ids = new int[]{1,2,3}

动态:int[] ids = new int[5] (未赋值) 通过记Scanner得方法记

但是通过 int[] a ={1,2}更加方便与c相似理解为一个数组a

int[] b=a b数组等于a数组但是 a和b共享所以b得变化就是

a得变化 (内存使用权共享)只对于引用数据类型有效 a.length是a数组得长度与python中得 len(a)不同

a.length可以理解为a的属性长度

通过ctrl shift / \ 四个键可以快速进行多行的注释

引用的时候和c是一样的

数组的未初始化是为 0 0.0 char的数组也是0 String 为 null想象前面三个都是0这种情况是null(空)的

main方法中的都是局部变量在栈中

堆heap:new出来的对象,数组(???)

int[] a = new int[]{1,2,3}

左边的在栈中其首地址为右边的堆中的首地址,左边的值也来自右边的堆中,如果左边不指向右边而指向其它的堆(或者左边消失例如main方法执行完毕),那么堆中的右边数据会被当成垃圾回收,

String str=""

str+=a[i]这样可以把a中每一个数字组成一串数字

快捷键:shift 加回车 不管在语句哪个位置都可以换行到下一行 ctrl+shift+回车是到上一行

package com.atguigu.contact; import java.util.Scanner;

public class HelloWorld { public static void main(String[] args) { int[] a =new int[5];

	Scanner scan = new Scanner(System.in);

​ System.out.println("请输入人数:"); ​ ​ int i =scan.nextInt(); ​

	System.out.println("请输入成绩:");
	for (int j =0;j<i;j++)
	{
		a[j] = scan.nextInt();//不熟悉
	}
	int max = a[0];
	for (int j =1;j<i;j++)
		
	{
		if(max<a[j])
		{
			max=a[j];
		}
	}
	
	System.out.println("最高分是:"+max);
	for (int j =0;j<i;j++)
	{
		char ch;
		if(a[j]>=max-10)
		{
			ch='A';
		}else if(a[j]>=max-20)
		{
			ch='B';
		}else if(a[j]>=max-30)
		{
			ch='C';
		}else
		{
			ch='D';
		}

​ System.out.println("student "+j+" score is "+a[j] grade is "+ch);//★ ​ } ​ }

}

这个是判断谁是最高分然后并且以最高分划分等级

int[][][ ]【】a=new int[2]【】这个可以也可以两个都写但前面哪个必须写

★数组在java中和c语言中的区别:www.cnblogs.com/tfxz/p/1262…

int[]【】 a = new int[3]【2】这时全部为0

.。。。。。。。。。[3]【】这时输出会报错,因为没有列要现有列才能付0

二维数组不能{1,2,3}要{{2},{3},{4}}才行

b[0] b[1]代表的是第一行第二行中的具体数据

二维数组还是.length b[0].length=2 ,二维数组列不一定要相同

[^]:

这是遍历

数组都是先得到堆中的地址,在得到堆中的值

队列与栈的区别队列有入口与出口 先入的先出

int[] x,y[]

★这里y时二维数组

冒泡排序 i<.length-1,j=i j<.length

★问题:为什么第二次用i 要重新int i??

int[] arr = new int[6];

for (int i = 0; i < arr.length; i++) {// [0,1) [0,30) [1,31)

​ arr[i] = (int) (Math.random() * 30) + 1;

for (int j = 0; j < i; j++) {

if (arr[i] == arr[j]) {

​ i--;//★这里是不满足条件直接排除

​ break;

​ }

​ }

​ }

for (int i = 0; i < arr.length; i++) {

​ System.*out*.println(arr[i]);

​ }

}

}

这个是求1-30的6个随机数且不重复

回形数:行列相同 例如:123

​ 894

​ 765

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7

array 1 = array 2 1和2地址相同所以 1和2变为和2一样的数组

真正的赋值是 int[] array1 = new int[array2.length]

再通过for循环将数据录入array1

快捷键

syso (m,n)m到n只需要table ctrl+x为剪切

image-20210226181316056

这里是false因为地址不同 ==改为=异常发生

package com.atguigu.contact;

class ArraryTest { public static void main(String[] args) { int found=2; int[] a1 = new int[]{1,2,3,4,5}; int num = (int)((a1.length-1)/2);//2

​ while (a1[num]!=found) ​ { ​ if(a1[num]>found)//在后面 ​ { ​ num = (int) num/2; ​ System.out.println("y"); ​ break; ​ }else if(a1[num]<found) ​ { ​ num=(int)(num+a1.length-1)/2; ​ } ​

	}
	System.out.println("true");

​ ​ ​ }

}

这是二分法这个举个例子应该就可以推出来了。。。(然而这个有结构可以直接调用,熟悉就行,下次应该看是否应该掌握才决定是否写)

内部排序 用内存 外部排序 用磁盘(外部存储器因数据量太多)

快排:

冒泡是从一个方向到另一个方向 重复多次

快排是第一个数字不同 再取左右两个方向 向中间走 重复多次

冒泡的时间复杂度(平均)n² (n-1)*(n-i)

快排 nlog2 n 2 的x次方=n 解出x

上面记得有import java.util.Arrays(与Scanner一样)

★注意()里面没有int这些数据类型,Arrays.toString(a)要输出

负的就是未找到

NullPointeerException 空指针意味找的元素没有具体的值连null 0都不是

面向过程:强调的是函数的功能即做了些什么例如把冰箱打开,将大象放入冰箱,关闭冰箱

面向对象:是哪些对象具体做了哪些功能(不是特别懂两个的区别)

打个比方 过程就像大家一起做一件事没有分工 而对象就是每个人有自己的管理,工作的具体区域,流程化

我开车去丽江 我,车是类后面写功能即方法(一般为动作例如这里的开)

说白了类是宏观,方法是这个类的一些行为

类和对象是面向对象的核心概念

面向对象重点是类的设计 设计类就是设计类的成员

类的成员:1 属性:成员变量(全局变量,不在main中)想象游戏里的属性都有名字人有身高体重等属性 2行为:方法(函数)即定义功能 人有打球等行为

类的实例化(如何用之前的类)就是创建对象

package com.atguigu.contact; import java.util.Arrays; class Person { int age; int weight=60; public void sleep() { System.out.println("人可以睡觉"); } public void speak(String a)//这里和c一样 { System.out.println("人可以说"+a); }

} class PersonTest { public static void main(String[] args) { Person p = new Person(); //Scanner scan=new Scanner(System.in);两者都是创建对象其实Scanner和Person都是已经定义好了的函数现在只是调用 //创建一个p来当作新的Person来是试用(创建对象) p.age=19;//★主要是赋值和调用成员变量//对象.属性(行为)为调用对象 p.sleep(); p.speak("Chinese"); }

}