牛客刷题

1.题目链接

类的加载顺序:

  • 父类静态对象和静态代码块
  • 子类静态对象和静态代码块
  • 父类非静态对象和非静态代码块
  • 父类构造函数
  • 子类非静态对象和非静态代码块
  • 子类构造函数
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 // 子类构造函数

2.题目链接

对象序列化:

  • 使用ObjectOutputStream和ObjectInputStream可以将对象进行传输
  • 声明为static和transient类型的成员数据不能被串行化,因为static代表类的状态,transient代表对象的临时数据

3.题目链接

接口和抽象类区别:

  • 关键字:接口使用的是interface,抽象类使用的是abstract
  • 继承或实现:接口是实现implement,抽象类是extends
  • 子类扩展数量不同:接口可以实现多个,抽象类只能继承一个
  • 属性访问控制符不同:接口的属性只能是public static final,抽象类可以使用任意控制符
  • 方法控制符不同:接口默认是public abstract,不能是其他,抽象类可以使用任意控制符
  • 方法实现不同:接口中的普通方法不能有具体实现,static或default修饰的必须有方法实现,抽象类的非抽象方法可以有实现,抽象方法不能有实现
  • 静态代码块使用:接口不能有静态代码块,抽象类可以有静态代码块

接口里边的变量默认都是public static final的,相当于全局变量,可以直接省略修饰符

4.题目链接

线程中run和start方法区别:

  • 实例.run()执行是将线程的run方法作为普通方法进行调用,不会采用多线程的方式,代码是按照顺序执行的
  • 实例.start()方法会启动多线程,然后分别执行不同的流程(所以启动多线程记得使用start)

5.题目链接

流和文件IO:

  • FileOutputStream和FileInputStream用来读写文件
  • FileWriter和FileReader用来按字符读写文件数据
  • File类实现文件的删除、创建等操作

6.题目链接

基本类型、包装类型:

  • 包装类和基本类型是不同的概念
  • long和double都占用了64位存储空间
  • 默认的浮点类型是double,如果要指明使用float,需要在后面添加f
  • 基本数据类型没有静态方法,但是基本类型的包装类型有静态方法

7.题目链接

static和final

  • static修饰的成员方法只能访问类变量,不能访问成员变量
  • final修饰的成员方法不能被重写

8.题目链接

HashMap:

  • HashMap中,不能通过get(key)==null判断Hashmap中是否包含这个key,因为hashmap支持null作为键,所以会产生歧义,应该使用map.containsKey(key)判断是否存在这个key

9.题目链接

类变量和成员变量:

  • 类变量在不设置初始值时,会进行默认值赋值,而局部方法中声明的变量必须进行初始化,不会进行默认值赋值
  • 成员变量是不会被赋初始值的

10.题目链接

构造函数调用:

  • 在类的内部可以使用this()方式调用构造方法
  • 在类的子类中可以使用super()方式调用父类指定的构造方法
  • 在反射中可以使用newInstance()调用构造方法

11.题目链接

方法的调用,对象的回收:

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)退出程序
    • 程序所在线程死亡
    • 其他非正常退出情况

12.题目链接

标识符命名规则

  • 只允许大小写字母、数字、_、$
  • 数字不可以开头
  • 不可以使用关键字(Java区分大小写,比如不可以使用void,但是可以使用Void命名)

13.题目链接

关于向上和向下取整的问题:

  • Math.floor()方法可以将当前浮点数向下取整,返回值为double类型
  • Math.ceil()可以将当前浮点数向上取整,返回值为double类型
  • Math.round()可以对当前进行四舍五入计算,返回值为int类型

14.题目链接

浮点数精度问题:

  • Float类和Double类的equals()都被重写了,同类判等值就是true,不同类判等值就是false

15.题目链接

类之间存在的一些关系:

  • USES-A:依赖关系,A类中会用到B类,具体就是在A类中的方法参数包含B
  • HAS-A:聚合关系,是关联关系的一种特例,比如鸟群和鸟的关系
  • IS-A:表示继承关系,父类与子类
  • 关联关系:A类会用到B类,是一种强依赖,比如A类中的成员变量含有B类

16.题目链接

Java中的取余和取模操作:

  • 取余操作(%),结果的符号和被取余的数符号是相同的
  • 取模操作(Math.floorMod),结构的符号和取模的数符号是相同的

17.题目链接

Java中的内置工具:

  • java:java虚拟机
  • javadoc:制作java文档
  • jdb:java的调试器
  • javaprof:剖析工具

18.题目链接

内部类和外部类:

  • 外部类可以使用public、final、abstract进行修饰,不能使用static
  • 内部类可以使用static修饰,还有静态代码块、静态成员、静态方法都可以使用static
  • 成员内部类、静态内部类可以拥有四种访问修饰符和属性,局部内部类和匿名内部类相当于局部变量

19.题目链接

数组定义相关:

  • 定义一维数组时,必须显式指明数组长度
  • 定义多维数组时,其一维数组长度必须指明,其他维数组长度可以稍后指定
  • 采用给定值初始化数组时,不必指明长度
  • "[]" 是数组运算符的意思,在声明一个数组时,数组运算符可以放在数据类型和变量之间,也可以放在变量后面

20.题目链接

字符串判等问题:

  • 常量池和堆空间的判断。。。
posted @   种树达人  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
点击右上角即可分享
微信分享提示