Java
shift+F6批量修改
Long 类型要加L作为后缀.long n=99999999L;
基本类型没有String. byte -128-127
new的都在堆上
杂记
1.String
String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");
System.out.println(s1 == s2); // true,因为s1和s2指向常量池中相同的对象
System.out.println(s1 == s3); // false,因为s3通过new关键字创建,指向堆中的不同对象
常量池
注意常量池的存在
常用方法
charAt(int)
concat(String)
indexOf(String) 第一个出现的下标,没有就-1
indexOf(String,int) 第一个出现的下标,没有就-1,从int开始找
substring(int begin,int end)截取[begin,end).不填end就到尾
toLowerCase() toUpperCase()
split(String)用String作为分隔符切割出一个数组,注意如果符在开头或结尾可以切出空的来
trim()去掉前后空格
对String的理解
*String是不可变的,任何看似修改String的值其实都是创建了新的对象!
因此不能经常进行拼接,因为每次拼接都会增加垃圾!考虑"a"+"b"+"C"
StringBuilder
其代表一个可变的字符串。长度默认16,可以自动扩增,可以指定长度
append(String)追加字符串,比String快80%
insert(String,int)插在int前面
StringBuilder没重写equals()!
toString()
正则表达式
这部分从量词开始重新听
1.
2.replaceAll()
3.split(String)
\d 0-9
\D
\s \t、\n、\r等空白符
\S
\w 0-9,a-z,A-Z,下划线
\W
. 任意
例子:
c\wt:匹配cat,c_t,cmt等
[aeiou] a、e、i、o、u
[a-fx-z]a-f或者x-z的字符
[^abc]匹配除a、b、c之外的字符
[a-e&&[dfg]]匹配a-e与d、f、g的交集,即只能匹配d
量词
Pattern与Matcher
注意
\本身是转义,正则用\,本身用\(因为正则本身也把反斜杠当做转义)
2.包装类
Boolean/Character/Byte/Short/Integer/Long/Float/Double
变Interger:valueOf(int)/valueOf(String)
Integer -> int : intValue()
注意编辑器对于用加法连接的常量,会把它编译优化为新的常量。(这里ppt里面四个str讲的很明白)而如果str4 = str3 +"a";str4会位于堆内存而非常量池中
3.重载overload和重写Override
静态 static
改一个则所有对象都会改.
static 的东西跟着类变,先于对象的创建。对于一个类所建的实例,它的静态变量和其他变量并不存在同一个地方,尽管都在堆上.
上课讲的:static在方法区(栈)中???,而对象在堆区中
静态方法常见于工具类中,其用于做事而非描述事物.描述事物用javabean类。
工具类
工具类的构造函数要私有,从而使得外界不能创建对象.(如arrUtil等创建没有意义)同时,静态方法可以直接用类名访问(if public)
7.4.3 SimpleDataFormat
SimpleDataFormat sdf = new SimpleDataFormat("yyyy-MM-dd")
Data date = sdf.parse("2016-8-5")
字符串
字符串创建后不能被改变
字符串用==比较比的是地址,
static
1.静态方法只能访问静态变量和静态方法
String 可以以字符数组为参数进行构造
StringBuilder可以用append添加,reverse反转,toString变String,length求长度
重写方法
继承
子类的构造方法在执行前调用父类的无参构造
不同包尽可以访问public类的public对象
对象:
1.数据成员
2.方法
this()调用本类其他构造方法
注意数组分配的地址和数组元素的分配地址的区别!
Class [] classList = new Class[classNum];
for(int i=0;i<classNum;i++){
** classList[i] = new Class();**
System.out.print(i+".\nname:");
classList[i].className = input.next();
System.out.print("hour: ");
classList[i].classHour = input.nextInt();
}
继承
this和super不能出现在static方法中
父类的protected成员包内可见且对子类可见
如果子类和父类不在同一包中,子类.....(这个问题略复杂)
子类只能通过父类提供的非private方法来访问父类的private成员
一般将所有成员private,所有方法public或protected;基类的方法在子类中可以修改
如果要override,覆盖的返回值和名称和参数数量和类型必须一样
重写方法时方法的访问权限可以扩大!
深复制和浅复制:
浅复制只复制引用本身,不复制引用指向的对象
继承的构造函数
先显式或隐式地调用父类的构造函数,所以第一个被调用的构造函数是Object的
父类应该至少定义一个无参的构造函数
如果你没有显式地调用super(),子类的构造函数会隐式地调用父类的无参构造函数,但这仅限于在父类中存在无参构造函数的情况。如果父类没有无参构造函数,而只有带参数的构造函数,那么子类的构造函数必须显式地调用父类的构造函数,并传递合适的参数。
final
修饰类时类不能被继承
修饰方法该方法不能被重写
修饰变量变量只能赋值一次
如java.lang.String()和java.lang.Math()就是final
6 多态性
animal x = new bird();//将子类对象赋值给父类引用,不需要强制转化,但是只能调用父类中已有的方法
//!!如果子类覆盖了父类的方法,那此时如果还如此赋值,调用的是子类*重写后的方法*
任何类型的对象都可以赋值给Object引用!
将子类对象赋值给父类引用,不需要强制转化,但是只能调用父类中已有的方法
如果子类重写了父类的方法,那此时如果还如此赋值,调用的是子类重写后的方法
多态三要素:继承、向上转型、对父类方法重写
JVM:编译器先进行静态绑定:找出可能的候选方法,如果参数类型和个数完全匹配则调用重载解析。
如果是private / static / final则直接静态绑定,否则运行时动态绑定
向下转型:必须强制,必须在有意义情况下做,编译器对于所有强制转换一律放行
编译器不会对如下代码报错:
Bird x = (Bird) xxx;
instanceof检测的不是对象的类型,而是对象的构造函数,根据其构造函数看是不是与运算符右侧的类构成相同或子类关系.
//一些例子
6.2.3开闭原则
对修改封闭,对扩展开放。这使得扩展时无需修改现有代码
(这部分需重听,大概四十分钟处)
接口是特出的抽象类
interface标识
所有属性都是公开静态变量。默认属性为public static final,必须赋值
接口没有构造方法,而抽象类有默认的空参构造
接口中不能有方法的实现,应如"void fun();"这么写
实现接口必须public
一个类可以实现多个接口
一个接口可以继承自多个接口
实现一个接口就要实现所有方法
//A,B是个类
class A extends B implements C,D,E {
}
//A是个接口,B,C是个接口
class A extends B,C {
}
抽奖类和接口
抽象类可以有非常量的数据成员,可以有非抽象的方法,也有构造方法(尽管不能创建实例)
抽象类的非抽象方法可以定义对象的默认行为方式,而接口中的方法永远只有一个躯壳
抽象类和子类是is a的关系,而接口和子类是like a的关系,更像一个契约
描述行为模型应该总是用接口
抽象类方法默认abstract public
最后十分钟有关IMobileStorage的内容
有个细节:虽然抽象类和接口不能创建实例,即不能new,但是可以作为成员变量存在,也可以通过子类向上转型得到并作为参数传给函数
集合框架
底层是两个接口Collection和Map
List有序集合,记录顺序
Set无序集合 ,不可重复,不记录顺序
Map键值对集合,每个元素由key和value构成,key、value分别存储,key无序,value有序
用Iterator遍历
Collection c = new ArrayList();
Iterator it = sth.iterator();
while(it.hasNext()){
it.next()
}
//
for(Object element:c){
}
异常处理
异常的分类?
受检查异常
try中写可能出现(一个或多个)异常的代码,后跟catch表示捕获到对应类型的异常后的行为
catch 中声明的对象可以调用方法如:
getMEssage()
printStackTrace()
catch 可以用|对多个异常采用相同处理
finally总会被执行(如果try中出现了return,catch不执行但是finally执行)
抛出异常
子类如果抛出异常,那同一个方法(重写的)子类不能抛出比父类宽泛的异常
方法如果需要抛出异常,需要用throws声明
自行抛出异常使用throw语句,执行后后面语句都不执行
自定义异常
继承父类Exception
需要无参和带String的构造方法,传给父类的同一个构造函数(super(String))作为其getMessage()返回值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端