Java学习笔记

一.java语言概述

1.dos命令

常用指令:

  • 操作1:进入和回退
操作说明
盘符名称:盘符切换。E:回车,表示切换到E盘。
dir列出当前目录下的文件以及文件夹
cd 目录进入指定单级目录。
cd 目录1\目录2\…进入指定多级目录。cd atguigu\JavaSE
cd …回退到上一级目录。
cd \ 或 cd /回退到盘符目录。
  • 操作2:增、删
操作说明
md 文件目录名创建指定的文件目录。
rd 文件目录名删除指定的文件目录(如文件目录内有数据,删除失败)
  • 操作3:其它
操作说明
cls清屏。
exit退出命令提示符窗口。
← →移动光标
↑ ↓调阅历史操作命令
Delete和Backspace删除字符

2.Java API文档

API (Application Programming Interface,应用程序编程接口)是 Java 提供的基本编程接口。

Java API文档,即为JDK使用说明书、

下载API文档:

  • 在线看:https://docs.oracle.com/en/java/javase/17/docs/api/index.html
  • 离线下载:https://www.oracle.com/java/technologies/javase-jdk17-doc-downloads.html

二.基本运算符

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image-20220312001943403
  • 逻辑运算符,操作的都是boolean类型的变量或常量,而且运算得结果也是boolean类型的值。

  • 运算符说明:

    • & 和 &&:表示"且"关系,当符号左右两边布尔值都是true时,结果才能为true。否则,为false。
    • | 和 || :表示"或"关系,当符号两边布尔值有一边为true时,结果为true。当两边都为false时,结果为false
    • ! :表示"非"关系,当变量布尔值为true时,结果为false。当变量布尔值为false时,结果为true。
    • ^ :当符号左右两边布尔值不同时,结果为true。当两边布尔值相同时,结果为false。
      • 理解:异或,追求的是“异”!
  • 逻辑运算符用于连接布尔型表达式,在Java中不可以写成 3 < x < 6,应该写成x > 3 & x < 6 。

  • 区分“&”和“&&”:

    • 相同点:如果符号左边是true,则二者都执行符号右边的操作

    • 不同点:& : 如果符号左边是false,则继续执行符号右边的操作

    ​ && :如果符号左边是false,则不再继续执行符号右边的操作

    • 建议:开发中,推荐使用 &&
  • 区分“|”和“||”:

    • 相同点:如果符号左边是false,则二者都执行符号右边的操作

    • 不同点:| : 如果符号左边是true,则继续执行符号右边的操作

      ​ || :如果符号左边是true,则不再继续执行符号右边的操作

    • 建议:开发中,推荐使用 ||

三.流程控制

1.if else

if(条件表达式) { 
  	语句块1;
}else {
  	语句块2;
}

2.switch-case

switch(表达式){
    case 常量值1:
        语句块1;
        //break;
    case 常量值2:
        语句块2;
        //break; 
    // ...
   [default:
        语句块n+1;
        break;
   ]
}

执行过程:

第1步:根据switch中表达式的值,依次匹配各个case。如果表达式的值等于某个case中的常量值,则执行对应case中的执行语句。

第2步:执行完此case的执行语句以后,
​ 情况1:如果遇到break,则执行break并跳出当前的switch-case结构
​ 情况2:如果没有遇到break,则会继续执行当前case之后的其它case中的执行语句。—>case穿透
​ …
​ 直到遇到break关键字或执行完所有的case及default的执行语句,跳出当前的switch-case结构

使用注意点:

  • switch(表达式)中表达式的值必须是下述几种类型之一:byte,short,char,int,枚举 (jdk 5.0),String (jdk 7.0);

  • case子句中的值必须是常量,不能是变量名或不确定的表达式值或范围;

  • 同一个switch语句,所有case子句中的常量值互不相同;

  • break语句用来在执行完一个case分支后使程序跳出switch语句块;

    如果没有break,程序会顺序执行到switch结尾;

  • default子句是可选的。同时,位置也是灵活的。当没有匹配的case时,执行default语句。

