引言
为了应付大作业,特地速成一哈JVAV
省略了一堆东西
估计过几天会继续写后篇,到时候再看吧。
内容包括
- 语法快速入门(这玩意和cpp大部分很像所以没咋写)
- 面向对象基础
- 杂项
- 一些核心类
- ?
声明
和cpp不同的部分
1 | int[] a = new int[5]; //数组 |
ps.
任何数组都是引用类型!
string也是!
实例化的对象也是!
这时候要判断是不是相等要用
a.equals(b)
的方法
这个时候赋值是引用类型参数绑定
感觉有点像指针。。还有那个python的原理
方法
可变参数
类似函数传入数组,用类型...
定义
1 | class Group { |
传入可以直接传入多个string
构造方法
类构造时调用的方法 构造函数
可以重载
1 | class Group { |
实例化
1 | A a = new A(); |
类的一些东西
继承
java是单继承的,用extends
关键字
1 | class B extends A{ |
经典protected
类型,令子类可以访问父类的内容
很显然,子类不应该定义和父类重名的字段,private也不行
super
super
代表了父类,super();
即父类的构造方法
实例化类的时候,会默认调用一个无参的super();
如果此时父类没有无参构造方法会报错
解决方法是手动在类构造函数上加一句父类对应的super(xxxx);
子类不会继承任何父类的构造方法
阻止继承
感觉暂时用不上
1 | public sealed class A permits B, C { |
用sealed
和permits
可以让只有指定的类才能继承该类
上/下转型
继承树object>a>b
向上:
直接用引用变量指向子类实例就行
1 | A a = new B(); |
向下:
父类类型强转到子类类型
1 | A a = new B(); |
instanceof
为操作符,判断一个东西是不是指定类型
1 | Object obj = "hello"; |
这种转型有时候我们在方法中传递形参为父类,又想调用子类的方法时,在确定了传入实参为子类后可以进行一个强转。
多态
override
首先说明方法签名:
- 方法名
- 参数列表
如果子类的一个方法方法签名和父类的完全一致,则子类会覆写父类的方法
使用@Override
修饰,编译器还会帮助检查是否为覆写而非重载
@Override
并非必须
java调用方法时根据的是对象真正的类型而不是引用的类型进行调用
多态
多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法
如果调用父类被覆写了的方法
可以使用super.方法名()
来调用
final
感觉类似const
final修饰的类无法继承,final修饰的方法不会被覆写,final修饰的变量初始化之后无法更改
抽象类
类似cpp里边的虚函数,其实就是父类单纯提供方法签名而不实现任何功能,即抽象方法的时候用的。
这样就能构成多态。
使用abstract
修饰就完了,定义了抽象方法的类也要一样地修饰,这就是抽象类
和cpp一样抽象类无法实例化
1 | abstract class Person { |
所有这些东西的主要思想其实就是呃(抄的)
- 上层代码只定义规范(例如:
abstract class Person
); - 不需要子类就可以实现业务逻辑(正常编译);
- 具体的业务逻辑由不同的子类实现,调用者并不关心。
接口
接口本质是更抽象的抽象类
如果一个抽象类没有字段,所有方法全部都是抽象方法,就可以用接口改写。
使用interface
声明,这里边的东西直接默认是public abstract
1 | interface A { |
那么我们该如何使用这玩意呢
使用implements
实现,
而且一个类可以实现多个接口
1 | class Student implements Person, Hello { // 实现了两个interface |
有关接口继承
这玩意看着好复杂…
一个interface
可以继承自另一个interface
。interface
继承自interface
使用extends
,它相当于扩展了接口的方法。
我们还可以定义default
方法,
这个相当于抽象类中有具体实现的那些方法。
这样继承这个接口的所有子类也可以直接用这个方法。
1 | interface A { |
一些杂项
静态字段
静态字段啥的跟cpp类里边的差不多,静态方法是可以直接用方法名调用,类似正常的函数,但是他显然不能访问实例的非静态字段
使用static
修饰,懂得都懂(
包
类似命名空间
Java定义了一种名字空间,称之为包:
package
。一个类总是属于某个包,类名(比如Person
)只是一个简写,真正的完整类名是包名.类名
。
位于同一个包的类,可以访问包作用域的字段和方法。不用public
、protected
、private
修饰的字段和方法就是包作用域。
import
使用import
语句,导入包中的类或者子包
在写import
的时候,可以使用*
,表示把这个包下面的所有class
都导入进来(但不包括子包的class
)
还有一种import static
的语法,它可以导入可以导入一个类的静态字段和静态方法。
作用域
感觉不用写。
一个是java支持嵌套类,内部的类也可以访问``private`
内部类
嵌套类,可以声明可以匿名
在方法内部定义一个匿名类,这玩意其实就是一个东西继承自某个父类,然后重写一下里边的方法?
1 | Runnable r = new 父类类名() { |
classpath和jar
不会
jar包相当于zip包,其实就是把编译好的一堆.class
文件打包到一起便于管理
模块
应该是依赖管理之类的,懒得看了
JAVA的一些核心类
怎么都nm4点了,写完这段歇了(
String
1 | String s = "eee"; |
首字母大写(
String
不可变
由于是引用类型,我们要用s1.equals(s2)
这种来判断是否相同
equalsIgnoreCase()
方法忽略大小写比较
一堆方法啊。。
直接抄了。
1 | // 是否包含子串: |
还要byte字符串编码啥的,这玩意我感觉需要就火速百度就完了。
StringBuilder
String可以直接用+拼接,但是效率不高。
如果要一直添加字符的话可以用这个玩意
1 | StringBuilder sb = new StringBuilder(1024); |
支持链式操作,就是说可以一直.append().append()...
之类的
还有个insert
方法,要给插入的index和内容
不过链式操作只要函数结束之后返回对象引用就行了吧(
谁叫这玩意啥都是引用
包装类型
意思就是类似int
这种基本类型用类进行了包装,可以使用引用和一些奇奇怪怪的方法。
进行一个抄
基本类型 | 对应的引用类型 |
---|---|
boolean | java.lang.Boolean |
byte | java.lang.Byte |
short | java.lang.Short |
int | java.lang.Integer |
long | java.lang.Long |
float | java.lang.Float |
double | java.lang.Double |
char | java.lang.Character |
int的转换示例
1 | int i = 100; |
很显然这个Integer.valueOf(i)
是静态方法,而且这玩意实现有优化,比new Integer(i)
效率更高,因为他返回给引用的可能是以前就已经存在的实例
当然,这些B东西都是不可更改的。。
静态方法parseInt()
可以把字符串解析成一个整数
枚举类
例如我要定义周一到周日这7天,而且我不想让这7天以外的符号和他进行操作,就可以用enum
关键字声明
1 | enum Weekday { |
我个人感觉这些其实就是抽象符号,而且拥有static final
的属性
这样就不会有类型外的值和非枚举类内的值相互比较了
因为有static
的属性,我们显然可以用==
进行比较
有方法name()
返回常量名
1 | String s = Weekday.SUN.name(); // "SUN" |
ordinal()
返回定义的常量的顺序,从0开始计数
1 | int n = Weekday.MON.ordinal(); // 1 |
既然这玩意本质是类,我们也可以在里边改写构造方法,给它加上一些值
1 | enum Weekday { |
这样我们可以访问引用的daValue
值获得信息。。
记录类
用来记录数据的不变类,写的更方便
1 | public record A(int x, int y){} |
可以改写构造方法加上判断
BigInteger
高精度,用它给你的方法就完了。
实例化的时候要用字符串
BigDecimal
和上边那个差不多呃
通过
BigDecimal
的stripTrailingZeros()
方法,可以将一个BigDecimal
格式化为一个相等的,但去掉了末尾0的BigDecimal
工具类
- Math:数学计算
- Random:生成伪随机数
- SecureRandom:生成安全的随机数
呃这个感觉没啥好说的
Math
1 | Math.abs(-100); // 100 |
Random
1 | Random r = new Random(种子); |
SecureRandom
1 | SecureRandom sr = new SecureRandom(); |
然后疯狂的用就完了
DONE!!!!!