牛客刷题
类的加载顺序:
- 父类静态对象和静态代码块
- 子类静态对象和静态代码块
- 父类非静态对象和非静态代码块
- 父类构造函数
- 子类非静态对象和非静态代码块
- 子类构造函数
public class Main extends Son{
static { System.out.println("Main1"); }
Obj obj = new Obj();
static SObj sObj = new SObj();
public Main(){ System.out.println("MainCon1"); }
public static void main(String[] args){ Main main = new Main(); }
static { System.out.println("Main2"); }
}
class SObj{
public SObj(){ System.out.println("SObj"); }
}
class Obj{
public Obj(){ System.out.println("Obj"); }
}
class Son{
public Son(){ System.out.println("SonCon1"); }
static{ System.out.println("Son1"); }
static{ System.out.println("Son2"); }
}
上面这块代码最终的输出结果:
- Son1 // 父类静态代码块
- Son2 // 父类静态代码块
- Main1 // 子类静态代码块
- SObj // 子类静态对象
- Main2 // 子类静态代码块
- SonCon1 // 父类构造函数
- Obj // 子类非静态对象
- MainCon1 // 子类构造函数
对象序列化:
- 使用ObjectOutputStream和ObjectInputStream可以将对象进行传输
- 声明为static和transient类型的成员数据不能被串行化,因为static代表类的状态,transient代表对象的临时数据
接口和抽象类区别:
- 关键字:接口使用的是interface,抽象类使用的是abstract
- 继承或实现:接口是实现implement,抽象类是extends
- 子类扩展数量不同:接口可以实现多个,抽象类只能继承一个
- 属性访问控制符不同:接口的属性只能是public static final,抽象类可以使用任意控制符
- 方法控制符不同:接口默认是public abstract,不能是其他,抽象类可以使用任意控制符
- 方法实现不同:接口中的普通方法不能有具体实现,static或default修饰的必须有方法实现,抽象类的非抽象方法可以有实现,抽象方法不能有实现
- 静态代码块使用:接口不能有静态代码块,抽象类可以有静态代码块
接口里边的变量默认都是public static final的,相当于全局变量,可以直接省略修饰符
线程中run和start方法区别:
- 实例.run()执行是将线程的run方法作为普通方法进行调用,不会采用多线程的方式,代码是按照顺序执行的
- 实例.start()方法会启动多线程,然后分别执行不同的流程(所以启动多线程记得使用start)
流和文件IO:
- FileOutputStream和FileInputStream用来读写文件
- FileWriter和FileReader用来按字符读写文件数据
- File类实现文件的删除、创建等操作
基本类型、包装类型:
- 包装类和基本类型是不同的概念
- long和double都占用了64位存储空间
- 默认的浮点类型是double,如果要指明使用float,需要在后面添加f
- 基本数据类型没有静态方法,但是基本类型的包装类型有静态方法
static和final
- static修饰的成员方法只能访问类变量,不能访问成员变量
- final修饰的成员方法不能被重写
HashMap:
- HashMap中,不能通过
get(key)==null
判断Hashmap中是否包含这个key,因为hashmap支持null作为键,所以会产生歧义,应该使用map.containsKey(key)
判断是否存在这个key
类变量和成员变量:
- 类变量在不设置初始值时,会进行默认值赋值,而局部方法中声明的变量必须进行初始化,不会进行默认值赋值
- 成员变量是不会被赋初始值的
构造函数调用:
- 在类的内部可以使用this()方式调用构造方法
- 在类的子类中可以使用super()方式调用父类指定的构造方法
- 在反射中可以使用newInstance()调用构造方法
方法的调用,对象的回收:
public class Test{
public static class A{
private B ref;
public void setB(B b){
ref = b;
}
}
public static Class B{
private A ref;
public void setA(A a){
ref = a;
}
}
public static void main(String args[]){
start();
}
public static void start(){
A a = new A();
B b = new B();
b = null;
a = null;
}
}
final、finally、finalize
- finally不执行的情况
- 代码流程没有进入try语句块
- 使用了System.exit(0)退出程序
- 程序所在线程死亡
- 其他非正常退出情况
标识符命名规则
- 只允许大小写字母、数字、_、$
- 数字不可以开头
- 不可以使用关键字(Java区分大小写,比如不可以使用void,但是可以使用Void命名)
关于向上和向下取整的问题:
- Math.floor()方法可以将当前浮点数向下取整,返回值为double类型
- Math.ceil()可以将当前浮点数向上取整,返回值为double类型
- Math.round()可以对当前进行四舍五入计算,返回值为int类型
浮点数精度问题:
- Float类和Double类的equals()都被重写了,同类判等值就是true,不同类判等值就是false
类之间存在的一些关系:
- USES-A:依赖关系,A类中会用到B类,具体就是在A类中的方法参数包含B
- HAS-A:聚合关系,是关联关系的一种特例,比如鸟群和鸟的关系
- IS-A:表示继承关系,父类与子类
- 关联关系:A类会用到B类,是一种强依赖,比如A类中的成员变量含有B类
Java中的取余和取模操作:
- 取余操作(%),结果的符号和被取余的数符号是相同的
- 取模操作(Math.floorMod),结构的符号和取模的数符号是相同的
Java中的内置工具:
- java:java虚拟机
- javadoc:制作java文档
- jdb:java的调试器
- javaprof:剖析工具
内部类和外部类:
- 外部类可以使用public、final、abstract进行修饰,不能使用static
- 内部类可以使用static修饰,还有静态代码块、静态成员、静态方法都可以使用static
- 成员内部类、静态内部类可以拥有四种访问修饰符和属性,局部内部类和匿名内部类相当于局部变量
数组定义相关:
- 定义一维数组时,必须显式指明数组长度
- 定义多维数组时,其一维数组长度必须指明,其他维数组长度可以稍后指定
- 采用给定值初始化数组时,不必指明长度
- "[]" 是数组运算符的意思,在声明一个数组时,数组运算符可以放在数据类型和变量之间,也可以放在变量后面
字符串判等问题:
- 常量池和堆空间的判断。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