import java.util.Scanner;
class SwitchCaseTest4 {
	public static void main(String[] args) {	
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入2023年的month:");
		int month = scan.nextInt();
		System.out.println("请输入2023年的day:");
		int day = scan.nextInt();
		int sumDays = 0;//记录总天数

		switch(month){
			case 12:
				sumDays += 30;//这个30是代表11月份的满月天数
			case 11:
				sumDays += 31;//这个31是代表10月份的满月天数
			case 10:
				sumDays += 30;//这个30是代表9月份的满月天数
			case 9:
				sumDays += 31;//这个31是代表8月份的满月天数
			case 8:
				sumDays += 31;//这个31是代表7月份的满月天数
			case 7:
				sumDays += 30;//这个30是代表6月份的满月天数
			case 6:
				sumDays += 31;//这个31是代表5月份的满月天数
			case 5:
				sumDays += 30;//这个30是代表4月份的满月天数
			case 4:
				sumDays += 31;//这个31是代表3月份的满月天数
			case 3:
				sumDays += 28;//这个28是代表2月份的满月天数
			case 2:
				sumDays += 31;//这个31是代表1月份的满月天数
			case 1:
				sumDays += day;//这个day是代表当月的第几天
		}		
		System.out.println(month + "月" + day + "日是2023年的第" + sumDays + "天");
        //关闭资源
		scan.close();
	}
}

开发经验:如果既可以使用switch-case,又可以使用if-else,建议使用switch-case。因为效率稍高。

3.循环语句

  • for 循环
  • while 循环
  • do-while 循环

如何选择

  • 遍历有明显的循环次数(范围)的需求,选择for循环
  • 遍历没有明显的循环次数(范围)的需求,选择while循环
  • 如果循环体语句块至少执行一次,可以考虑使用do-while循环
  • 本质上:三种循环之间完全可以互相转换,都能实现循环的功能

4.关键字break和continue的使用

			适用范围			在循环结构中使用的作用						相同点
break		switch-case
			循环结构		一旦执行,就结束(或跳出)当前循环结构		  此关键字的后面,不能声明语句

continue	循环结构     	一旦执行,就结束(或跳出)当次循环结构		  此关键字的后面,不能声明语句

可使用标签指定跳出哪个循环

break语句用于终止某个语句块的执行
{    ……	 
	break;
	 ……
}

break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块 
	label1: {   ……        
	label2:	     {   ……
	label3:			 {   ……
				           break label2;
				           ……
					 }
			     }
			} 

四.数组

1.声明数组

//静态声明
int[] arr = new int[]{1,2,3,4,5};

int[] arr;
arr = new int[]{1,2,3,4,5};
    
int[] arr = {1,2,3,4,5};

//动态声明
int[] arr;
arr = new int[5];

int[] arr = new int[3];

2.多维数组

//静态初始化
int[][] arr = {{1,2,3},{4,5,6},{7,8,9,10}};//声明与初始化必须在一句完成

int[][] arr = new int[][]{{1,2,3},{4,5,6},{7,8,9,10}};

int[][] arr;
arr = new int[][]{{1,2,3},{4,5,6},{7,8,9,10}};

//动态初始化
int[][] arr = new int[3][2];
//(1)先确定总行数
元素的数据类型[][] 二维数组名 = new 元素的数据类型[总行数][];

//此时只是确定了总行数,每一行里面现在是null

//(2)再确定每一行的列数,创建每一行的一维数组
二维数组名[行下标] = new 元素的数据类型[该行的总列数];

//此时已经new完的行的元素就有默认值了,没有new的行还是null

//(3)再为元素赋值
二维数组名[行下标][列下标] =;

总结

一维数组:int[] x 或者int x[]
二维数组:int[][] y 或者 int[] y[] 或者 int y[][]

3. Arrays工具类的使用

