java基础
1.什么是Java
Java时一门面向对象的计算机编程语言,可以将其称之为c+±-,它吸收了c++语言的许多优点,同时摒弃了c++语言多继承,指针等难以理解的概念。Java语言是静态面向对象编程语言的代表。极好的实现了面向对象理论,让程序员以优雅的思维方式进行复杂的编程。
拓展
静态编程语言和动态编程语言:
静态编程语言:静态编程语言要声明变量的数据类型,数据类型会在编译期间进行检查。静态编程语言在使用变量前需要为变量分配好内存空间。静态编程语言功能强大,但灵活性较差。常见的静态编程语言有:c、c++、java、c#。
动态编程语言:与静态编程语言相反,不需要声明变量的数据类型,数据类型是在运行期间进行检查的。动态编程语言快速灵活,提升了开发速度,但是失去了程序的健壮性,在代码运行前很难找到bug。常见的动态编程语言:js、python、php。
2. Java语言和C++语言的区别与联系:
联系:都是静态的面向对象的编程语言,都支持继承、封装、多态。
区别:Java是解释型语言,Java中的类是只支持单继承的,Java有自动的内存管理制度,不提供指针来直接访问内存,程序内存更加安全,并解放了程序员在内存上的管理;C++是编译型语言,C++支持多继承,但是内存方面需要程序员手动管理。
拓展
解释型语言和编译型语言:
解释型语言:所谓解释型语言就是源码会先经过一次编译成为中间码,中间码再被解释器解释成机器码。Java中解释器内置再jvm中,中间码就是.class后缀的字节码。
编译型语言:源码只进行一次编译,在编译的过程中进行链接生成机器码。
3.Java语言的跨平台性原理是什么?
所谓跨平台性,是指java语言编写的程序经过一次编译后,可以在不同的操作系统上运行。因为Java程序是通过Java虚拟机在系统平台上运行的,不同的系统会安装相应平台的jvm(java虚拟机),各自系统平台jvm会将编译成的字节码解释为各自系统识别的机器码,在系统中运行。
拓展
JDK、JRE、JVM
JVM:Java虚拟机,Java程序编译生成的字节码需要在JVM中运行,不同操作系统平台有自己的JVM。
JRE:Java运行时环境,包括Java虚拟机和Java程序所需的核心类库等,如果想要运行一个开发好的Java程序,只需要安装JRE即可。
JDK: Java软件开发工具包,其中包含了Java的开发工具和JRE。
4.Java程序初始化的顺序是怎么样的
- 父类静态变量和父类静态代码块(先声明的先执行)
- 子类静态变量和子类静态代码块(先声明的先执行)
- 父类变量和代码块(先声明的先执行)、
- 父类构造函数
- 子类变量和代码块(先声明的先执行)
- 父类构造函数
5.一个Java程序中是否可以定义多个类
一个java程序中可以定义多个类,但是最多只能有一个类被public修饰,并且这个类的类名必须与文件名相同。如果没有public修饰的类,文件中只要有一个类名与文件名相同即可。使用javac对.java文件进行编译时,会给类中的每一个class生成一个对应的.class文件。
6.获取一个对象所属类(Class类)的三种方式
- Class.forName(“类的路径”)
- 类名.Class
- 实例.getClass
7.package的作用
- 提供多层次的命名空间,解决命名冲突,使得不同包下的类可以有相同的名字。
- 对类按功能进行分配,使得项目组织更加清晰。
8.什么是继承
继承是面向对象中一个非常重要的特性。通过继承,子类可以使用父类中的一些变量与方法,从而提高代码的复用性,提高开发效率。Java语言中,被继承的类叫做父类(基类),继承父类的类叫做子类(派生类)。继承通过extends来实现。
9.组合和继承有什么区别
组合和继承都是面向对象中俩种代码复用的方式。组合是指在新类里面创建原有类,调用原有类的功能,是显示的。继承是通过extends关键字隐式的让新类具有原有类的功能,但是继承只能继承一个类。
拓展
对于继承和组合,实际使用时如何选择
一般情况遵循以下俩点原则:1)除非俩个类是"“is-a”"的关系,否则不要轻易地使用继承。2)不要仅仅为了实现多态而使用继承,如果类之间没有“is-a”的关系,可以通过实现接口与组合的方式来达到相同的目的。总而言之,能使用组合就尽量不要使用继承。
10.多态的实现机制
多态是指同一个行为具有表现不同形态的能力,具体来说,就是同一个接口,使用不同实例执行不同操作。
多态的俩种表现方式:
- 方法的重载: 重载是指同一个类中有多个同名的方法,但这些方法有不同的参数规则。重载的各个方法由于参数的不同,可以在编译阶段确定到底调用哪一个方法,因此是一种编译时多态。重载也可以被看作一个类中方法的多态性。
- 方法的覆盖:子类覆盖父类的方法后,同样的方法会在子类和父类中有着不同的表现形式。在java语言中基类的引用既可以指向父类对象,也可以指向子类对象(接口相同)。Java是通过运行时的动态绑定来确定是调用子类的方法还是父类的方法,所以方法的覆盖是一种运行时多态。
11.抽象类和接口
相同点:
- 都不能被实例化
- 接口的实现类和抽象类的子类只有实现了接口和抽象类中的全部抽象方法,才能被实例化。
不同点:
- 接口需要被实现,抽象类只能被继承。一个类可以实现多个接口,只能继承一个抽象类。
- 接口强调功能的实现,抽象类强调所属关系的实现。
- 接口运用于实现比较常用的功能,便于日后维护或者添加删除方法;而抽象类更倾向于充当公共的角色,不适用于日后对代码进行修改。
12.如何获取子类和父类的类名
- 获取子类的类名 : this.getClass().getName()
- 获取父类的类名 : super.getClass().getName()
13.this与super
- super用来引用当前对象的直接父类中的成员,主要用来访问直接父类中隐藏的父类成员变量或方法,以及当基类与派生类中有相同成员定义时,使用super调用父类成员。
- this用来引用当前对象,在程序中容易产生二义性之处,可以使用this来指明当前对象。
- super():在子类中调用父类构造方法,需放在构造方法第一行。
- this():在本类中调用本类的其他构造方法,需放在构造方法第一行。
- this()和super()不能同时出现在同一个构造函数里,均不可以在static环境中i使用。
14.break、continue、return
- break :跳出本层循环,结束当前循环体
- continue : 跳过本次循环,继续执行下次循环
- return : 程序返回,不再执行return之后代码
15.final、finally、finalize
- final用于声明属性、方法和类,分别表示属性不可变(引用不可变)、方法不可覆盖、类不可被继承(不能再派生出新的子类)。
- finally只能用在try/catch语句中,并且附带一个语句块,并且表示这段语句最终一定被执行,经常用于释放资源的情况下。
- finalize是Object类的一个方法,在垃圾回收器执行时调用被收回对象的finalize()方法,可以覆盖此方法来实现对其它资源的回收,例如关闭文件等。注意:一旦垃圾回收器准备好释放对象占用的空间,将会首先调用该对象的finalize()方法,并且在下一次垃圾回收动作发生时,真正回收对象占用的内存。
16.值传递与引用传递
值传递
在方法调用中,实参会把它的值传递给形参,形参用实参的值初始化一个临时的存储单元。形参与实参有着相同的值,但却有着不同的存储单元。
引用传递
在方法调用中,传递的是对象的地址,这时形参与实参的对象指向同一块存储单元,对形参的修改会影响实参的值。