Java基础常用知识点(无集合部分)

1. Jdk和Jre和JVM的区别

  • JDK :整个java的核心,包含了java运行环境(jre)和一系列java开发工具完整的包
  • JRE:是java程序的运行环境,包含JVM、Java核心库等。只能运行Java应用程序,无法编译开发
  • JVM:Java Virtual Machine是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台。

2. 什么是跨平台性,原理是什么

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

3. Java语言有哪些特点

  • 简单易学(Java语言的语法与C语言和C++语言很接近)
  • 面向对象(封装,继承,多态)
  • 平台无关性(Java虚拟机实现平台无关性)
  • 支持网络编程并且很方便(Java语言诞生本身就是为简化网络编程设计的)
  • 支持多线程(多线程机制使应用程序在同一时间并行执行多项任务)
  • 健壮性(Java语言的强类型机制、异常处理、垃圾的自动收集等)
  • 安全性好

4. 什么是字节码?采用字节码的最大好处是什么

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

  • 采用字节码的好处

    Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。


5. 什么是Java程序的主类?

  • 一个程序中可以有多个类,但只能有一个类是主类。在Java应用程序中,这个主类是指包含main()方法的类。而在Java小程序中,这个主类是一个继承自系统类JApplet或Applet的子类。应用程序的主类不一定要求是public类,但小程序的主类要求必须是public类。主类是Java程序执行的入口点。

6. Java应用程序与小程序之间有那些差别?

  • 简单说应用程序是从主线程启动(也就是main()方法)。applet小程序没有main方法,主要是嵌在浏览器页面上运行(调用init()线程或者run()来启动),嵌入浏览器这点跟flash的小游戏类似。

7、解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。

通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用 JVM 中的栈空间,栈空间最小,但是操作最快;而通过 new 关键字和构造器创建的对象则放在堆空间,堆空间最大;但是只是单纯的定义一个对象,则这个对象被放在方法区内

String a="b";//String a在栈中,b在方法区
String s1=new String("b") //String a在栈中,new String()在堆中,b在方法区里

8. switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上

在 Java 5 以前,switch(expr)中,expr 只能是 byte、short、char、int。从 Java5 开始,Java 中引入了枚举类型,expr 也可以是 enum 类型,从 Java 7 开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。


9. for 和 while的区别:

在for循环中定义的变量出了for循环就在内存中消失,提高了内存的使用效率


10. float f=3.4;是否正确

  • 不正确。3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成 float f =3.4F。

11、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?

