Java课堂笔记

10.13Java课堂笔记

数组

二维数组

声明:

类型 [ 行 ] [ 列 ] 数组的名字

		///直接为每一维分配内存空间
		int [][]a = new int [2][3];
		///分别
		int [][]b = new int [2][];
		b[0] = new int[3];
		b[1] = new int[2];

二维数组可以静态初始化,内存不是连续分配,所以每一维长度不一定相等

引用时,要给出两维的下标,比如:

b[1][1];

另外数组下标从0开始,遍历的时候要注意不能大于等于length;

Java中含有 java.util.Arrays 类,能方便进行数组操作;

fill 给数组元素负值

sort 升序排序

比较数组时可以使用equals

binarySearch 二分查找

搜索
查询元素出现的位置
需要注意的是,使用binarySearch进行查找之前,必须使用sort进行排序
如果数组中有多个相同的元素,查找结果是不确定的

clone 可以克隆数组

匿名数组

可以作为现用现写

增强for循环

可以遍历数组,也可以遍历集合

for(type name: 集合名) {

}

迭代变量必须在()中进行

类似C++中的 iterator 迭代器,不会出现数组越界的问题

※ 不能再增强for循环中给数组赋值

要想初始化要用普通的for循环来解决

二维数组怎么通过增强for循环实现输出 ?

int [][] arr = {{1,2},{3,4},{5,6}};
for(int [] row : arr) {
    for(int j : row) {
        System.out.println(j);
    }
}

使用for 循环对数组元素进行复制,要考虑到目标数组大小

System.arrary.copy 可以对数组进行拷贝

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OTKdBw6v-1609761105596)(C:\Users\wuyan\AppData\Roaming\Typora\typora-user-images\image-20201016104735416.png)]

错误的赋值方式:

int [][]num = new int[3][];
num[0][0]= 1;
num[0][1]= 2;
num[1][0]= 0;

字符串

双引号包裹着的一串字符:

“hello,world” "123.435"等

字符串存储在char 类型的数组中,一个字符占两个字节

String s1 = new String();
char[] a = {'b','o','y'};

常量字符串创建后会存储在字符串常量池中——享元模式

不提倡的创建字符串常量的方式

String s = new String("xyz");

字符串中常用的API

https://www.cnblogs.com/qiuqiu001/p/7806725.html

https://www.cnblogs.com/caigq/archive/2017/06/11/6985974.html

public int compareTo(String S)

当前字符串与S相同, 返回0,大于 正值,小于 负值

比较时采用Unicode来进行比较,字典序

如果不想区分大小写的时候可以使用 equalsIgnoreCase

字符串对比

问题描述
  给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一:
  1:两个字符串长度不等。比如 Beijing 和 Hebei
  2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如 Beijing 和 Beijing
  3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它并不满足情况2)。比如 beijing 和 BEIjing
  4:两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。比如 Beijing 和 Nanjing
  编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的编号。
输入格式
  包括两行,每行都是一个字符串
输出格式
  仅有一个数字,表明这两个字符串的关系编号
样例输入
BEIjing
beiJing
样例输出
3

Code:

package shifengshou;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		
		//字符串对比
		Scanner in = new Scanner(System.in);
		String s1 = in.next();
		String s2 = in.next();
		
		
		if(s1.length() != s2.length())
		{
			System.out.println("1");
		}
		
		else
		{
			if(s1.equals(s2))//区分大小写的判断
			System.out.println("2");
			
			else if(s1.equalsIgnoreCase(s2))//忽略大小写的判断
			System.out.println("3");
		}
	}
}

getChar() 获得字母

subString() 字符串截取(注意函数值的问题)

concat字符串拼接

isEmpty()判断是否非空""注意和 isBlank() 的区别关系

indexOf(String s);

indexOf(String s,int startpoint);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s46E1Shp-1609761105599)(C:\Users\wuyan\AppData\Roaming\Typora\typora-user-images\image-20201016113748110.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6sPwWQiU-1609761105600)(C:\Users\wuyan\AppData\Roaming\Typora\typora-user-images\image-20201016114004045.png)]