java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法。 比如:

  • 数组元素拼接
    • static String toString(int[] a) :字符串表示形式由数组的元素列表组成,括在方括号(“[]”)中。相邻元素用字符 ", "(逗号加空格)分隔。形式为:[元素1,元素2,元素3。。。]
    • static String toString(Object[] a) :字符串表示形式由数组的元素列表组成,括在方括号(“[]”)中。相邻元素用字符 ", "(逗号加空格)分隔。元素将自动调用自己从Object继承的toString方法将对象转为字符串进行拼接,如果没有重写,则返回类型@hash值,如果重写则按重写返回的字符串进行拼接。
  • 数组排序
    • static void sort(int[] a) :将a数组按照从小到大进行排序
    • static void sort(int[] a, int fromIndex, int toIndex) :将a数组的[fromIndex, toIndex)部分按照升序排列
    • static void sort(Object[] a) :根据元素的自然顺序对指定对象数组按升序进行排序。
    • static void sort(T[] a, Comparator<? super T> c) :根据指定比较器产生的顺序对指定对象数组进行排序。
  • 数组元素的二分查找
    • static int binarySearch(int[] a, int key) 、static int binarySearch(Object[] a, Object key) :要求数组有序,在数组中查找key是否存在,如果存在返回第一次找到的下标,不存在返回负数。
  • 数组的复制
    • static int[] copyOf(int[] original, int newLength) :根据original原数组复制一个长度为newLength的新数组,并返回新数组
    • static T[] copyOf(T[] original,int newLength):根据original原数组复制一个长度为newLength的新数组,并返回新数组
    • static int[] copyOfRange(int[] original, int from, int to) :复制original原数组的[from,to)构成新数组,并返回新数组
    • static T[] copyOfRange(T[] original,int from,int to):复制original原数组的[from,to)构成新数组,并返回新数组
  • 比较两个数组是否相等
    • static boolean equals(int[] a, int[] a2) :比较两个数组的长度、元素是否完全相同
    • static boolean equals(Object[] a,Object[] a2):比较两个数组的长度、元素是否完全相同
  • 填充数组
    • static void fill(int[] a, int val) :用val值填充整个a数组
    • static void fill(Object[] a,Object val):用val对象填充整个a数组
    • static void fill(int[] a, int fromIndex, int toIndex, int val):将a数组[fromIndex,toIndex)部分填充为val值
    • static void fill(Object[] a, int fromIndex, int toIndex, Object val) :将a数组[fromIndex,toIndex)部分填充为val对象

五.面向对象-基础

1.类的定义

2.对象

匿名对象 (anonymous object)
我们也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象。
如:new Person().shout();
使用情况
如果一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
我们经常将匿名对象作为实参传递给一个方法调用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.方法(method、函数)的理解

方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中也称为函数或过程。
将功能封装为方法的目的是,可以实现代码重用,减少冗余,简化代码
Java里的方法不能独立存在,所有的方法必须定义在类里。

方法通过方法名被调用,且只有被调用才会执行。

4. 关键字return的使用

作用1:结束一个方法
作用2:结束一个方法的同时,可以返回数据给方法的调用者
注意点:在return关键字的直接后面不能声明执行语句

5.重载

方法重载:在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可。
参数列表不同,意味着参数个数或参数类型的不同
重载的特点:与修饰符、返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型)。调用时,根据方法参数列表的不同来区别。
重载方法调用:JVM通过方法的参数列表,调用匹配的方法。
先找个数、类型最匹配的
再找个数和类型可以兼容的,如果同时多个方法可以兼容将会报错

//返回两个整数的和
public int add(int x,int y){
	return x+y;
}
//返回三个整数的和
public int add(int x,int y,int z){
	return x+y+z;
}
//返回两个小数的和
public double add(double x,double y){
    return x+y
}

6.可变个数的形参

//JDK 5.0以前:采用数组形参来定义方法,传入多个同一类型变量
public static void test(int a ,String[] books);
//JDK5.0:采用可变个数形参来定义方法,传入多个同一类型变量
public static void test(int a ,String...books);
  1. 可变参数:方法参数部分指定类型的参数个数是可变多个:0个,1个或多个
  2. 可变个数形参的方法与同名的方法之间,彼此构成重载
  3. 可变参数方法的使用与方法参数部分使用数组是一致的,二者不能同时声明,否则报错。
  4. 方法的参数部分有可变形参,需要放在形参声明的最后
  5. 在一个方法的形参中,最多只能声明一个可变个数的形参
public class StringTools {
	String concat(char seperator, String... args){
		String str = "";
		for (int i = 0; i < args.length; i++) {
			if(i==0){
				str += args[i];
			}else{
				str += seperator + args[i];
			}
		}
		return str;
	}
}

