准备面试的第一天

Java程序从源代码到运行有三步:

准备面试的第一天

JVM(Java虚拟机)是运行Java字节码(.class)文件的虚拟机,将字节码编译成机器可执行的二进制机器码。JVM有针对不同操作系统的实现,目的是使得相同的字节码有着相同的运行结果。字节码和不同系统的JVM的实现是Java语言“一次编译,随处可以运行”的关键所在。

JDK和JRE

JDK(Java Development Kit)是功能齐全的Java SDK,拥有JRE所拥有的一切,还拥有javac编译器和其他的一些工具javadoc和jdb等,它可以创建和编译程序。

JRE(Java Runtime Environment)是Java运行时环境,它是运行已编译Java程序的所有所需内容的集合。如果只是要运行Java程序,只需要JRE就够了。

Java和C++的区别

  • 都是面向对象编程的语言,有封装、继承、多态的特点
  • Java不支持指针访问内存,程序内存更加安全
  • Java的类是单继承的,C++支持多继承,不过Java支持多个类实现一个接口
  • Java存在内存管理机制,不需要程序员手动释放内存

Java基本类型大小

准备面试的第一天
8bit = 1字节

构造器Constructor不能子类重写,可以重载,一个类中可以有多个构造函数。

重载和重写的区别

  • 重载: 发生在一个类中,重载的函数方法名必须相同,参数类型、个数、顺序可以不同,方法返回类型和访问修饰符可以不同。其中方法名和参数称为方法的签名,返回类型不是方法的签名,也就是说,不可以有两个方法名相同,参数也相同但是却返回不同类型值的方法。
  • 重写: 重写是子类对父类允许访问的方法的实现过程重新编写,发生在子类中,方法的签名(方法名,参数类型)必须完全相同,返回值必须小于等于父类的返回值类型,抛出的异常小于等于父类,访问修饰符的范围大于等于父类。

封装、多态、继承:Java面向对象编程三大特性

  • 封装: 把一个对象的属性私有化,向外部提供一系列访问这些属性的公有方法。如果不想给外部访问就不用提供访问它的方法,但是这样这个属性也就没有什么意义了。
  • 继承: 使用已存在的类作为基础建立新的类,新类不能选择性的继承父类的方法和属性,只能给什么就继承什么,新类可以增加新的属性和方法。(注意:子类拥有父类所有的属性和方法,但是父类中的私有方法和私有属性子类只是拥有但是无法访问和使用!
  • 多态: 指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行时才会确定。实现有继承(多个子类对同意方法的重写)和接口(多个类实现接口并覆盖接口中同一方法)。

创建一个子类时,父类和子类中代码执行顺序

父类静态代码块—子类静态代码块—父类非静态代码块—父类构造函数—子类非静态代码块—子类构造函数
(注意:在一个程序中静态代码块只会在第一次调用构造方法的时候调用一次,之后就不会调用了。构造函数执行的是哪个要看new的是谁)

String、StringBuffer、StringBuilder的区别是什么,String为什么是不可变的?

不可变:String类中用final关键字修饰字符数组来保存字符串,private final char[] value,而StringBuffer和StringBuilder都是继承自AcstractStringBuilder类, 在AcstractStringBuilder类中也是使用字符数组来保存字符串char[] value但是没用用final修饰,所以这两个对象是可变的。
线程安全性:String中的对象是不可变的可以理解为常量,现成安全。StringBuffer对父类的方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加锁,所以是非线程安全的。
性能:每次对String类型进行改变的时候就会生成一个新的String对象,然后将指针指向新的String对象。Stringbuffer和StringBuilder都是对本身对象进行操作,相同情况下StringBuilder相比使用StringBuffer只能获得10%-15%的性能提升,却要多付出线程不安全的风险。

自动装箱与拆箱

装箱:将基本数据类型用它们对应的引用类型包装起来
拆箱:将包装类型转换为基本数据类型

在一个静态方法内调用一个非静态成员可以吗?

不可以。因为静态方法可以不通过具体的实例对象调用,而非静态成员或者方法或者非静态变量需要通过具体的对象来调用,所以不能调用非静态变量,也不可以访问非静态变量成员。

Java中定义一个没有参数且不做事的构造函数的作用?

在Java的类中会默认有一个没有参数没有内容的构造函数来供创建对象使用,但是如果写了一个带有参数的构造函数,这个默认没有参数的构造函数就不存在了,需要自己把他写出来才可以使用。