Java面试问题一

Java 部分
1.操作系统相关 。
什么是操作系统
1、驱动程序:最底层的、直接控制和监视各类硬件的部分,它们的职责是隐藏硬件的具体细节,并向其他部分提供一个抽象的、通用的接口。
2、内核:操作系统之最内核部分,通常运行在最高特权级,负责提供基础性、结构性的功能。
3、支承库:是一系列特殊的程序库,它们职责在于把系统所提供的基本服务包装成应用程序所能够使用的编程接口(API),是最靠近应用程序的部分。例如,GNU C运行期库就属于此类,它把各种操作系统的内部编程接口包装成ANSI C和POSIX编程接口的形式。
4、外围:所谓外围,是指操作系统中除以上三类以外的所有其他部分,通常是用于提供特定高级服务的部件。例如,在微内核结构中,大部分系统服务,以及UNIX/Linux中各种守护进程都通常被划归此列。
2.什么是线程,什么是进程?
进程是系统中正在运行的一个程序,程序一旦运行就是进程。进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。
一个进程可以拥有多个线程,每个线程使用其所属进程的栈空间。线程与进程的一个主要区别是,统一进程内的一个主要区别是,同一进程内的多个线程会共享部分状态,多个线程可以读写同一块内存(一个进程无法直接访问另一进程的内存)。同时,每个线程还拥有自己的寄存器和栈,其他线程可以读写这些栈内存。
线程是进程的一个实体,是进程的一条执行路径。
线程是进程的一个特定执行路径。当一个线程修改了进程的资源,它的兄弟线程可以立即看到这种变化

进程和线程的区别体现在以下几个方面:
1.地址空间和其他资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其他进程内不可见。
2.通信:进程间通信IPC(管道,信号量,共享内存,消息队列),线程间可以直接独写进程数据段(如全局变量)来进程通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
3.调度和切换:线程上下文切换比进程上下文切换快得多。
4.在多线程OS中,进程不是一个可执行的实体。

1.需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程的代价是很大的。
2.线程的切换速度快,所以在需要大量计算,切换频繁时使用线程,还有耗时的操作时用使用线程可提高应用程序的响应。
1.2 JDK&JVM&JRE

分别是什么以及它们的区别?
JDK:Java Development Kit ,JRE :Java runtime environment
JVM Java Virtual Machine;
JDK  JDK是Java开发工具JDK 包含 运行环境JRE,一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)
JRE 是运行基于Java语言编写的程序所不可缺少的运行环境。JRE是Java运行环境,并不是一个开发环境
,JVM 它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行
2.解释一下为什么Java可以跨平台?
Java 为什么能跨平台,实现一次编写,多处运行?

Java 能够跨平台运行的核心在于 JVM 。不是 Java 能够跨平台,而是它的 jvm 能够跨平台。我们知道,不同的操作系统向上的 API 肯定是不同的,那么如果我们想要写一段代码调用系统的声音设备,就需要针对不同系统的 API 写出不同的代码来完成动作。

而 Java 引入了字节码的概念,jvm 只能认识字节码,并将它们解释到系统的 API 调用。针对不同的系统有不同的 jvm 实现,有 Linux 版本的 jvm 实现,也有 Windows 版本的 jvm 实现,但是同一段代码在编译后的字节码是一样的。引用上面的例子,在 Java API 层面,我们调用系统声音设备的代码是唯一的,和系统无关,编译生成的字节码也是唯一的。但是同一段字节码,在不同的 jvm 实现上会映射到不同系统的 API 调用,从而实现代码的不加修改即可跨平台运行。

1.3 面向过程 & 面向对象

1.什么是面向过程 & 什么是面向对象 & 区别?
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
面向过程 特点是模块化和流程化,面向对象的特点是封装,继承和多态
面向过程以功能实现作为模块化的集出, 而面向对象 是以类作为功能的组织基础
在java 中完成一个功能的调用 分三步, 类的定义,对象的创建 ,方法的调用
2.给我说说Java面向对象的特征以及讲讲你代码中凸显这些特征的经验。
面向对象是一种程序设计方法,或者是程序设计规范,其基本思想是使用对象、类、继承、封装、多态等基本概念来进行程序设计。 面向对象是一种符合人们思考习惯的思想,可以将复杂的事情简单化,将程序员从执行者转换成了指挥者
完成需求时:
• 先要去找具有所需的功能的对象来用。
• 如果该对象不存在,那么创建一个具有所需功能的对象。
• 这样简化开发并提高代码的复用。
面向对象的开发过程其实就是不断的创建对象,使用对象,指挥对象做事情。设计的过程其实就是在管理和维护对象之间的关系。
面向对象的特征:
• 封装(encapsulation)
概念:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:• 将变化隔离。• 便于使用。• 提高重用性。• 提高安全性。
封装原则:
• 将不需要对外提供的内容都隐藏起来。
• 把属性都隐藏,提供公共方法对其访问。

