Java_基础(57)

1、面向对象和面向过程
  • 面向对象是把解决问题的事务分析成对象,目的是为了描该某个事物在整个解决问题的步骤中的行为。易维护、易复用、易扩展。性能低;
  • 面向过程是分析解决问题需要完成那些步骤,按照这些步骤一步一步去进行。性能高;
  • 面向对象就好像盖浇饭,高内聚,低耦合;

2、程序健壮性理解

面对极少概率的特殊场景程序可以经受着考验;举例:
(1)电话号码的例子;
(2)ftp例子;


3、什么是跨平台性?原理是什么
  • 跨平台性是指java语言编写的程序,一次编译后,可以在多个系统平台上运行;
  • 实现原理:Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该系统就可以运行java程序;

4、谈谈对Java平台理解

包括3个方面:

  • 面向对象和提供了丰富的类库;
  • 跨平台:一次编译,到处运行;
  • 虚拟机和自动垃圾回收;

5、Java是解释执行吗?
  • 解释执行不太准确;
  • Java程序编译为.class字节码,通过虚拟机转成机器码,但是大多数时候使用Oracle的JDK的JVM,内嵌动态编译器,运行时将代码议成机器码;

6、JVM、JDK 和 JRE 有什么区别
  • JVM:Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台;
  • JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。
  • JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。

7、Java语言有哪些特点
  • 简单易学(Java语言的语法与C语言和C++语言很接近)

  • 面向对象(封装,继承,多态)

  • 平台无关性(Java虚拟机实现平台无关性)

  • 支持网络编程并且很方便(Java语言诞生本身就是为简化网络编程设计的)

  • 支持多线程(多线程机制使应用程序在同一时间并行执行多项任)

  • 健壮性(Java语言的强类型机制、异常处理、垃圾的自动收集等)

  • 安全性


8、面向对象三大特性
  • 封装:封装是把一个对象的属性私有化,隐藏内部的实现细节,同时提供一些可以被外界访问属性的方法,提高复用性和安全性。
    在单例设计模式之中,构造方法被私有化,不管外部如何操作也只有一个实例化对象,一定会存在一个static方法,用于取得本类的实例化对象;

  • 继承:继承是使用已存在的类的定义作为基础,建立新类,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类,提高复用性。

  • 多态性:父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。多态提高了程序的扩展性。一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在程序运行期间才能决定。