10.22java课堂笔记

substr截取字符串左闭右开

public static void main(String []args) {
		//System.out.println("hello world");
		Scanner cin=new Scanner(System.in); 
		String s1 = new String();
		s1 = cin.nextLine();
		int pos = s1.indexOf('@');
		int len = s1.length();
		String a = new String();
		String b = new String();
		a = s1.substring(0, pos);
		b = s1.substring(pos+1,len);
		System.out.println(a);
		System.out.println(b);
	}

API

format方法,可以创建一个格式化的字符串

字符串转换为整型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F3UkIX7V-1609761105602)(C:\Users\wuyan\AppData\Roaming\Typora\typora-user-images\image-20201022101512908.png)]

字符串转换为浮点型

Float.parseFloat();

Double.parseDouble();

数值转换为字符串

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AmVAGW0k-1609761105603)(C:\Users\wuyan\AppData\Roaming\Typora\typora-user-images\image-20201022101949282.png)]

工厂方法:

可以将任何对象任何基本类型转换为字符串

String.valueOf()

字符串与字符、字符数组

String (char[]);

字符串与字节数组

getByte("编码方式");

StringBuffer

可以创建能够进行修改的字符串序列,该对象实体的内存空间可以自动改变大小,便于存放改变大小的字符串

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9wiVHilp-1609761105605)(C:\Users\wuyan\AppData\Roaming\Typora\typora-user-images\image-20201022103820971.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4V7Xz9FQ-1609761105606)(C:\Users\wuyan\AppData\Roaming\Typora\typora-user-images\image-20201022103933078.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GdU8vTIK-1609761105607)(C:\Users\wuyan\AppData\Roaming\Typora\typora-user-images\image-20201022104121123.png)]

基本类型数据的类包装器

java对所有基本数据类型都在java.lang包提供了对应的包装类

Double类的构造方法:

Double(double num1)/Double (String num1)

静态工厂方法:

valueOf(double d);

valueOf(string d);

Character类:

构造方法:Character (char c);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AWlvrxa7-1609761105608)(C:\Users\wuyan\AppData\Roaming\Typora\typora-user-images\image-20201022105517712.png)]

装箱和拆箱:

装箱

Interge int1 = 55; 或者是

int i = 3;

Interage int2 = i;

拆箱

注意:

防止没有初始化就使用的空型情况;

java编程要尽可能使用工厂方法

正则表达式与模式匹配

一个含有特殊意义字符的字符串称为正则表达式(模式),特殊字符称为元字符

比如说:"\\dok" 中的\\d 就是元字符,代表从0–9的任何一个数

模式匹配:

模式匹配就是检索和指定模式匹配的字符串

java中提供了指定的类;

在正则表达式中使用一堆方括号括起来的若干个字符,代表任意一个字符;

方括号嵌套方括号可以构成交并差 &&并且 ^除了 - 到

限定字符模式;

模式的逻辑或

模式匹配

的情况

10.23课堂笔记

switch语句新特性

改进1

case 1->执行语句

case 1->System.out.println(); 冒号改成箭头

必须要有default

case 1,2,3->执行语句

改进2

之前要先声明,然后再赋值改变变量大小

int b = switch(a){
	case 1,2,3-> 6;
    ...
    default-> 0;
}
int b = switch(a){
	case 1:{
		yield 1;///相当于return
	}
    default-> 0;
}

"\\s"空白字符

封装

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gF7AyfFk-1609761105609)(C:\Users\wuyan\AppData\Roaming\Typora\typora-user-images\image-20201023103147070.png)]

default:

是一种默认的权限,仅能够用同一个包的方法进行访问

protected :

可以被这个类本身、它的子类(继承得到,同一个包中的以及不同包中的子类)和同一个包中的所有其他类访问