• 继承(inheritance)
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。
新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
子类可以直接访问父类中的非私有的属性和行为。通过 extends 关键字让类与类之间产生继承关系。如下:
继承提高了代码的复用性。
继承的出现让类与类之间产生了关系,提供了多态的前提
继承的特点:
Java只支持单继承,不支持多继承。
• 一个类只能有一个父类,不可以有多个父类。
被final修饰的类是一个最终类,不可以被继承。
被final修饰的方法是一个最终方法,不可以被覆盖。
被final修饰的变量是一个常量,只能赋值一次
内部类只能访问被final修饰的局部变量。

• 多态(polymorphism)
多态性:发送消息给某个对象,让该对象自行决定响应何种行为。
  通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。

多态就是指多种状态,就是说当一个操作在不同的对象时,会产生不同的结果。
在Java中,实现多态的方式有两种,一种是编译时的多态,另外一种是运行时多态,编译时的多态是通过方法的重载实现的,而运行时多态是通过方法的重写实现的。
方法的重载是指在同一个类中,有多个方法名相同的方法,但是这些方法有着不同的参数列表,在编译期我们就可以确定到底调用哪个方法。
方法的重写,子类重写父类中的方法(包括接口的实现),父类的引用不仅可以指向父类的对象,而且还可以指向子类的对象。当父类的引用指向子类的引用时,只有在运行时才能确定调用哪个方法。
3.什么是重载 & 什么是重写 & 区别。
 重写 子类重写父类中的方法 ,.
方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同
在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载。

答:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。-
4.谈谈你对this和super的认识。
一、概况

This:

This指代当前对象,this()指代当前对象的其他构造函数

Super:

Super指代父类对象,super()指代父类的构造函数;

二、具体用法,对比super和this理解

1、this用作指代当前对象,super指代父类对象

A、this.成员变量,可调用当前对象的成员变量,一般是在当前类的某个方法的形参和当前的对象成员变量同名的时候用到

super.成员变量,调用父类的成员变量。

5.接口和抽象类的区别。
抽象类是什么:抽象类不能创建实例,它只能作为父类被继承。
(1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法

(2) 抽象类不能被实例化

(3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类

(4) 具体派生类必须覆盖基类的抽象方法

(5) 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体派生类必须覆盖它们

接口是什么:

(1) 接口不能被实例化

(2) 接口只能包含方法声明

(3) 接口的成员包括方法、属性、索引器、事件

(4) 接口中不能包含常量、字段(域)、构造函数、析构函数、静态成员

接口和抽象类的区别:

(1)抽象类可以有构造方法,接口中不能有构造方法。

(2)抽象类中可以有普通成员变量,接口中没有普通成员变量

(3)抽象类中可以包含静态方法,接口中不能包含静态方法

(4) 一个类可以实现多个接口,但只能继承一个抽象类。

(5)接口可以被多重实现,抽象类只能被单一继承

(6)如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法

接口和抽象类的相同点:

(1) 都可以被继承

(2) 都不能被实例化

(3) 都可以包含方法声明

(4) 派生类必须实现未实现的方法
6.静态属性和静态方法能被继承吗?静态方法又是否能被重写呢?
java中静态属性和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏.
静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成对,不需要继承机制及可以调用。如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为"隐藏“
静态属性和静态方法可以被继承
静态方法不可以被重写,不能实现多态
7.给我说说权限修饰符特性。
 public:对所有类可见

protected:对同一包中的类可见、对同一包及不同包中的子类可见

default:对同一包中的类可见、对同一包中的子类可见

private:仅对类本身可见

可见是可访问的意思,即由这些修饰符修饰的成分(类、方法、成员变量)可以被其它类访问。对子类可见即子类可以继承。

8.给我谈谈Java中的内部类。
 1.静态内部类:作为类的静态成员,存在于某个类的内部。
静态内部类虽然是外部类的成员,但是在未创建外部类的对象的情况下,可以直接创建静态内部类的对象。静态内部类可以引用外部类的静态成员变量和静态方法,但不能引用外部类的普通成员。
2.成员内部类:作为类的成员,存在于某个类的内部。
成员内部类可以调用外部类的所有成员,但只有在创建了外部类的对象后,才能调用外部的成员。
3. 局部内部类:存在于某个方法的内部。
局部内部类只能在方法内部中使用,一旦方法执行完毕,局部内部类就会从内存中删除。
必须注意:如果局部内部类中要使用他所在方法中的局部变量,那么就需要将这个局部变量定义为final的。
4.匿名内部类:存在于某个类的内部,但是无类名的类。类如接口
9.闭包和内部类的区别?
闭包(Closure)是一种能被调用的对象,它保存了创建它的作用域的信息。JAVA并不能显式地支持闭包,但是在JAVA中,闭包可以通过“接口+内部类”来实现。
内部类可以很好的实现隐藏。
一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
内部类拥有外围类的所有元素的访问权限
可是实现多重继承
可以避免修改接口而实现同一个类中两种同名方法的调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值