9、什么是字节码
  • 字节码:Java源代码经过虚拟机编译器编译后产生的文件(即扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机;

10、int 与Integer区别
  • Integer为int的包装类,int是基本数据类型;
  • Integer使用时需要先实例化new一个对象,int可以直接存储数据;
  • Integer默认值为null,int默认值为0;
11、Java有哪些数据类型

基本数据类型

  • 整数类型(byte,short,int,long)
  • 浮点类型(float,double)
  • 字符型(char)
  • 布尔型(boolean)

引用数据类型

  • 类(class)
  • 接口(interface)
  • 数组([])

12、基本数据类型字节长度

(1)byte 1字节、 short 2 字节、int 4字节 、 long 8字节
(2)float 4字节 、double 8字节
(3)char 2字节、boolean 1字节


13、 访问修饰符 public,private,protected,以及不写(默认)时的区别

Java中可以使用访问修饰符来保护对类、变量、方法的访问。

  • private : 在同一类内可见。使用对象:变量、方法。注意:不能修饰类(外部类);

  • default : 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法;

  • protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。注意:不能修饰类(外部类);

  • public : 对所有类可见。使用对象:类、接口、变量、方法;


14、局部变量和全局变量(成员变量)区别
  • 使用static 关键字进行声明的变量叫做全局变量;
  • 在函数外面定义的变量叫做成员变量;
    (1)局部变量声明在特定的方法中,只限在本方法中使用;
    (2)成员变量声明在类中,可以整个类里面被使用;
    (3)成员变量在类被调用时候就会加载初始化,局部变量在该方法调用时候才会加载;

15、解释&(与)和&&(与与),|(或)和||(或或)的区别
  • 与和或两个运算可以进行关系运算与逻辑运算

    ——在进行逻辑运算时所有的判断条件都要执行;
    ——在进行位运算时候只针对当前数据进行与、或处理;

  • 在逻辑运算上还可以使用或或、与与

    ——与与:在若干条件判断时,如果前面返回false,后续不再执行,返回false。
    ——或或:在若干条件判断时,如果前面返回true,后续不再执行,返回true。


16、== 和 equals 的区别是什么
==:
  1、用于数值比较;
  2、用于对象比较的是两个内存地址是否相等(new开辟新空间内存地址不同);
equals:
  1、类提供的比较方法,可以进行字符串内容判断;
  2、用于对象比较,比较两个对象内容是否相等;
  
总结:==比较的是数值与对象内存地址是否相等,equals比较的是内容是否相等。

注意:Object类中equals方法定义为判断两个对象的地址是否相等(即是否指向同一对象),如果新建的类没有覆写equals方法,判断对象是否相等时看两个对象地址是否相等,作用等同于“==”


17、hashCode 与 equals

hashCode() 的作用是获取哈希码,它实际上是返回一个int类型的整数。以KV方式存储便于确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object类中,这就意味着Java中的任何类都包含有hashCode()函数。

  • 如果两个对象相等,则hashcode一定也是相同的;

  • 两个对象相等,对两个对象分别调用equals方法都返回true;

  • 两个对象有相同的hashcode值,它们不一定是相等的;


18、值传递和引用传递有什么区别
  • 值传递(call by value):指的是在方法调用时,传递的参数是值的拷贝,传递后就互不相关了;

  • 引用传递(call by reference):指的是在方法调用时,传递的参数是引用变量所对应的内存地址。传递前和传递后都指向同一个引用(也就是同一个内存空间);

Java 中只有值传递。


19、两个对象的 hashCode()相同,则 equals()也一定为 true吗
  • 两个对象的 hashCode()相同,equals()不一定 true;
  • 在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等;

20、final 在 java 中有什么作用
  • final 修饰的类叫最终类,该类不能被继承。
  • final 修饰的方法不能被重写。
  • final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改

21、final、finally、finalize区别
  • final是一个修饰符关键字,可以修饰类、方法、变量,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值;

  • finally是一个异常处理的关键字,一般在处理异常的时将一定要执行的代码放在finally代码块中,不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码;

  • finalize是属于Object类的一个方法,该方法一般由垃圾回收器来调用;


22、throw与throws区别
  • throw是在代码块中使用的,主要是手工进行异常对象抛出;
  • throws是在方法定义上使用的,表示将此方法中可能产生的异常明确告诉给调用处,由调用出进行异常处理。

总结:都用于异常处理,使用范围不同,使用目的不同。


23、static存在的主要意义
  • 创建独立于具体对象的变量或者方法。即使没有创建对象,也能使用属性和调用方法;
  • 用来形成静态代码块来优化程序性能。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。因此,很多时候会将一些只需要进行一次初始化的操作放在static代码块中;

24、break 、continue 、return 的区别及作用
  • break 结束当前的循环体;

  • continue 跳出本次循环,继续执行下次循环;

  • return 结束当前的方法,直接返回;


25、this与supper区别
  • this表示先从本类中查找所需属性或方法,如果本类不存在则查找父类。
    super直接从父类中查找所需属性和方法。
  • this与super都可以进行构造方法调用,this调用本类中方法。
    super调用父类方法,都一定要放在构造方法首行,两个语句不允许同时出现。
  • this表示当前对象,super无此概念。

26、观察enum与Enum的区别?
  • enum从jdk1.5之后提供的关于定义枚举的关键字;
  • Enum是一个无法直接看见的抽象类,使用enum关键字定义的类就默认继承了此类。

27、java 中的 Math.round(-1.5) 等于多少
  • 等于 -1

28、String 属于基础的数据类型吗
  • String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象;

29、解释Srting类两种实例化对象区别
  • 直接赋值:只会实现一个实例化对象,并且自动保存到对象池中,以实现该字符串实例的重用;
  • 构造方法:产生两个实例化对象,并且不会自动入池,无法实现对象重用,但是可以利用inter()方法实现手动入池。

30、java 中操作字符串都有哪些类
  • String、StringBuffer、StringBuilder;

31、String、StringBuffer、StringBuilder区别
  • String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新对象;
  • StringBuffer、StringBuilder 可以在原有对象的基础上进行操作;
  • Stringbuffer线程安全、执行慢、多线程环境操作字符串;
  • Stringbuilder线程不安全,执行快,单线程环境操作字符串;

32、switch语句能否作用在byte上,能否作用在long上,能否作用在String上

switch可作用于:

  • 基本数据类型:int、byte、char、short及其包装类;
  • 字符串类型,String(jdk1.7之后才可以作用在string上) ;
  • 枚举类型;

switch不可作用于:

  • long 、double、 float、 boolean及其包装类;

33、String str="i"与 String str=new String(“i”)一样吗
  • 不一样,因为内存的分配方式不一样;
  • String str="i"的方式,java 虚拟机会将其分配到常量池中;
  • String str=new String(“i”) 则会被分到堆内存中;

34、如何将字符串反转
  • 使用 StringBuilder 或者 stringBuffer 的 reverse() 方法;

35、String 类的常用方法都有那些
  • indexOf():返回指定字符的索引。
  • charAt():返回指定索引处的字符。
  • replace():字符串替换。
  • trim():去除字符串两端空白。
  • split():分割字符串,返回一个分割后的字符串数组。
  • getBytes():返回字符串的 byte 类型数组。
  • length():返回字符串长度。
  • toLowerCase():将字符串转成小写字母。
  • toUpperCase():将字符串转成大写字符。
  • substring():截取字符串。
  • equals():字符串比较。

36、装箱和拆箱

(1)装箱是将基本数据类型转换成对应的个object 类型,如 integer a=10;
(2)拆箱是将object类型转化为对应的基本数据类型,如:int b=a;

37、解释覆写与重载的区别?Overloading时返回参数是否相同
OverrideOverloading
覆写重载
方法名称、参数类型及个数、返回值相同同方法名称相同,参数类型个数不同
被覆写方法不能拥有更严格控制权限没有权限限制
发生在子类继承关系中发生在一个类中
重载没有进行返回类型做出限制,但好的习惯应该保持一致。
总结:三大不同:定义、权限、发生范围

38、抽象类必须要有抽象方法吗
  • 不需要,抽象类不一定非要有抽象方法;
39、普通类和抽象类有哪些区别
  • 普通类不能包含抽象方法,抽象类可以包含抽象方法。
  • 抽象类不能直接实例化,普通类可以直接实例化。

40、抽象类能使用 final 修饰吗
  • 不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承;

41、接口和抽象类有什么区别

在这里插入图片描述
当同时可以使用时,优先考虑接口。


42、Integer a= 127 与 Integer b = 127相等吗
  • 对于对象引用类型:==比较的是对象的内存地址;

  • 如果Integer 值在-128到127之间,那么自动装箱时不会new新的Integer对象,而是直接引用常量池中的Integer对象,超过范围 a1==b1的结果是false;


43、字符型常量和字符串常量的区别
  • 形式上:字符常量是单引号引起的一个字符,字符串常量是双引号引起的若干个字符;

  • 占用内存:字符常量只占两个字节,字符串常量占若干个字节;


44、String s = new String(“abc”);创建了几个字符串对象
  • JVM会先检索常量池中是否存在“abc”,如果不存在“abc”,则会先在常量池中创建这个字符串。然后再执行new操作创建一个String对象,对象的引用赋值给s。此过程创建了2个对象;

  • 如果常量池时已经存在对应的字符串,那么只会在堆内创建一个新的String对象。此过程只创建了1个对象;


46、java 中 IO 流分为几种
  • 根据处理数据类型:字符流和字节流

  • 根据数据流向:输入流和输出流

Java IO流的40多个类大部分都是从如下4个抽象类基类中派生出来的。

  • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。

  • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。


47、字节流和字符流的区别

  • 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节;

  • 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据;

  • 字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件,我们将在下面验证这一点;


48、BIO、NIO、AIO 有什么区别
  • BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
  • NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
  • AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

49、Files的常用方法都有哪些
  • Files.exists():检测文件路径是否存在。
  • Files.createFile():创建文件。
  • Files.createDirectory():创建文件夹。
  • Files.delete():删除一个文件或目录。
  • Files.copy():复制文件。
  • Files.move():移动文件。
  • Files.size():查看文件个数。

50、什么是异常
  • Java异常是Java提供的一种识别及响应错误的一致性机制;
  • Java异常处理机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性;

51、Error 和 Exception 区别是什么
  • Error 是程序正常运行中的错误,一旦这类错误发生,通常应用程序会被终止;

  • Exception是程序正常运行中可以预料的意外情况,通常遇到这种异常,应对其进行处理使应用程序可以继续正常运行;


52、什么是运行时异常(非受检异常),编译时异常(受检异常)

Exception 将异常又分为两类:运行时异常和编译时异常。

  • 运行时异常:RuntimeException 类及其子类;
    特点:编译器不会进行检查并且不要求必须处理的异常。当程序中可能出现这类异常时会编译通过。比如空指针异常、数组下标越界异常、类型转换异常等。此类异常属于非受检异常,在程序中可以选择捕获,抛出,也可以不处理;

  • 编译时异常: Exception 中除 RuntimeException 及其子类之外的异常;
    特点: Java 编译器会检查它。如果程序中出现此类异常,比如 ClassNotFoundException(没有找到指定的类异常),IOException(IO流异常),要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译;

53、JVM 是如何处理异常的

在一个方法中如果发生异常,这个方法会创建一个异常对象,并转交给 JVM,该异常对象包含异常名称,异常描述以及异常发生时应用程序的状态。创建异常对象并转交给 JVM 的过程称为抛出异常。可能有一系列的方法调用,最终才进入抛出异常的方法,这一系列方法调用的有序列表叫做调用栈。

JVM 会顺着调用栈去查找看是否有可以处理异常的代码,如果有,则调用异常处理代码。如果 JVM 没有找到可以处理该异常的代码块,JVM 就会将该异常转交给默认的异常处理器(默认处理器为 JVM 的一部分),默认异常处理器打印出异常信息并终止应用程序。


54、try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗
  • 会执行,在 return 前执行。

注意:在 finally 中改变返回值的做法是不好的,因为如果存在 finally 代码块,try中的 return 语句不会立马返回调用者,而是记录下返回值待 finally 代码块执行完毕之后再向调用者返回其值,如果在 finally 中修改了返回值,就会返回修改后的值。


55、Java常见异常有哪些

Error

  • OutOfMemoryError:内存不足错误;

  • StackOverflowError:堆栈溢出错误;

Exception

  • IOException(IO异常)

  • RuntimeException

  • NullPointerException(空指针异常)

  • ClassCastException(类转换异常)

  • IndexOutOfBoundsException(索引越界异常)


56、说几个Java异常处理最佳实践
  • 尽量不要捕获类似 Exception 这样的通用异常,优先捕获最具体的异常

  • 不要捕获 Throwable 类

  • 包装异常时不要抛弃原始的异常

  • 不要使用异常控制程序的流程

  • 异常会影响性能


57、NoClassDefFoundError 和 ClassNotFoundException 有什么区别
  • NoClassDefFoundError是一个错误(Error),而ClassNOtFoundException是一个异常;

  • ClassNotFoundException的产生原因主要是:Java支持使用反射方式在运行时动态加载类,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。解决该问题需要确保所需的类连同它依赖的包存在于类路径中,常见问题在于类名书写错误;

  • NoClassDefFoundError产生的原因在于:如果JVM或者ClassLoader实例尝试加载类的时候却找不到类的定义。要查找的类在编译的时候是存在的,运行的时候却找不到了。这个时候就会导致NoClassDefFoundError。解决这个问题的办法是查找那些在开发期间存在于类路径下但在运行期间却不在类路径下的类;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值