java基础

1. Java如何实现多态的:

继承:子类可以继承父类的属性和方法。
重写:子类可以重写父类的方法,以提供不同的实现。
向上转型:子类的对象可以被赋给父类的引用。

2. Java 中的数据类型可以分为两大类:基本数据类型和引用类型。

基本数据类型
基本数据类型是 Java 中最基本的类型,它们直接存储在内存中。Java 中有 8 种基本数据类型:
布尔类型(boolean):用于表示真或假。
字节类型(byte):用于表示 8 位整数。
短整型(short):用于表示 16 位整数。
整型(int):用于表示 32 位整数。
长整型(long):用于表示 64 位整数。
浮点型(float):用于表示 32 位浮点数。
双精度浮点型(double):用于表示 64 位浮点数。
字符型(char):用于表示 16 位 Unicode 字符。
引用类型s
引用类型是指引用对象的类型。引用类型变量不直接存储数据,而是存储指向对象的内存地址。Java 中的引用类型包括:
类类型:用于创建自定义对象。
接口类型:用于定义对象的行为。
数组类型:用于存储多个相同类型的数据。
枚举类型:用于定义一组常量。
注解类型:用于为代码添加元数据。

3. 为什么要使用包装类?

使用包装类的主要原因有以下几点:
1. 提供额外功能:包装类提供了基本数据类型没有的一些功能,例如将基本数据类型转换为字符串、比较大小等。
2. 实现类型安全:包装类可以确保数据的正确使用和类型匹配。
3. 支持面向对象编程:包装类使得基本数据类型也能够符合面向对象编程的特性。

4. String 是引用类型的原因有以下几点:

1. 提高性能:如果 String 是值类型,那么每次创建新的 String 对象时,都需要在内存中复制字符串内容。这对于频繁创建和销毁 String 对象的场景来说,会造成很大的性能损耗。而 String 是引用类型,则只需要在内存中存储一份字符串内容,多个 String 变量可以引用同一个字符串对象。
2. 节省内存:如果 String 是值类型,那么每个 String 变量都需要占用一段内存空间来存储字符串内容。这对于内存资源有限的系统来说,会造成很大的压力。而 String 是引用类型,则多个 String 变量可以引用同一个字符串对象,从而节省内存空间。
3. 方便操作:如果 String 是值类型,那么对 String 的操作会比较复杂,例如比较两个 String 对象是否相等,需要逐个字符进行比较。而 String 是引用类型,则可以直接比较两个 String 变量引用的对象是否相同。

5. 字符串拼接:

1. 使用 + 运算符
2. 使用 concat() 方法
3. 使用 StringBuilder 或 StringBuffer 类
4. 使用 StringJoiner 类
如果只是简单的字符串拼接,可以使用 + 运算符或 concat() 方法。
如果需要在循环中进行字符串拼接,可以使用 StringBuilder 或 StringBuffer 类。
如果需要将多个字符串拼接成一个以某个特定字符分隔、前后缀的字符串,可以使用 StringJoiner 类。

6. 接口和抽象类有什么共同点和区别?

共同点:都不能被实例化。都可以包含抽象方法。都可以有默认实现的方法(Java 8 可以用 default 关键字在接口中定义默认方法)。
区别:接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于代码复用,强调的是所属关系。一个类只能继承一个类,但是可以实现多个接口。接口中的成员变量只能是 public static final 类型的,不能被修改且必须有初始值,而抽象类的成员变量默认 default,可在子类中被重新定义,也可被重新赋值。

7. 什么时候用接口?

当需要定义一个只包含行为的抽象类型时,例如定义一个 Comparable 接口,用于比较对象的顺序。
当需要多继承时,例如定义一个 Animal 接口和一个 Flyable 接口,一个类可以同时实现这两个接口来表示会飞行的动物。
当需要定义一个可以被多个类实现的通用行为时,例如定义一个 Logger 接口,用于定义日志记录的行为。
当需要使用依赖注入的方式来实现依赖关系时,例如定义一个 Logger 接口,并通过依赖注入将具体的日志实现类注入到需要使用日志功能的类中。