(protected && default)跨包继承也要谨慎使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fZ5yNG7q-1609761105610)(C:\Users\wuyan\AppData\Roaming\Typora\typora-user-images\image-20201023103756916.png)]

来源:https://www.cnblogs.com/sunyubin/p/9683860.html

继承

降低冗余问题,提高了可维护性

extends 是继承的时候的关键字

例子:

class A{
	
}
public class B extens A{

}

这里B将A继承

public 为继承方式

方法的覆盖

重写override

**子类拥有与父类相同的成员的情况称为覆盖(Override

子类通过覆盖父类的成员变量和方法,可以把父类的状态和行为

改变为自身的状态和行为。

**成员变量的覆盖:**变量名相同

**成员方法的覆盖:**返回值类型、方法名、形参都相同

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VjjHf6lA-1609761105611)(C:\Users\wuyan\AppData\Roaming\Typora\typora-user-images\image-20210104193541110.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TFNCfw36-1609761105612)(C:\Users\wuyan\AppData\Roaming\Typora\typora-user-images\image-20210104193613822.png)]

通过super来实现对父类成员的访问

继承中的 is a问题:cat is a animal

A animal = new Cat();/// okay子类是父类的类型,这叫做上转型

但是 Cat cat = animal;///就不行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GA2MyHry-1609761105613)(C:\Users\wuyan\AppData\Roaming\Typora\typora-user-images\image-20210104193751708.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DLKnU5hN-1609761105614)(C:\Users\wuyan\AppData\Roaming\Typora\typora-user-images\image-20210104193817909.png)]

强制类型转换

多态

提高系统可拓展性,可以拓展新功能

是通过上转型(类型的向上转换,子类转换成父类)实现的多态

如果不能确定对象的类型,类型强制转换之前先用instanceof确定对象的类型

任务: 确定 instanceof的新用法:

instance:实例的意思, A instanceof 可以用来判断A是不是B的一个实例

在稳定的情况下实现新功能,依靠的是=>继承,上转型,方法的重写

equals方法:

判断两个基本数据类型的变量是否相等,比较两个对象的引用两个变量是否指向了相同的新变量

10.30java课堂笔记

instanceof新特性

检查对象是不是指定的类型,通常在将父类引用强制转换为子类引用的时候使用

抽象类

封装、继承、多态、抽象是JAVA四大特性,不能明确描述的要进行抽象

在某一层次,没有具体的状态,不能具体地进行描述,所以要进行初始化

为了系统的可拓展性,就要进行抽象

语法 abstract 修饰类、方法叫做抽象类,抽象方法

抽象方法的好处是多态。

抽象类除了被继承之外,没有别的用途

如果一个非抽象类是某一个抽象类的子类,他必须重写父类中所有抽象方法!!!

抽象方法只需声明,无需实现

子类对抽象方法的重写,不能降低访问权限

如何实现多态

抽象可以屏蔽一切变化

重要概念:接口

一个类可以有多个接口。接口克服了单继承的缺点。

接口不是类层次结构的一部分,接口可以看作是一种规则和约束。

一个类在继承另一个类的同时,还可以实现多个接口

声明接口 :

具体使用interface

page 113

public interface interfaceName

抽象方法当然定义格式 : returnType

接口中方法默认使用public & abstract(可以省略)

java中的implement

接口回调(接口类型的使用)

两种方法: 接口做上转型,接口做参数

接口不是类,不能进行实例化一个接口,只能实例化它的实现类

接口的默认方法(拓展方法)

主要是提供一种拓展方法

默认重写加上public,去掉default

多级继承

默认方法支持行为的多级继承

类实现的优先级别高于接口的默认实现

接口和抽象类的区别

1.抽象层次

2.建模关系

3.设计层次

尽量以interface取代abstract class

interface 可以用来构建非层次类型框架,减少因继承带来的束缚

继承与组合

优先考虑继承,然后才是组合,因为继承破坏了封装性

提倡在一个package中进行继承,跨越package的是不建议的

面型对象的程序设计原则

page 123

11.13课堂笔记