StringTools tools = new StringTools();
System.out.println(tools.concat('-'));
System.out.println(tools.concat('-',"hello"));
System.out.println(tools.concat('-',"hello","world"));
System.out.println(tools.concat('-',"hello","world","java"));

7.参数传递机制:值传递

Java里方法的参数传递方式只有一种: 值传递。 即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。
形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参
形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参

//1、形参是基本数据类型
public class Test {
	public static void main(String[] args) {
		int m = 10;
		int n = 20;
        System.out.println("m = " + m + ", n = " + n);
        ValueTransferTest1 test = new ValueTransferTest1();
        test.swap(m, n);
		System.out.println("m = " + m + ", n = " + n);
	}
	public void swap(int m,int n){
		int temp = m;
		m = n;
		n = temp;
	}
}
//2、形参是引用数据类型
public class Test {
	public static void main(String[] args) {
		Data d1 = new Data();
		d1.m = 10;
		d1.n = 20;
		System.out.println("m = " + d1.m + ", n = " + d1.n);
//实现 换序
		ValueTransferTest2 test = new ValueTransferTest2();
		test.swap(d1);
		System.out.println("m = " + d1.m + ", n = " + d1.n);
	}
	public void swap(Data data){
		int temp = data.m;
		data.m = data.n;
		data.n = temp;
	}
}
class Data{
	int m;
	int n;
}

8.递归

public int multiply(int num){
	if(num == 1){
		return 1;
	}else{
		return num * multiply(num - 1);
	}
}

9.关键字:package、import

package语句作为Java源文件的第一条语句出现。若缺省该语句,则指定为无名包。

package 顶层包名.子包名 ;
pack1\pack2\PackageTest.java

为了使用定义在其它包中的Java类,需用import语句来显式引入指定包下所需要的类

import 包名.类名;
import pack1.pack2.Test;

如果导入的类或接口是java.lang包下的,或者是当前包下的,则可以省略此import语句。

如果已经导入java.a包下的类,那么如果需要使用a包的子包下的类的话,仍然需要导入。

如果在代码中使用不同包下的同名的类,那么就需要使用类的全类名的方式指明调用的是哪个类。

10封装

权限修饰符: public 、protected 、缺省、private 。具体访问范围如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

具体修饰的结构:
外部类:public、缺省
成员变量、成员方法、构造器、成员内部类:public、protected、缺省、private

注意:
开发中,一般成员实例变量都习惯使用private修饰,再提供相应的public权限的get/set方法访问。
对于final的实例变量,不提供set()方法。(后面final关键字的时候讲)
对于static final的成员变量,习惯上使用public修饰。

11.构造器

java提供了构造器(Constructor) ,也称为构造方法。

[修饰符] class 类名{
	[修饰符] 构造器名(){
		// 实例初始化代码
	}
	[修饰符] 构造器名(参数列表){
		// 实例初始化代码
	}
}
// 无参构造
public Student() {}
// 有参构造
public Student(String n,int a) {
	name = n;
	age = a;
}
  1. 构造器名必须与它所在的类名必须相同。
  2. 它没有返回值,所以不需要返回值类型,也不需要void。
    的结构:
    外部类:public、缺省
    成员变量、成员方法、构造器、成员内部类:public、protected、缺省、private

注意:
开发中,一般成员实例变量都习惯使用private修饰,再提供相应的public权限的get/set方法访问。
对于final的实例变量,不提供set()方法。(后面final关键字的时候讲)
对于static final的成员变量,习惯上使用public修饰。

11.构造器

java提供了构造器(Constructor) ,也称为构造方法。

[修饰符] class 类名{
	[修饰符] 构造器名(){
		// 实例初始化代码
	}
	[修饰符] 构造器名(参数列表){
		// 实例初始化代码
	}
}
// 无参构造
public Student() {}
// 有参构造
public Student(String n,int a) {
	name = n;
	age = a;
}
  1. 构造器名必须与它所在的类名必须相同。
  2. 它没有返回值,所以不需要返回值类型,也不需要void。
  3. 构造器的修饰符只能是权限修饰符,不能被其他任何修饰。比如
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值