7-17 大华一面(java 基础)
1. 讲一下 java 和其他语言的区别,说下 java 的平台无关性,如何做到一次编译,到处运行
关于java 的特性,可以从 java 的优点来说。
java 特点:
1) java 是纯面向对象的语言。一切皆对象,它能够直接反应现实生活中的对象,比如火车,人,动物等,因此开发人员更容易编写程序。
2)平台无关性。可以做到 “ 一次编译,到处执行 ”。因为 java 是解释型语言,编译器将 Class 文件编译成与平台无关的字节码,然后在虚拟机上执行,所以有很好的移植性。(如何实现跨平台的)
3)java 提供了丰富的内置函数,简化了开发人员的工作,缩短了项目周期。比如 Java 语言提供了对多线程的支持,提供了对网络通信的支持,最重要的是提供了垃圾回收器,人开发人员从内存管理中解放出来。(接下来可能会问多线程和 GC 机制。 )
4)java 语言具有良好的安全性和健壮性。java 语言经常被用在网络环境中,为了增强安全性, Java 语言提供了防止恶意代码攻击的安全机制(例如数组边界检查 和 byte code 校验)。此外 java 的强类型机制,垃圾回收器,异常处理和安全检查机制使其具有很好的健壮性。
5)Java 语言提供了 Web 应用开发支持。例如 Applet,servlet 和 JSP,都可以用来开发 web 应用程序,Socket、RMI 可以用来开发分布式运用程序的类库。
6)程序严谨整洁。 Java 语言去掉了 c++ 中难以理解的,容易混淆的特性,比如头文件、指针、结构等。
问题延伸:
1) java 如何实现跨平台的?
- 注意: 跨平台的是p不是 jvm 。 JVM 是用 c++ /c 开发的,是编译后的机器码,不能跨平台,不同平台上需要安装不同的 JVM。
- 所以,答: 我们编写的 JAVA 源码,编译后会生成一种 .class 文件,称为字节码文件.Java 虚拟机(JVM)就是负责将字节码文件翻译成特定平台下的机器码然后执行,也就是说,只要在不同平台上,安装对应的 JVM 虚拟机,就可以运行字节码,运行我们编写的 Java 程序。
- 而这个过程,我们编写的 Java 程序不做任何的改变,仅仅通过 JVM 这一“中间层”,就能在不同的平台上运行,真正实现了“一次编译,到处运行” 的目的。
2)你讲一下 GC 机制,说说有哪几种回收算法
2. 讲一下 GC 机制,为什么需要 GC 机制,你了解哪几种 GC 算法
相关问题:
1.full GC和old GC区别
10.jvm在gc时产生了oom你是如何解决的?
- JVM的垃圾回收为什么采用分代GC。跟语言有关系吗?
3. java 的反射
(1)反射的概述
什么是反射?
反射就是把 Java 类中的各个部分,映射成一个个对象,拿到这些对象之后我们可以做一些事情。既然反射是反射的 Java 类中的各个组成部分,那么 Java 类中的组成部分有哪些呢? 例如成员变量、构造方法、方法、包等信息,利用反射技术就能把这些组成部分反射成一个个对象,这个功能就能叫做 Java 的反射机制。
官方概述这样说: Java 反射机制就是在运行状态中,都能知道类的属性和方法以及能够调用对象的属性方法,并能修改对象的属性;这种动态获取信息以及动态调用对象的方法的功能就是 java 的反射机制。
反射能做什么?
有句经典的话,反射是框架设计的灵魂,一般来说反射就是做框架的,或者可以说是做一些抽象比较高的底层代码。
反射机制的作用:
1、反编译:.class–>.java
2、通过反射机制访问java对象的属性,方法,构造方法等;
怎样得到反射的类?
其实我们可以把反射理解为类的一个解刨,想解刨它,就必须拿到它,java代码是存储在后缀名是 .java 的文件中,它被编译后生成 .class文件,Java 认为一切皆对象,java 就把 .class文件也抽象成一种类,这个类就是 Class。
通过查看 Class 的API,发现有一种静态方法 forName(String className),通过该方法可以得到想要的反射类了。
反射机制获取类有三种方法:
1. Class.forName( “com.cj.test.Person” )
2. Object ——> getClass() ==>> 对象.getClass()
3. 类名.class
如何解刨类?
类一般由成员变量(字段/属性),方法,构造方法这三部分组成,由API 中得知,Class 提供了如下方法:
public Constructor getConstructor(Class<?>…parameterTypes)
public Method getMethod(String name,Class<?>… parameterTypes)
public Field getField(String name)
public Constructor getDeclaredConstructor(Class<?>…parameterTypes)
public Method getDeclaredMethod(String name,Class<?>… parameterTypes)
public Field getDeclaredField(String name)
这些方法分别用于帮咱们从类中解剖出构造函数、方法和成员变量(属性)。
然后把解剖出来的部分,分别用Constructor、Method、Field对象表示。
反射的额外用法
1)反射方法的其它使用之—通过反射运行配置文件内容
需求:
当我们升级这个系统时,不要Student类,而需要新写一个Student2的类时,这时只需要更改pro.txt的文件内容就可以了。代码就一点不用改动
2)通过反射越过泛型检查
泛型用在编译期,编译过后泛型擦除(消失掉)。所以是可以通过反射越过泛型检查的
4. java 的重写与重载?
重写
重写其实就是子类中把父类本身的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类的方法,所以在方法名、参数类型、返回类型形同的情况下,对方法体就行修改或者重写,这就是重写。其中注意,子类函数的访问修饰权限不能少于父类的。
重写总结:
1) 发生在子类和父类之间
2)方法名、参数列表、参数类型、返回类型必须相同
3)访问修饰权限要大于父类的被重写的访问修饰权限。(public > protected > default > private)
4)重写方法不能抛出新的检查异常或者抛出比被重写方法更宽泛的检查型异常。
重载
在同一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同、甚至参数顺序不同)则视作重载。同时重载对返回类型没什么要求,可以相同,也可以不相同,而且不能通过返回参数类型是否形同判断是否重载。
重载总结
1)重载是一个类中多态性的表现。
2)重载要求同名方法的参数列表不同(参数类型、参数个数、参数顺序)
3)重载的时候,返回类型可以相同,也可以不同,无法以返回类型作为判别是否重载。
重载(overload)与重写(overwrite)的区别(面试重点)
5.Java 的多态
一句话概括就是,事务在运行过程中存在不同的状态。
多态的前提:
- 要有父类继承关系。
2)子类要重写父类的方法。
3)父类引用指向子类的对象。( Person stu = new student())
多态的特点:
成员变量: 编译运行皆看左边(父类)
**成员方法:**编译看左边(父类),运行看右边。(动态绑定的)
静态方法: 编译运行皆看左边(父类)
以上三个提点也充分体现了多态的三个前提:
1)有父类继承关系
2)子类重写父类的方法
3)父类引用指向子类的对象。
**可扩展到:**方法的重写Overriding和重载Overloading是Java多态性的不同表现.
重写Overriding是父类与子类之间(运行时)多态性的一种表现,重载Overloading是一个类中(编译时)多态性的一种表现.