标签:没有 直接 class java语言 维护 抽象类 方式 splay 继承
1 面向对象和面向过程的区别
面向过程:
优点:性能高。直接编译。
适用:单片机、嵌入式开发、Linux/Unix
面向对象:
特点:封装、继承、多态
优点:易维护、易复用、易扩展、可移植(数据类型、跨平台)
缺点:性能低。调用类时需要实例化、开销大、消耗资源。其次是半编译语言,最终的执行代码并不是可以被直接被CPU执行的二进制机械码。
2 java语言的特点
a. 面向对象(封装、继承、多态)
b. 平台无关性:由JVM实现,“一次编译,随处运行”
c. 支持多线程、网络编程等功能;
d. 编译和解释并行:解释是运行时翻译成机器代码
解释:JVM类加载器加载字节码文件,通过解释器逐行解释执行,执行速度较慢。
编译:有些代码块和方法经常被调用(热点代码)。
JIT(Just In Time)编译器属于运行时编译。第一次编译后,会将字节码对应的机器代码保存下来,下次可以直接使用。执行效率高。编译的是热点代码。
3 JVM、JDK、JRE
JVM是运行java字节码(.class文件)的虚拟机。实现跨平台。
JDK:java开发工具。可以创建和编译程序。
JRE:java运行时环境。
4 Java和C++的区别
共同:都是面向对象的语言
访问内存:c++支持指针访问内存
继承:c++类可以多继承,java类不可以,java接口可以多继承。
内存管理:c++需要手动释放无用内存;java有自动内存管理机制。
5 字符常量和字符串常量的区别
6 基本类型
7 重载overload和重写override
重载:
发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。
允许重载任何方法,包括构造器方法。构造方法默认不带参数(子类初始化)。
重写:
重写是子类对父类的允许访问的方法的实现过程进行重新编写,发生在子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。另外,如果父类方法访问修饰符为 private 则子类就不能重写该方法。也就是说方法提供的行为改变,而方法的外貌并没有改变。
8 面向对象编程三大特性
封装:
封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法。
继承:
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码。
多态:
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
在 Java 中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。
9 String、StringBuffer、StringBuilder
可变与不可变:
String不可变:String 类中使用 final 关键字修饰字符数组来保存字符串
private final char value[]
剩余2个可变:都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串char[]value
但是没有用 final 关键字修饰
线程安全:
String安全:对象不可变,常量
StringBuffer安全: 对方法加了同步锁或者对调用的方法加了同步锁
StringBuilder不安全:对象可变,没有同步锁。
性能:
String低:每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。
StringBuffer中:每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。
StringBuilder好:相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
总结:
10 自动装箱和拆箱
11 接口和抽象
方法:接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),而抽象类可以有非抽象的方法。
属性:接口中除了 static、final 变量,不能有其他变量,而抽象类中则不一定。
继承和实现:一个类可以实现多个接口,但只能实现一个抽象类。接口自己本身可以通过 extends 关键字扩展多个接口。
修饰符:接口方法默认修饰符是 public,抽象方法可以有 public、protected 和 default 这些修饰符(抽象方法就是为了被重写所以不能使用 private 关键字修饰!)。
设计:从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。
jdk8:接口方法可以有默认实现;接口也可以定义静态方法,可以直接用接口名调用。实现类和实现是不可以调用的。如果同时实现两个接口,接口中定义了一样的默认方法,则必须重写,不然会报错;
jdk9:接口被允许定义私有方法、私有静态方法。
12 成员变量与局部变量的区别
static
修饰的,那么这个成员变量是属于类的,如果没有使用static
修饰,这个成员变量是属于实例的。而对象存在于堆内存,局部变量则存在于栈内存。13 静态方法和实例方法
在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。
14 ==和equals区别
== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
15 hashCode()和equals
hashCode()
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在 JDK 的 Object.java 中,这就意味着 Java 中的任何类都包含有 hashCode() 函数。
散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)
意义:
我们先以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode: 当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与该位置其他已经加入的对象的 hashcode 值作比较,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()
方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。
(对象)重写equals时必须重写hashCode:
16 final关键字
17 异常处理
在 Java 中,所有的异常都有一个共同的祖先 java.lang 包中的 Throwable 类。Throwable: 有两个重要的子类:Exception(异常) 和 Error(错误) ,二者都是 Java 异常处理的重要子类,各自都包含大量子类。
Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java 虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。
这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如 Java 虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java 中,错误通过 Error 的子类描述。
Exception(异常):是程序本身可以处理的异常。Exception 类有一个重要的子类 RuntimeException。RuntimeException 异常由 Java 虚拟机抛出。NullPointerException(要访问的变量没有引用任何对象时,抛出该异常)、ArithmeticException(算术运算异常,一个整数除以 0 时,抛出该异常)和 ArrayIndexOutOfBoundsException (下标越界异常)。
注意:异常和错误的区别:异常能被程序本身处理,错误是无法处理。
异常处理:
在以下 4 种特殊情况下,finally 块不会被执行:
18 IO流
Java IO 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。
按操作方式分类图: 按操作对象分类图:
不管是文件读写还是网络发送接收,信息的最小存储单元都是字节,那为什么 I/O 流操作要分为字节流操作和字符流操作呢?
字符流是由 Java 虚拟机将字节转换得到的,问题就出在这个过程还算是非常耗时,并且,如果我们不知道编码类型就很容易出现乱码问题。所以, I/O 流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好。
19 深拷贝和浅拷贝
标签:没有 直接 class java语言 维护 抽象类 方式 splay 继承
原文地址:https://www.cnblogs.com/Z-D-/p/12391279.html