8. 什么时候用抽象类?

当需要定义一个包含行为和结构的抽象类型时,例如定义一个 Animal 抽象类,用于定义动物的共有属性和方法。
当需要使用抽象类中的具体方法时,例如定义一个 Dog 类继承 Animal 抽象类,并重写了 eat() 方法来实现狗的吃东西的行为。
当需要定义一个类层次结构时,例如定义一个 Animal 抽象类,并定义 Dog、Cat 等具体子类来表示不同的动物。
当需要使用组合/聚合来实现类的功能时,并且需要使用抽象类中的具体方法时,例如定义一个 Car 类,并通过组合/聚合 Engine 抽象类来实现汽车的启动和行驶功能,并且需要使用 Engine 抽象类中的 start() 方法来实现汽车的启动功能。

9. 多线程的好处主要体现在以下几个方面:

提高程序的效率:多线程可以充分利用 CPU 的多核特性,同时执行多个任务,从而提高程序的整体执行效率。
提高程序的响应速度:多线程可以使程序在执行耗时任务的同时,仍然可以响应用户的操作,从而提高程序的响应速度。
提高程序的可扩展性:多线程可以方便地扩展程序的功能,只需添加新的线程即可完成新的任务。


10. 线程池是一种管理和复用线程资源的机制。与直接创建和使用线程相比,使用线程池具有以下优势:

1. 降低资源消耗
线程的创建和销毁会消耗一定的系统资源,包括 CPU 时间和内存空间。线程池可以重复利用已创建的线程,从而降低线程创建和销毁造成的资源消耗。
2. 提高响应速度
当任务到达时,线程池可以直接将其分配给已创建的线程,而无需等待线程创建。这可以提高任务的响应速度,尤其是在任务数量较多时。
3. 提高线程的可管理性
线程池可以对线程进行统一的管理,包括设置线程数量、限制线程并发数、监控线程运行状态等。这可以提高线程的可管理性,方便进行性能分析和故障排除。
4. 提供更多增强功能
线程池通常提供一些额外的功能,例如定时任务、线程池扩容等。这些功能可以满足更复杂的应用需求

11.面向对象三大特性
面向对象的三大特性是封装、继承和多态。

1. 封装
封装是指将对象的属性和方法隐藏起来,只对外暴露接口。这样可以提高代码的安全性、可维护性和可扩展性。
2. 继承
继承是指子类可以继承父类的属性和方法。这样可以减少代码冗余,提高代码的复用性。
3. 多态
多态是指同一个操作可以对不同的对象执行不同的操作。这样可以提高代码的灵活性和可扩展性。


12. 面向对象六大原则

面向对象的六大原则是单一职责原则、开放封闭原则、里氏替换原则、依赖倒置原则、接口隔离原则和迪米特法则。
1. 单一职责原则
单一职责原则规定,一个类或模块应该只负责一个职责。这样可以提高代码的内聚性,降低代码的耦合性。
2. 开放封闭原则
开放封闭原则规定,软件实体应该对扩展开放,对修改封闭。这样可以提高代码的可扩展性,降低代码的维护成本。
3. 里氏替换原则
里氏替换原则规定,子类对象可以替换父类对象。这样可以提高代码的灵活性,降低代码的耦合性。
4. 依赖倒置原则
依赖倒置原则规定,高层模块不应该依赖底层模块,两者应该通过抽象接口进行依赖。这样可以提高代码的灵活性,降低代码的耦合性。
5. 接口隔离原则
接口隔离原则规定,接口应该尽量小,只包含相关的操作。这样可以提高代码的灵活性,降低代码的耦合性。
6. 迪米特法则
迪米特法则规定,一个对象应该只与它紧密相关的对象发生交互。这样可以提高代码的内聚性,降低代码的耦合性。

13.java引用

14.java反射

1、Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。
2、Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值