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关键字创建,指向堆中的不同对象

常量池

注意常量池的存在
image

常用方法

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()返回值

线程

posted @   wxk123  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示