一、特点
(我觉得必须说的)
1、面向对象(封装,继承,多态)
2、支持多线程(进程中的最小执行单位就是线程,多线程就是线程并行)
3、高效
4、平台无关性( Java 虚拟机JVM实现了一次编译,到处运行;编译后的可以在任意平台上运行)
(全部)
- 简单易学(语法简单,上手容易);
- 面向对象(封装,继承,多态);
- 平台无关性( Java 虚拟机实现平台无关性);
- 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持);
- 可靠性(具备异常处理和自动内存管理机制);
- 安全性(Java 语言本身的设计就提供了多重安全防护机制如访问权限修饰符、限制程序直接访问操作系统资源);
- 高效性(通过 Just In Time 编译器等技术的优化,Java 语言的运行效率还是非常不错的);
- 支持网络编程并且很方便;
- 编译与解释并存;
二、 JVM JDK JRE
1、JVM是java的虚拟机,有针对不同的系统的特定实现。
目的:使用相同的字节码,会给出相同的结果。实现了Java 语言“一次编译,随处可以运行”
2、JDK
功能齐全的JAVA开发工具包,用于创建及编译JAVA程序。包含了JRE以及编译器javac等工具。
3、JRE
是运行已编译 Java 程序所需的环境
三、 Java 语言“编译与解释并存”
Java既具有编译型语言的特征,也具有解释型语言的特征。
Java是先编译,生成字节码(.class文件),再由Java解释器来解释执行。
四、和Cpp的区别
Java 和 C++ 都是面向对象的语言,都支持封装、继承和多态,
但是:
- Java 不提供指针,直接访问内存,程序内存更加安全
- Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
- Java 有自动内存管理垃圾回收机制(GC),不需要程序员手动释放无用内存。
- C ++同时支持方法重载和操作符重载,但是 Java 只支持方法重载(操作符重载增加了复杂性,这与 Java 最初的设计思想不符)
五、基本语法
1、注释有几种形式
-
单行注释:通常用于解释方法内某单行代码的作用。
-
多行注释:通常用于解释一段代码的作用。
-
文档注释:通常用于生成 Java 开发文档。
2、标识符和关键字的区别
标识符就是名字
关键字是被赋予了特殊意义的标识符,其他的就不能取关键字了
例如警察局已经被赋予了特殊意义,再开店就不能再叫警察局了
3、基本数据类型
4、重载和重写
重载:发生在同一个类中(或者父类和子类之间),方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。
重写:发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写。
- 方法名、参数列表必须相同,子类方法返回值类型应比父类方法返回值类型更小或相等,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。
- 如果父类方法访问修饰符为
private/final/static
则子类就不能重写该方法,但是被static
修饰的方法能够被再次声明。 - 构造方法无法被重写,构造方法不能被重写(override),但可以被重载(overload)。因此,一个类中可以有多个构造方法,这些构造方法可以具有不同的参数列表,以提供不同的对象初始化方式
六、面向对象
1、面向对象和面向过程的区别
- 面向过程编程(POP):面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。
- 面向对象编程(OOP):面向对象会先抽象出对象,然后用对象执行方法的方式解决问题。
2、面向对象三大特征
(1)封装
把一个对象的属性隐藏在对象内部,不允许外部对象直接访问对象的内部信息。但是可以提供一些可以被外界访问的方法来操作属性(get,set)。
(2)继承
不同类型的对象,相互之间经常有一定数量的共同点。提高代码的重用,程序的可维护性,节省大量创建新类的时间 ,提高我们的开发效率。
父类的构造方法:不管私不私有,都不能继承(意思就是不能通过父类的构造方法来set数据或者干啥的,因为你用构造方法的方法名字要跟自己的名字一样,但父类和子类肯定不一样),但可以通过super调用
父类的成员变量:不管是什么样的修饰符,子类都可以继承。
父类的成员方法:添加到虚方法表中的可以继承(非private、static、final),没添加到虚方法表的不能继承。
(3)多态 看另一篇
表示一个对象具有多种的状态,具体表现为父类的引用指向子类的实例。
- 对象类型和引用类型之间具有继承(类)/实现(接口)的关系;
- 引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定;
- 多态不能调用“只在子类存在但在父类不存在”的方法;
- 如果子类重写了父类的方法,真正执行的是子类重写的方法,如果子类没有重写父类的方法,执行的是父类的方法
3、深拷贝和浅拷贝区别了解吗?什么是引用拷贝?
- 浅拷贝:(对应一个地址)浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。
- 深拷贝:(对应两个地址)深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。
- 引用拷贝:两个不同的引用指向同一个对象。
七、Object
是所有类的父类,
== 和 equals() 的区别
==
对于基本类型和引用类型的作用效果是不同的:
- 对于基本数据类型来说,
==
比较的是值。 - 对于引用数据类型来说,
==
比较的是对象的内存地址。
因为 Java 只有值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。
equals()
不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。equals()
方法存在于Object
类中,而Object
类是所有类的直接或间接父类,因此所有的类都有equals()
方法。
八、String 、StringBuffer、StringBuider
1、可变性:
String不可变,其他两个可变
2、线程安全性:
String中的对象是不可变的(是用final修饰的),可以认为是常量,线程安全。
StringBuffer
对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder
并没有对方法进行加同步锁,所以是非线程安全的。
3、性能:
每次对 String
类型进行改变的时候,都会生成一个新的 String
对象,然后将指针指向新的 String
对象。StringBuffer
每次都会对 StringBuffer
对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder
相比使用 StringBuffer
仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
对于三者使用的总结:
- 操作少量的数据: 适用
String
- 单线程操作字符串缓冲区下操作大量数据: 适用
StringBuilder
- 多线程操作字符串缓冲区下操作大量数据: 适用
StringBuffer