⾯向对象和⾯向过程对比
- ⾯向过程 :性能高。 因为类调⽤时需要实例化,⽐较消耗资源。
- ⾯向对象 :性能较低,易维护、易复⽤、易扩展。 因为⾯向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统。
Java 特点
- 简单易学
- ⾯向对象(封装,继承,多态)
- JVM 多平台运行
- 可靠性
- 安全性
- 支持多线程
- ⽀持⽹络编程并且很⽅便( Java 语⾔诞⽣本身就是为简化⽹络编程设计的)
- 编译与解释并存
JVM
虚拟机,字节码拓展名为.class,效率高,可以在KVM上运行。,java文件(源代码)通过javac编译为.class 字节码,然后通过JVM变为二进制机器码
JDK 和 JRE
- JDK 是 Java Development Kit,它是功能⻬全的 Java SDK。它拥有 JRE 所拥有的⼀切,还有编译器 (javac)和⼯具(如 javadoc 和 jdb)。它能够创建和编译程序。
- JRE 是 Java 运⾏时环境。它是运⾏已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机 (JVM),Java 类库,java 命令和其他的⼀些基础构件。但是,它不能⽤于创建新程序。
Java 和 C++的区别
- 都是⾯向对象的语⾔,都⽀持封装、继承和多态
- Java 不提供指针来直接访问内存,程序内存更加安全 Java 的类是单继承的,C++ ⽀持多重继承;
- 虽然 Java 的类不可以多继承,但是接⼝可以多继 承。
- Java 有⾃动内存管理机制,不需要程序员⼿动释放⽆⽤内存
- 在 C 语⾔中,字符串或字符数组最后都会有⼀个额外的字符‘\0’来表示结束。但是,Java 语⾔ 中没有结束符这⼀概念。java string 提供length 值。
Java 程序的主类 应⽤程序和⼩程序的主类有何不同(mark)
⼀个程序中可以有多个类,但只能有⼀个类是主类。在 Java 应⽤程序中,这个主类是指包含 main()⽅法的类。⽽在 Java ⼩程序中,这个主类是⼀个继承⾃系统类 JApplet 或 Applet 的⼦ 类。应⽤程序的主类不⼀定要求是 public 类,但⼩程序的主类要求必须是 public 类。主类是 Java 程序执⾏的⼊⼝点。
Java 应⽤程序与⼩程序之间有哪些差别(mark)
简单说应⽤程序是从主线程启动(也就是 main() ⽅法)。applet ⼩程序没有 main() ⽅法,主要 是嵌在浏览器⻚⾯上运⾏(调⽤init()或者run()来启动),嵌⼊浏览器这点跟 flash 的⼩游戏类 似。
字符型常量和字符串常量的区别(mark)
- 形式上: 字符常量是单引号引起的⼀个字符; 字符串常量是双引号引起的若⼲个字符
- 含义上: 字符常量相当于⼀个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表⼀个地 址值(该字符串在内存中存放位置)
- 占内存⼤⼩ 字符常量只占 2 个字节; 字符串常量占若⼲个字节 (注意: char 在 Java 中占两 个字节)
基本类型储存空间大小固定,更具可移植性
重载和重写
重载(overload)
- 同一个类中,多个方法名相同,但参数类型不同、个数不同、顺序不同。
- ⽅法返回值和访问修饰符 可以不同。
- overloading resoultion(重载解析)过程,编译器对方法进行匹配。
重写(overwrite)
- 发⽣在运⾏期,是⼦类对⽗类的允许访问的⽅法的实现过程进⾏重新编写。
- 返回值类型、⽅法名、参数列表必须相同,抛出的异常范围⼩于等于⽗类,访问修饰符范围⼤于 等于⽗类。
- 如果⽗类⽅法访问修饰符为 private/final/static 则⼦类就不能重写该⽅法,但是被 static 修饰的⽅法能够被再次声明。
- 构造⽅法⽆法被重写
Constructor 不能被 override(重写),但是可以 overload(重载),所以你可以看到⼀个类中有多个 构造函数的情况。
⾯向对象三⼤特性: 封装 继承 多态
封装 Encapsulation
封装把⼀个对象的属性私有化,并提供get和set 方法。
继承 Inheritance
- 当两个类具有相同的属性和方法时,可以将相同的部分抽取出来放到一个类中作为父类,其它两个类继承这个父类。
- 继承后子类自动拥有了父类的属性和方法,另外子类可以写自己特有的属性和方法,及命名与父类同名的成员变量。
- 子类也可以重写父类的方法
- 父类的私有属性和构造方法并不能被继承。
- 子类不能继承父类中访问权限为private的成员变量和方法。
- protected对外隐藏,仍然允许子类的成员来访问它们。
多态 Polymorphism
实现多态有三个必要条件
- 继承:在多态中必须存在有继承关系的子类和父类。
- 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
- 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
String类
为什么String不可变
- String 类中字符串是由final修饰字符数组保存。
- Java9 之后该用byte数组保存
StringBuffer 和 StringBuilder 的区别(mark)
- 都是继承AbstractStringBuilder,父类变量不用final所以可变
- 都是调用父类构造方法
线程安全
- String不可变,线程安全
- buffer加了同步锁,线程安全
- builder无同步锁,非线程安全
性能
- 每次更改string对象时,都会新建一个然后改变指针指向。适合少量数据。
- buffer和builder都是直接对本身进行操作。
- builder线程不安全,相对于buffer有10%左右性能提升,适合单线程。
- buffer适合多线程。