java中的异常问题:

异常的的分类:

img

好博客

RuntimeException以及Error 是非受查异常,CheckException 是受查异常

java异常处理机制

1.捕获异常

try-catch-finally

2.声明异常

throws

3.抛出异常

throw

抛出的异常必须是Throwable或者是其子类的实例才可以抛出异常

Throwable中API的用法

getMessage() && toString() 方法

异常栈轨迹

Final语句的问题

final语句中抛出的异常以及跳转语句会覆盖try中抛出的异常

避免使用final

链式异常

通过链式异常可以为异常关联另一个异常,第二个异常描述第一个异常的原因,称为引发异常或者是背后异常

带有资源的try语句(io读取文件等)

try with resources;

更加精确的抛出异常

隐匿异常对象的栈轨迹

filllnStackTrace() 方法

反射与注解

反射:

能够在运行时了解对象的一切信息,比如:父类型,方法,字段,构造方法等,还可以动态生成对象,改变权限

这种结果就是通过反射得到的

.class字节码文件

java.lang.Class;

字节码对象的创建:共三种方法

Role.calss;

对象.getClass();

Class.forName("")

class获取构造函数四个方法分两组

详解博客

在使用反射的时候,常用到的几个方法老是傻傻的分不清楚是干吗的,功能差不多的啊,
比如:

Class.getFields();
Class.getField(String);
Class.getDeclaredFields();
Class.getDeclaredField(String);
和
Class.getMethods();
Class.getMethod(String, Class[]);
Class.getDeclaredMethods();
Class.getDeclaredMethod(String, Class[]);

主要的就是有没有Declared单词的区别,
经过仔细研究有Declared单词的是获取的是某个类自己定义的成员,包括公开的,私有的,保护的等等的字段或方法,
如果没有Declared单词的一般都是获取某个类所拥有的所有公开的成员,包括自己定义的和继承下来的公开成员,如公开的字段和继承的公开的方法.

主要的就是有没有Declared单词的区别,
经过仔细研究有Declared单词的是获取的是某个类自己定义的成员,包括公开的,私有的,保护的等等的字段或方法,
如果没有Declared单词的一般都是获取某个类所拥有的所有公开的成员,包括自己定义的和继承下来的公开成员,如公开的字段和继承的公开的方法.

先获取构造函数类型,在通过构造函数获取新的对象newInstance

class…///泛型

…表示不定长

获取成员变量field

获取任意指定名字的成员

public Field getDeclaerFields();

field封装的方法

get();

getInt();

getShort();

获取数组:

数组容量动态调整

11.19 java课堂笔记

OCP原则

抽象意味着一切皆有可能

用对象组合代替继承

内部类

课本第118页

面向对象的基石:抽象 abstraction

静态内部类,非静态内部类,局部内部类,匿名内部类

内部类可以定义为:abstract public private default protected,可以加入任意的访问权限

内部类都是一个独立的类

静态内部类只能访问内部类的静态变量或者是静态方法,非静态的不能访问

可以实现顶层类的内部接口

局部内部类

在一个方法中实现,因此也叫方法内部类,不能用访问修饰符修饰

局部内部类不能从方法外访问

匿名内部类

匿名类没有名字,只能用一次,出现在表达式的一条语句中

new[类A OR 接口A()]{

}

得到的匿名类是类A的子类(可以继承A的成员或者是重写继承的方法),或者是实现接口A的类(在匿名类中实现接口的抽象方法)

内部类可以很好地实现隐藏,降低外部耦合性,更好地实现封装性

内部类拥有外围类的所有元素的访问权限

实现多重继承,单继承之后的类再继承一个内部类,就可以实现多继承的效果

避免修改接口而实现同一个类中两种同名方法的调用,用内部类去实现一个接口

函数式编程

lambda表达式

8.0提出

把函数作为参数进行传递

​ ©PushyTao

posted @ 2021-03-01 22:04  PushyTao  阅读(111)  评论(0编辑  收藏  举报