对于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型,因此 s1+1 运算结果也是 int型,需要强制转换类型才能赋值给 short 型。而 short s1 = 1; s1 += 1;可以正确编译,因为 s1+= 1;相当于 s1 = (short(s1 + 1);其中有隐含的强制类型转换。


12、char 型变量中能不能存贮一个中文汉字,为什么?

可以,因为java使用的Unicode编码格式,一个 char 类型占 2 个字节(16 比特),一个中文占用两个字节,所以放一个中文没问题


13、数组有没有 length()方法?String 有没有 length()方法?

数组没有 length()方法 ,有 length 的属性。String 有 length()方法。JavaScript中,获得字符串的长度是通过 length 属性得到的,这一点容易和 Java 混淆。


14.== 和 equals 的区别是什么?

  • ==:比较基本类型时,比较值的大小;比较引用类型时,比较的是他们在堆内存的地址是否一致,每新new一个引用类型的对象,会重新分配堆内存空间,使用 == 比较返回false。
  • equals:引用类型:默认情况下,比较内存地址值是否相等。可以按照需求逻辑,重写对象的equals方法,来比较其内容是否一致

15. &和&&的区别

&:两种用法:按位与,逻辑与。但当两端条件前者不成立时,还会去判断后者是否成立,然后返回false

&&:逻辑与,也被称为短路运算符,当两端条件前者不成立时,直接返回为false,后者不做判断


16. final在java中的作用

  • 修饰类:表示该类不能被继承;

  • 修饰方法:表示方法不能被重写,但是,该方法仍然可以被继承

  • 修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。

    • 如果引用为基本数据类型,则该引用为常量,该值无法修改; 如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。 如果引用时是类的成员变量,则必须当场赋值,否则编译会报错。
  • 修饰参数时:表示此参数在整个方法内不允许被修改


17. final和finally,finalize的区别

  • final是java中的一个关键字,用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
  • finally是java中保证重点代码被执行的一种机制。使用finally可以维护对象的内部状态,并可以清理非内存资源。
  • finalize是Object类的一个方法,java中的回收机制,供垃圾收集时的其他资源回收

18. Java 中操作字符串都有哪些类?它们之间有什么区别?

操作字符串的类有:String、StringBuffer、StringBuilder。

  • String:字符串常量,字符串长度不可变
  • StringBuffer:字符串变量(Synchronized,即线程安全),线程效率低
  • StringBuilder:字符串变量,线程不安全,但线程效率高
  • 如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer

19. 如何将字符串反转?

  • 利用StringBuffer或StringBuilder 的reverse()方法
  • 利用 String 的 toCharArray 方法先将字符串转化为 char 类型数组,然后将各个字符进行重新拼接
  • 利用 String 的 CharAt 方法取出字符串中的各个字符,重新排序

20. 代码块的执行顺序

静态代码块>构造代码块>构造方法。且静态代码块只执行一次


21. 重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?

  • 重载:发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载

  • 重写:发生在子类与父类之间,重写要求子类方法返回值类型应比父类方法返回值类型相等或者更小,子类方法声明抛出的异常类应该比父类方法更小或相等,子类权限比父类权限大或者相等

  • 重载对于返回值类型没有特殊要求


22.抽象类必须要有抽象方法吗?

抽象类不一定有抽象方法,但有抽象方法的类一定是抽象类。因为抽象是对一类事物的最终分类概括,它无法具体到某一个事物,所以不一定需要一个方法来具体呈现,只需要声明即可。这样的意义就是该类只能当作父类被继承,而不能实例化对象


23. 普通类和抽象类有哪些区别?

抽象类必须用abstract修饰,抽象方法可以没有方法体,抽象类无法被实例化,它必须被继承才能被使用

普通类不能包含抽象方法,方法必须有方法体,类可以直接实例化,可以通过类名调用,或者有static修饰来直接调用


24. 抽象类能使用 final 修饰吗?

不能,抽象类的定义目的是类不允许直接实例化,必须被继承重写,而被final修饰的类无法被继承,直接会显示编译报错


25. 抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被 synchronized修饰?

​ 都不能,因为

  • 抽象类需要被继承完成子类重写,而静态方法无法被重写,相互矛盾
  • 本地方法是由本地代码实现的,而抽象方法无法被实现,也是相互矛盾的
  • synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是矛盾的

26. 抽象类(abstract class)和接口(interface)有什么异同?

  • 抽象类方法可以有方法体,可以实现具体的功能,而接口不行
  • 抽象类中的成员变量可以是各种类型的,而接口成员变量只能是public,static,final类型的
  • 抽象类可以含有用static修饰的方法和代码块,接口不可以
  • 一个类只能(extends)继承一个抽象类,而一个类可以( implements )实现多个接口

27. static的特点及注意事项

特点:随着类的加载而加载,优先于对象存在,被类的所有对象共享,可以通过类名调用

注意事项:被static修饰的方法内不可使用this,super关键字,且只能访问静态的成员变量和静态的成员方法;被static修饰的成员变量为静态变量,只开辟一个空间。之后对该静态变量的每一次调用或修改都将改变该变量的值并储存。


28. 静态变量和成员变量的区别

  • 所属不同
    • 静态变量属于类,所以也称为为类变量
    • 成员变量属于对象,所以也称为实例变量(对象变量)
  • 内存中位置不同
    • 静态变量存储于方法区的静态区
    • 成员变量存储于堆内存
  • 内存出现时间不同
    • 静态变量随着类的加载而加载,随着类的消失而消失
    • 成员变量随着对象的创建而存在,随着对象的消失而消失
  • 调用不同
    • 静态变量可以通过类名调用,也可以通过对象调用
    • 成员变量只能通过对象名调用

29. 成员变量之间的关系

  • 在子类方法中访问一个变量
    • 首先在子类局部范围找
    • 然后在子类成员范围找
    • 最后在父类成员范围找(肯定不能访问到父类局部范围)
    • 如果还是没有就报错。(不考虑父亲的父亲…)

注意:成员方法之间的关系与之大同小异。在子类中找,然后再父类中找,没有就报错


30.super和this的区别

  • 相同:

    • super,this都指的是对象,所以均不可在static环境下使用
    • this,super不能同时出现在一个构造函数里,因为this必然调用其他构造函数,其他的构造函数必然也会有super语句的存在,所以同一个构造方法有相同的语句,没有意义,编译也会报错
    • super()和this()都必须在构造函数的第一行进行调用,否则就是错误的
  • 不同:

    • super()主要是对父类构造函数的调用,this()是对重载构造函数的调用
    • super()主要是在继承了父类的子类的构造函数中使用,是在不同类中的使用;this()主要是在同一类的不同构造函数中的使用

31. 成员访问特点

  • 成员变量
    编译看左边,运行看左边
  • 成员方法
    编译看左边,运行看右边
  • 静态方法
    编译看左边,运行看左边
为什么成员变量和成员方法的访问不一样呢?

因为成员方法有重写,而成员变量没有


32. 构造方法能否被继承

Java中构造函数不能被继承。子类在继承父类的时候,首先运行父类构造函数,也就是说,运行子类时会先调用父类的构造函数,没有必要去继承构造方法。

构造函数的特点:
  • 构造方法名与类名相同。
  • 不能返回类型(例如return 和 void等)如果必须要return,则只写return,不用返回一个变量或一个表达式
  • 不能被static,final,native,abstract和synchronized修饰不能被继承。
  • 系统默认的构造方法是没有参数而且内容为空的构造方法。
  • 父类的构造方法不能被子类继承。
  • 当前类的构造方法可以使用this.调用。

注意:一般函数不能调用构造函数,只有构造函数才能调用构造函数。


33.对异常的理解

在Java中把所有的非正常情况分为两种:异常(Exception)和错误(Error),他们都继承Throwable父类。

  • Error:表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况
  • Exception:表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。分为编译时异常和运行时异常:
    • 运行时异常:RuntimeException类及其子类的实例被称为运行时异常,如:NullPointException
    • 编译时异常:Java程序必须显示处理,否则程序就会发生错误,无法通过编译
  • 可用try-catch语句访问异常信息,进行个性化处理

34.如果catch里面有return语句,请问finally里面的代码还会执行吗?如果会,请问在return之前还是之后 ?

如果try中碰到了return语句,那么会去finally语句,finally中没有return语句,那运行的结果不会影响值。如果有的话,那try中的return会被挂起,在执行完finally的return语句后,再去直接try中的return语句。 但是如果catch语句中遇到了System.exit(0)则finally不会执行,因为整个虚拟机已经退出了。


35.throws和throw的区别

  • throws
    • 用在方法声明后面,跟的是异常类名
    • 可以跟多个异常类名,用逗号隔开
    • 表示抛出的异常由该方法的调用者来处理
    • throws表示出现异常的一种可能性,并不一定会发生这些异常
  • throw
    • 用在方法体内,跟的是异常对象名
    • 只能抛出一个异常对象名
    • 表示抛出的异常由方法体内的语句处理
    • throw表示一定抛出了某种异常

36. Java 中 IO 流分为几种?

  • 按照数据流向
    • 输入流 读入数据
    • 输出流 写出数据
  • 按照数据类型
    • 字节流
    • 字符流

使用情况:如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就用字符流。其他用字节流。如果你什么都不知道,就用字节流。字节流是万能的!!!


37. 数组有没有 length()这个方法? String有没有length()这个方法?

数组没有 length()这个方法,有 length 的属性。String 有 length()这个方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倪行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值