JDK和JRE的区别
JDK是整个JAVA的核心,包括了Java运行环境JRE,一堆Java工具和Java基础的类库。通过JDK开发人员将源码文件(java文件)编译成字节码文件(class文件)。
JRE是Java运行环境,不含开发环境,即没有编译器和调试器。将class文件加载到内存准备运行
讲一讲Java内存的堆(heap)、栈(stack)和方法区(method)
栈:
调用方法将在栈中开辟内存,称为入栈(压栈)。
栈内存存放基本类型值和引用数据类型的地址。
栈内存中的数据,没有默认初始化值,需要手动设置。
方法调用完成,栈内存立即释放,称为出栈(弹栈)堆:
用于存放使用new创建的对象或数组。
所有的对象都有内存地址值。
数据都有默认初始化值。
堆内存中的对象不再被指向时,JVM启动垃圾回收机制,自动清除。
方法区:
与Java堆一样,是各个线程共享的内存区域。
存储已被Java虚拟机加载的类信息、常量、静态变量、以及编译器编译后的代码等。
GC是什么? 为什么要有GC?
GC是垃圾收集的意思。
是指JVM用于释放那些不再使用的对象所占用的内存。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。Java有了GC,就不需要程序员去人工释放内存空间。
在java中,对象什么时候可以被垃圾回收?
一般情况下java中对象可被回收的前提是:该对象不再被引用。然后垃圾回收器在回收的时候便会把这个对象清理掉
垃圾回收机制的算法:(扩展)
1 引用计数算法:
给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器都为0的对象就是不再被使用的,垃圾收集器将回收该对象使用的内存。
2 根搜索算法:
通过一系列的名为“GC Root”的对象作为起点,从这些节点向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Root没有任何引用链相连时,则该对象不可达,该对象是不可使用的,垃圾收集器将回收其所占的内存。
java中会存在内存泄漏吗,请简单描述。
会存在, 内存泄漏是指程序分配的内存未释放或无法释放的现象。
java中内存泄露的发生场景:全局的集合变量、不正确的单例模式的使用
Java中内存泄漏产生的原因可能有哪些?
递归的时候会引起栈内存溢出
1、静态集合类引起内存泄漏; 2、当集合里面的对象属性被修改后,再调用remove()方法时不起作用; 3、监听器 4、各种连接
5、内部类和外部模块的引用 6、单例模式
具体说明请自行查看原文,链接:https://blog.csdn.net/c_royi/article/details/79527518
面向对象的基本特征是什么/什么是面向对象/你是如何理解面向对象的
封装 有选择的隐藏和暴露一些数据和方法 继承 子类可以直接实现父类中的方法,有选择的扩展 多态 调用同一个方法展示出来不同的方式。 抽象
把共同的特性抽取到一个类中
讲一下你对OOP的理解
OOP(object oriented programming),即面向对象
编程 面向对象具有四大特性,分别是
1.抽象 将一些事物的共性抽离出来归为一个类。 如对于动物,具有生命体征、活动能力等区别于其它事物的共同特征2.封装 有选择地隐藏和暴露数据和方法 比如有U盘这个类,我希望隐藏内部组成和实现,只暴露USB接口以供使用
3.继承 子类可以直接使用父类的部分数据和方法,可以有选择的扩展 比如鸟是动物,但鸟扩展了飞行的能力。
4.多态 同一类的对象调用相同方法可以表现出不同的行为 比如动物实现了say()方法,猴子、马等动物重写了say()方法来表现不同的交流语言。
Java中实现多态的机制是什么?
Java中,靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
Overload和Override的区别?
方法重写(overriding):
1、也叫子类的方法覆盖父类的方法,要求返回值、方法名和参数都相同。
2、子类抛出的异常不能超过父类相应方法抛出的异常。(子类异常不能超出父类异常)
3、子类方法的的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)
方法重载(overloading):
重载是在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同,方法体也不相同,最常见的重载的例子就是类的构造函数
构造器是否可被override
Constructor(构造器)不能被继承,所以不能被override(重写),但是可以被overloading(重载)
抽象类和接口的区别
抽象类是什么 含有abstract修饰符的class即为抽象类。 特点:
- 不能创建的实例对象
- 可以有抽象方法
- 可以有构造方法,但构造方法不能是抽象的
- 抽象方法必须子类进行实现,如果子类只实现部分方法,该子类必须是抽象的。 接口是什么 含有interface修饰符的就是 。 特点:
- 接口中的所有方法都必须是抽象的
- 接口中的方法定义默认为public abstract类型
- 接口中的成员变量类型默认为public static final
区别是什么
- 单继承多实现:一个类可以实现多个接口,但只能继承一个抽象类。
- 构造方法:抽象类可以有构造方法,接口中不能有构造方法。(JDK7之前)
- 变量:抽象类中可以有普通成员变量,接口中只有常量。
- 方法:抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
- 修饰符:抽象类中的抽象方法可以使用public和protected进行修饰,但接口中的抽象方法只能使用public abstract修饰。
- 静态方法:抽象类中可以包含静态方法,接口中不能包含静态方法
- 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。 (注:JDK1.8新特性,接口可以有默认方法和静态方法)
抽象类不能被实例化那他的构造器是用来干什么的
子类继承抽象类时,构造函数不会被覆盖。 而且,在实例化子类对象时首先调用的是抽象类中的构造函数再调用子类中的。
在这个阶段初始化抽象类字段或执行其它与子类相关的代码
Java中有没有多继承
Java的类是单继承的,即每个类只能继承一个类。 但是,Java中接口支持多继承,即一个接口可以继承多个接口
Integer与int的区别
1.int是Java的数据类型之一,Integer是Java为int提供的封装类;
2.int的初始化值为0,而Integer的初始化值为null。