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中的异常问题:
异常的的分类:
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