**
1. 面向过程和面向对象的区别
**
(1) 用你的理解解释一下什么是面向对象编程,什么是面向过程编程.
答:面向对象相当于分工合作,分而治之。把不同的功能封装成一个个的方法,方法之间关系不密切,高内聚,低耦合。面向过程是按步骤执行,先执行一些步骤,在执行一些步骤,执行先后的程序关系紧密。
(2) 哪些语言是面向对象语言?哪些语言是面向过程语言?
答:面向对象语言:java、c++、python。面向过程语言:c语言
(3) 为什么会出现面向对象的语言?
答:随着社会的发展,数据越来越多,就越需要一种好的方式来管理数据。面向对象就可以很好的管理数据
(4) 总结一下面向过程和面向对象
答:面向对象是基于一种类进行管理的,面向对象是由属性和方法构成,不同的类型的数据有不同的方法和属性,同一个类的数据具有相同的属性和方法。面向过程是按步骤进行执行的程序,程序没有进行数据的分类,是按照步骤执行的程序
**
2. 对象是什么_对象和数据管理
**
(1) 说说你理解的对象是什么?
答:对象是类的一个实例,一个对象就是一个类中的某一个个体,是通过类所创建的。拥有该类的所有属性和方法。
**
3. 对象和类的关系_属性_成员变量_方法
**
(1) 什么是类?什么是抽象?
答:类是对象的模板,是对某些具有相似属性和方法的个体的抽象。抽象就是从某些相似的个体中所抽出来的具有相同属性和方法。
(2) 说说类和对象的关系,举两个例子描述类和对象
答:类是对象的模板,对象是类的实例。比如学生可以看作是一个类,学生具有的属性和方法都是相同的,比如都有变量:升高,体重,名字等。方法:吃饭,跑步等。一个学生也是具有这些相同的属性和方法。一个学生就属于一个学生类,电脑也可以看作是一个类,电脑都具有一些相同的属性和方法,所有一台电脑就是该电脑类的一个实例。
(3) 类里面通常都有哪些东西?
答:属性和方法
**
4. 一个典型类的写法和调用_类的UML图入门
**
(1) 如何创建一个类的对象?通过类的什么方法来创建对象?
答:通过new关键字来创建对象,通过类的构造方法来创建对象。
(2) 一个类可以包含另外一个类么?通过什么符号来调用类实例的方法或者属性?
答:一个类里面可以包含另一个类,通过.来掉用类实例的方法和属性
**
5. 内存分析详解_栈_堆_方法区_栈帧_程序执行的内存变化过程
**
(1) JVM内存分为哪三个区域?方法区也在堆中,这句话对么?
答:JVM内存包含内存的栈(stack)、堆(heap)、方法区(method area)。方法区也在堆中
(2) 栈里面存储什么数据?栈的特点是什么?
-
栈描述的是方法执行的内存模型。每个方法被掉用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
-
JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
-
栈属于线程私有,不能实现线程间的共享!
-
栈的存储特性是“先进后出,后进先出”
-
栈是由系统分配,速度快!栈是一个连续的内存空间!
(3) 堆里面存储什么数据?堆的特点是什么?
-
堆用于存储创建好的对象和数组(数组也是对象)
-
JVM只有一个堆,被所有线程共享
-
堆是一个不连续的内存空间,分配灵活,速度慢。
(4) 方法区里存储什么数据?方法区的特点是什么?
-
方法区(静态区),JVM只有一个方法区,被所有线程共享!
-
方法区实际也是堆,只有用于存储类、常量相关的信息!
-
用来存放程序中永远不变或唯一的内容(类信息、静态变量、静态方法、字符串常量)
(5)代码内存分析过程
代码:
过程:
第一步:当进入main方法时,在栈中开一个栈帧,因为main方法是程序的入口,每执行一个方法就开一个栈帧。先加载类信息,所以先把所有字符串常量和静态方法、代码、静态变量加载到方法区中。刚开始还没有new对象,所以只有一个student1 = null。
第二步:执行new Student()代码,给成员变量赋初始值,开辟构造方法的栈帧,虚拟机分配地址,关闭构造方法的栈帧,并把地址赋值给student1。
第三步:和第二步相同,创建studen2对象。
第四步:给student1的成员变量和字符串赋值,由于student1的name是字符串,因为字符串是在方法区中,所有给name赋值是赋的是hello地址(图中未给出地址,类似于对象的地址方式),student1的friend是一个对象,所有friend指向student2的地址。代码中没有给student2赋值,所有还是初始值。
**
6. 构造方法详解_构造方法重载
**
(1) 构造方法的作用是什么?构造方法的要点是什么?
答:构造方法(构造器),用来初始化对象。
1.通过new关键字掉用!
2.构造器虽然有返回值,但是不能定义返回值类型(返回值的类型是本类),不能在构造器中使用return返回某个值。
3.如果我们没有定义构造器,则编译器会自动定义一个无参的构造函数,如果已定义则编译器不会自动添加。
4.构造器的方法名称必须和类名一致!
(2) 构造方法重载的意义是什么?如果写了有参构造方法后,无参构造方法还存在么?
答:构造方法重载的意义是可以根据不同的实参创建不同的对象的初始化。当自己定义了一个构造方法后,系统不会再给无参的构造方法。
**
7. 垃圾回收机制介绍_垃圾回收算法(引用计数和引用可达)
**
(1) 什么是java的垃圾回收机制?垃圾回收机制的要点是什么?
答:垃圾回收机制(Garbage Collection)。垃圾回收机制就是当程序中有无用的对象时,会自动的对该对象进行回收。垃圾回收机制可以将“无用的对象”进行回收。无用的对象是指没有任何变量引用该对象,java的垃圾回收器通过相关算法发现无用对象,并进行回收。
(2) 如何确定内存中的哪些对象是垃圾?
- 引用计数法:堆中每个对象都有一个引用计数。被引用一次,计数加1。 被引用变量值变为null,则计数减1,直到计数为0,则表示变成无用对象。优点是算法简单,缺点是“循环引用的无用对象”无法别识别。
public class Student {
String name;
Student friend;
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student();
s1.friend = s2;
s2.friend = s1;
s1 = null;
s2 = null;
//s1和s2互相引用对方,导致他们引用计数不为0,但是实际已经无用,但无法被识别。
}
}
-
引用可达法(根搜索算法):程序把所有的引用关系看作一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引用到的节点,即无用的节点。
-
通用分代垃圾回收详解(年轻代,年老代,持久代)
(1) 垃圾回收机制的算法非常多,其核心思想是什么?垃圾回收最频繁的是在哪个代里面?
答:核心思想是. 发现无用的对象,回收无用对象占用的内存空间。垃圾回收最频繁的是年轻代。
(2) 什么是minorGC,什么是majorGC,什么是fullGC
答:所有新生成的对象首先都是放在Eden区。 年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象,对应的是Minor GC,每次 Minor GC 会清理年轻代的内存,算法采用效率较高的复制算法,频繁的操作,但是会浪费内存空间。当“年轻代”区域存放满对象后,就将对象存放到年老代区域。
在年轻代中经历了N(默认15)次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。年老代对象越来越多,我们就需要启动Major GC和Full GC(全量回收),来一次大扫除,全面清理年轻代区域和年老代区域。
(3)垃圾回收的过程是什么?
答:1、新创建的对象,绝大多数都会存储在Eden中。
2、当Eden满了(达到一定比例)不能创建新对象,则触发垃圾回收(GC),将无用对象清理掉,然后剩余对象复制到某个Survivor中,如S1,同时清空Eden区。
3、当Eden区再次满了,会将S1中的不能清空的对象存到另外一个Survivor中,如S2,同时将Eden区中的不能清空的对象,也复制到S1中,保证Eden和S1,均被清空。
4、重复多次(默认15次)Survivor中没有被清理的对象,则会复制到老年代Old(Tenured)区中。
5、当Old区满了,则会触发一个一次完整地垃圾回收(FullGC),之前新生代的垃圾回收称为(minorGC)。
**
8.this的本质_对象创建的过程
**
(1) 写出创建对象的过程
-
分配对象空间,并将对象成员变量初始化为0或空
-
执行属性值的显式初始化
-
执行构造方法
-
返回对象的地址给相关的变量
(2) this指向哪里?同类中,一个构造器如何调用另外一个构造器?
答:this指向“创建好的对象的地址”。由于在构造方法调用前,对象已经创建好。因此在构造方法中也可以使用this代表“当前对象”。通过this()调用。
**
9. Static关键字_内存分析静态变量和静态方法
**
(1) Static修饰变量称之为什么?static修饰方法称之为什么?
答:static修饰变量称为静态变量。修饰方法称为静态方法。
(2) 被static修饰的变量和方法从属于谁?没被static修饰的变量和方法从属于谁?
答:被static修饰的变量和方法从属于类,生命周期和类相同。没有被static修饰的变量和方法从属于对象,生命周期从属于对象。
(3) 在同一个类中,在非静态方法中,如何调用本类的静态方法和静态变量?
答:通过静态变量名和静态方法名直接调用或者通过类名.静态方法和类名.静态变量调用。
(4) 在同一个类中,在静态方法中,如何调用本类的静态方法和静态变量?
答:通过静态变量名和静态方法名直接调用或者通过类名.静态方法和类名. 静态变量调用。
(5) 在同一个类中,在静态方法中,如何调用本类的非静态方法和非静态变量?
答:静态方法中不能调用本类的非静态方法和静态变量
(6) 在不同类中,A类的方法如何调用B类的非静态方法或者非静态变量?
答:通过对象来调用,对象名.方法名和对象名.变量名
(7) 在不同类中,A类的方法如何调用B类的静态方法或者静态变量?
答:通过对象来调用,对象名.方法名和对象名.变量名或者通过类名.方法名或者对象名.静态变量调用
**
10. 静态初始化块_继承数的追溯
**
(1) 静态初始化块的作用是什么?什么时候执行静态初始化块?
答:静态初始化块的作用是用于类的初始化。在类初始化的时候执行。
**
11. Java的参数传值机制_值传递
**
(1) 写代码解释为什么说java中参数传递是值传递
答:
int a = 1;
int b = 3;
ab(a, b);
System.out.println(“a=”+a+" b="+b);//a和b的值没变,传入的是副本
}
public static void ab(int a,int b) {
a ++;
b++;
}
(2) 基本数据类型传递和引用数据传递一样么?
答:不一样。传入基本数据类型的时候,是传入的是副本,并不是原数据的地址,而传入引用数据时,传入的是引用的数据的原地址。
**
12. Java包机制_package的使用_jdk提供的常见包的作用
**
(1) Java中Package的作用是什么?
答:包机制是java中管理类的重要手段,开发中,我们会遇到大量同名的类,通过包我们很容易对解决类重名的问题,也可以实现对类的有效管理。包对于类,相当于文件夹对于文件的作用。
(2) Jdk有哪些常见包,分别什么作用?
答:java.lang:包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。
java.awt:包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。
http://java.net:包含执行与网络相关的操作的类。
http://java.io:包含能提供多种输入/输出功能的类。
java.util:包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。
**
13. Import详解_静态导入详解
**
(1) 什么情况下需要导包?
答:当需要用到其他类时,自己所在的包中没有该类时。
(2) 怎么导入一个包下的所有类?java默认导入了什么包?
答:在所导入的包后面写通配符“*”就可以导入一个包中所有的类。
(3) 如果需要使用不同包下的同名类怎么办?
答:可以通过使用完整的报名.类名来创建使用。例如:java.sql.Date和java.util.Date下的Date类名相同,所以通过 java.util.Date date = new java.util.Date();来明确指定所需要使用的类
(4) 什么是静态导入?
答:通过static关键字导入类,可以直接使用该类的静态变量和方法,不需要用类名.静态变量或者类名.静态方法来使用。