Java 基础⼋股⽂(背诵版)
Java 基础⼋股⽂(背诵版)
Java 语⾔具有哪些特点?Java 为纯⾯向对象的语⾔。它能够直接反应现实⽣活中的对象。
具有平台⽆关性。Java 利⽤ Java 虚拟机运⾏字节码,⽆论是在 Windows、Linux 还是 MacOS 等其它平台对 Java 程序进⾏编译,编译后的程序可在其它平台运⾏。Java 为解释型语⾔,编译器把 Java 代码编译成平台⽆关的中间代码,然后在 JVM 上解释运⾏,具有很好的可移植性。Java 提供了很多内置类库。如对多线程⽀持,对⽹络通信⽀持,最重要的⼀点是提供了垃圾回收器。
Java 具有较好的安全性和健壮性。Java 提供了异常处理和垃圾回收机制,去除了 C++中难以理解的指针特性。
JDK 与 JRE 有什么区别?JDK:Java 开发⼯具包(Java Development Kit),提供了 Java 的开发环境和运⾏环境。JRE:Java 运⾏环境(Java Runtime Environment),提供了 Java 运⾏所需的环境。
JDK 包含了 JRE。如果只运⾏ Java 程序,安装 JRE 即可。要编写 Java 程序需安装 JDK.
简述 Java 基本数据类型byte: 占⽤ 1 个字节,取值范围-128 ~ 127
short: 占⽤ 2 个字节,取值范围-2 ~ 2-1
int:占⽤ 4 个字节,取值范围-2 ~ 2-1long:占⽤ 8 个字节float:占⽤ 4 个字节double:占⽤ 8 个字节char: 占⽤ 2 个字节
boolean:占⽤⼤⼩根据实现虚拟机不同有所差异
简述⾃动装箱拆箱
对于 Java 基本数据类型,均对应⼀个包装类。
装箱就是⾃动将基本数据类型转换为包装器类型,如 int->Integer
拆箱就是⾃动将包装器类型转换为基本数据类型,如 Integer->int
简述 Java 访问修饰符default: 默认访问修饰符,在同⼀包内可见private: 在同⼀类内可见,不能修饰类protected : 对同⼀包内的类和所有⼦类可见,不能修饰类
public: 对所有类可见
构造⽅法、成员变量初始化以及静态成员变量三者的初始化顺序?
先后顺序:静态成员变量、成员变量、构造⽅法。
详细的先后顺序:⽗类静态变量、⽗类静态代码块、⼦类静态变量、⼦类静态代码块、⽗类⾮静态变量、⽗类⾮静态代码块、⽗类构造函数、⼦类⾮静态变量、⼦类⾮静态代码块、⼦类构造函数。
15153131
Java 代码块执⾏顺序
⽗类静态代码块(只执⾏⼀次)
⼦类静态代码块(只执⾏⼀次)
⽗类构造代码块
⽗类构造函数
⼦类构造代码块
⼦类构造函数
普通代码块
⾯向对象的三⼤特性?
继承:对象的⼀个新类可以从现有的类中派⽣,派⽣类可以从它的基类那继承⽅法和实例变量,且派⽣类可以修改或新增新的⽅法使之更适合特殊的需求。
封装:将客观事物抽象成类,每个类可以把⾃⾝数据和⽅法只让可信的类或对象操作,对不可信的进⾏信息隐藏。
多态:允许不同类的对象对同⼀消息作出响应。不同对象调⽤相同⽅法即使参数也相同,最终表现⾏为是不⼀样的。
为什么 Java 语⾔不⽀持多重继承?
为了程序的结构能够更加清晰从⽽便于维护。假设 Java 语⾔⽀持多重继承,类 C 继承⾃类 A 和类 B,如果类 A 和 B 都有⾃定义的成员⽅法 f(),那么当代码中调⽤类 C 的 f() 会产⽣⼆义性。
Java 语⾔通过实现多个接⼝间接⽀持多重继承,接⼝由于只包含⽅法定义,不能有⽅法的实现,类 C 继承接⼝ A 与接⼝ B 时即使它们都有⽅法f(),也不能直接调⽤⽅法,需实现具体的f()⽅法才能调⽤,不会产⽣⼆义性。
多重继承会使类型转换、构造⽅法的调⽤顺序变得复杂,会影响到性能。
简述 Java 的多态
Java 多态可以分为编译时多态和运⾏时多态。
编译时多态主要指⽅法的重载,即通过参数列表的不同来区分不同的⽅法。
运⾏时多态主要指继承⽗类和实现接⼝时,可使⽤⽗类引⽤指向⼦类对象。
运⾏时多态的实现:主要依靠⽅法表,⽅法表中最先存放的是 Object 类的⽅法,接下来是该类的⽗类的⽅法,最后是该类本⾝的⽅法。如果⼦类改写了⽗类的⽅法,那么⼦类和⽗类的那些同名⽅法共享⼀个⽅法表项,都被认作是⽗类的⽅法。因此可以实现运⾏时多态。
Java 提供的多态机制?
Java 提供了两种⽤于多态的机制,分别是重载与覆盖。
重载:重载是指同⼀个类中有多个同名的⽅法,但这些⽅法有不同的参数,在编译期间就可以确定调⽤哪个⽅法。
覆盖:覆盖是指派⽣类重写基类的⽅法,使⽤基类指向其⼦类的实例对象,或接⼝的引⽤变量指向其
实现类的实例对象,在程序调⽤的运⾏期根据引⽤变量所指的具体实例对象调⽤正在运⾏的那个对象的⽅法,即需要到运⾏期才能确定调⽤哪个⽅法。
重载与覆盖的区别?
覆盖是⽗类与⼦类之间的关系,是垂直关系;重载是同⼀类中⽅法之间的关系,是⽔平关系。
覆盖只能由⼀个⽅法或⼀对⽅法产⽣关系;重载是多个⽅法之间的关系。
覆盖要求参数列表相同;重载要求参数列表不同。
覆盖中,调⽤⽅法体是根据对象的类型来决定的,⽽重载是根据调⽤时实参表与形参表来对应选择⽅法体。
重载⽅法可以改变返回值的类型,覆盖⽅法不能改变返回值的类型。
接⼝和抽象类的相同点和不同点?
相同点:
都不能被实例化。
接⼝的实现类或抽象类的⼦类需实现接⼝或抽象类中相应的⽅法才能被实例化。
不同点:
接⼝只能有⽅法定义,不能有⽅法的实现,⽽抽象类可以有⽅法的定义与实现。
实现接⼝的关键字为 implements,继承抽象类的关键字为 extends。⼀个类可以实现多个接⼝,只能继承⼀个抽象类。
当⼦类和⽗类之间存在逻辑上的层次结构,推荐使⽤抽象类,有利于功能的累积。当功能不需要,希望⽀持差别较⼤的两个或更多对象间的特定交互⾏为,推荐使⽤接⼝。使⽤接⼝能降低软件系统的耦合度,便于⽇后维护或添加删除⽅法。
简述抽象类与接⼝的区别
抽象类:体现的是 is-a 的关系,如对于 man is a person,就可以将 person 定义为抽象类。
接⼝:体现的是 can 的关系。是作为模板实现的。如设置接⼝ fly,plane 类和 bird 类均可实现该接⼝。
⼀个类只能继承⼀个抽象类,但可以实现多个接⼝。
简述内部类及其作⽤
成员内部类:作为成员对象的内部类。可以访问 private 及以上外部类的属性和⽅法。外部类想要访问内部类属性或⽅法时,必须要创建⼀个内部类对象,然后通过该对象访问内部类的属性或⽅法。外部类也可访问 private 修饰的内部类属性。
局部内部类:存在于⽅法中的内部类。访问权限类似局部变量,只能访问外部类的 final 变量。
匿名内部类:只能使⽤⼀次,没有类名,只能访问外部类的 final 变量。
静态内部类:类似类的静态成员变量。
Java 语⾔中关键字 static 的作⽤是什么?
static 的主要作⽤有两个:
为某种特定数据类型或对象分配与创建对象个数⽆关的单⼀的存储空间。
使得某个⽅法或属性与类⽽不是对象关联在⼀起,即在不创建对象的情况下可通过类直接调⽤⽅法或使⽤类的属性。
具体⽽⾔ static ⼜可分为 4 种使⽤⽅式:
修饰成员变量。⽤ static 关键字修饰的静态变量在内存中只有⼀个副本。只要静态变量所在的类被加载,这个静态变量就会被分配空间,可以使⽤“类.静态变量”和“对象.静态变量”的⽅法使⽤。
修饰成员⽅法。static 修饰的⽅法⽆需创建对象就可以被调⽤。static ⽅法中不能使⽤ this 和 super 关键字,不能调⽤⾮ static ⽅法,只能访问所属类的静态成员变量和静态成员⽅法。
修饰代码块。JVM 在加载类的时候会执⾏ static 代码块。static 代码块常⽤于初始化静态变量。static 代码块只会被执⾏⼀次。
修饰内部类。static 内部类可以不依赖外部类实例对象⽽被实例化。静态内部类不能与外部类有相同的名字,不能访问普通成员变量,只能访问外部类中的静态成员和静态成员⽅法。
为什么要把 String 设计为不可变?
节省空间:字符串常量存储在 JVM 的字符串池中可以被⽤户共享。
提⾼效率:String 可以被不同线程共享,是线程安全的。在涉及多线程操作中不需要同步操作。
java重写和重载的区别
安全:String 常被⽤于⽤户名、密码、⽂件名等使⽤,由于其不可变,可避免⿊客⾏为对其恶意修改。
简述 String/StringBuffer 与 StringBuilder
String 类采⽤利⽤ final 修饰的字符数组进⾏字符串保存,因此不可变。如果对 String 类型对象修改,需要新建对象,将⽼字符和新增加的字符⼀并存进去。
StringBuilder,采⽤⽆ final 修饰的字符数组进⾏保存,因此可变。但线程不安全。
StringBuffer,采⽤⽆ final 修饰的字符数组进⾏保存,可理解为实现线程安全的 StringBuilder。
判等运算符==与 equals 的区别?
== ⽐较的是引⽤,equals ⽐较的是内容。
如果变量是基础数据类型,== ⽤于⽐较其对应值是否相等。如果变量指向的是对象,== ⽤于⽐较两个对象是否指向同⼀块存储空间。
equals 是 Object 类提供的⽅法之⼀,每个 Java 类都继承⾃ Object 类,所以每个对象都具有 equals
这个⽅法。Object 类中定义的equals ⽅法内部是直接调⽤ == ⽐较对象的。但通过覆盖的⽅法可以让它不是⽐较引⽤⽽是⽐较数据内容。
简述 Object 类常⽤⽅法
hashCode:通过对象计算出的散列码。⽤于 map 型或 equals ⽅法。需要保证同⼀个对象多次调⽤该⽅法,总返回相同的整型值。
equals:判断两个对象是否⼀致。需保证 equals ⽅法相同对应的对象 hashCode 也相同。
toString: ⽤字符串表⽰该对象
clone:深拷贝⼀个对象
Java 中⼀维数组和⼆维数组的声明⽅式?
⼀维数组的声明⽅式:
type arrayName[]
type[] arrayName
⼆维数组的声明⽅式:
type arrayName[][]
type[][] arrayName
type[] arrayName[]
其中 type 为基本数据类型或类,arrayName 为数组名字
简述 Java 异常的分类
Java 异常分为 Error(程序⽆法处理的错误),和 Exception(程序本⾝可以处理的异常)。这两个类均继承 Throwable。
Error 常见的有 StackOverFlowError、OutOfMemoryError 等等。
Exception 可分为运⾏时异常和⾮运⾏时异常。对于运⾏时异常,可以利⽤ try catch 的⽅式进⾏处理,也可以不处理。对于⾮运⾏时异常,必须处理,不处理的话程序⽆法通过编译。
简述 throw 与 throws 的区别
throw ⼀般是⽤在⽅法体的内部,由开发者定义当程序语句出现问题后主动抛出⼀个异常。
throws ⼀般⽤于⽅法声明上,代表该⽅法可能会抛出的异常列表。
出现在 Java 程序中的 finally 代码块是否⼀定会执⾏?
当遇到下⾯情况不会执⾏。
当程序在进⼊ try 语句块之前就出现异常时会直接结束。
当程序在 try 块中强制退出时,如使⽤ it(0),也不会执⾏ finally 块中的代码。
其它情况下,在 try/catch/finally 语句执⾏的时候,try 块先执⾏,当有异常发⽣,catch 和 finally 进⾏处理后程序就结束了,当没有异常发⽣,在执⾏完 finally 中的代码后,后⾯代码会继续执⾏。值得注意的是,当 try/catch 语句块中有 return 时,finally 语句块中的代码会在 return 之前执⾏。如果 try/catch/finally 块中都有 return 语句,finally 块中的 return 语句会覆盖 try/catch 模块中的 return 语句。
final、finally 和 finalize 的区别是什么?
final ⽤于声明属性、⽅法和类,分别表⽰属性不可变、⽅法不可覆盖、类不可继承。
finally 作为异常处理的⼀部分,只能在 try/catch 语句中使⽤,finally 附带⼀个语句块⽤来表⽰这个语句最终⼀定被执⾏,经常被⽤在需要释放资源的情况下。
finalize 是 Object 类的⼀个⽅法,在垃圾收集器执⾏的时候会调⽤被回收对象的 finalize()⽅法。当垃圾回收器准备好释放对象占⽤空间时,⾸先会调⽤ finalize()⽅法,并在下⼀次垃圾回收动作发⽣时真正回收对象占⽤的内存。
简述泛型
泛型,即“参数化类型”,解决不确定对象具体类型的问题。在编译阶段有效。在泛型使⽤过程中,操作的数据类型被指定为⼀个参数,这种参数类型在类中称为泛型类、接⼝中称为泛型接⼝和⽅法中称为泛型⽅法。
简述泛型擦除
Java 编译器⽣成的字节码是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程被称为泛型擦除。
简述注解
Java 注解⽤于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执⾏,但也有⼀些类型的注解实际上可以⽤于这⼀⽬的。其可以⽤于提供信息给编译器,在编译阶段时给软件提供信息进⾏相关的处理,在运⾏时处理写相应代码,做对应操作。
简述元注解
元注解可以理解为注解的注解,即在注解中使⽤,实现想要的功能。其具体分为:
@Retention: 表⽰注解存在阶段是保留在源码,还是在字节码(类加载)或者运⾏期(JVM 中运⾏)。
@Target:表⽰注解作⽤的范围。
@Documented:将注解中的元素包含到 Javadoc 中去。
@Inherited:⼀个被@Inherited 注解了的注解修饰了⼀个⽗类,如果他的⼦类没有被其他注解修饰,则它的⼦类也继承了⽗类的注解。
@Repeatable:被这个元注解修饰的注解可以同时作⽤⼀个对象多次,但是每次作⽤注解⼜可以代表不同的含义。
简述 Java 中 Class 对象
java 中对象可以分为实例对象和 Class 对象,每⼀个类都有⼀个 Class 对象,其包含了与该类有关的信息。
获取 Class 对象的⽅法:
Class.forName(“类的全限定名”)
实例对象.getClass()
类名.class
Java 反射机制是什么?
Java 反射机制是指在程序的运⾏过程中可以构造任意⼀个类的对象、获取任意⼀个类的成员变量和成员⽅法、获取任意⼀个对象所属的类信息、调⽤任意⼀个对象的属性和⽅法。反射机制使得 Java 具有动态获取程序信息和动态调⽤对象⽅法的能⼒。可以通过以下类调⽤反射API。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论