java程序从源代码到运行一般有3步: .java的源文件通过JDK的javac命令转换为jvm能够理解的.class文件(字节码),之后再由jvm将.class编译成为机器可执行的二进制码。
jvm针对不同的系统操作有着特定的实现方式,目的是使用相同的字节码,它们都会给出相同的结果。也就能够保证说Java程序无须重新编译便可在多种不同操作系统的计算机上运行。(.class是相同的,不同的只不过是jvm在不同的环境中的实现)
java的8个基本类型(byte和short不要忘记!!!):
构造器是不能够被重写(override,子类重新父类方法)的,但是可以被重载(overload本类中,同一个函数名的传参不同)。
面向对象的三大特性:
封装:
简单的理解就是让外部类不能够直接访问成员变量,让成员变量私有化,同时提供一些可以被外界访问的属性的方法。(提高安全性)
继承:
子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有。
子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法。(override重写)。
多态:
多态主要就是利用继承父类或者实现接口来实现,主要就是重写override方法(披着羊皮的狼–穿着父亲的衣服,干着父亲干的事情,但是行为举止还是儿子),调用方法在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
String StringBuffer StringBuilder区别:
String 是利用 private final char value[] 来存储对象的,由于被final修饰了,所以一旦被创建了就是不可变的。
而StringBuffer和StringBuilder都是继承了AbstractStringBuilder,都是利用char[]value 来存储对象,没有用 final 关键字修饰,可变。
其中StringBuffer对方法加了同步锁或者对调用的方法加了同步锁(基本都是在方法上synchronized,为了提高toString的效率,还利用了一个private transient char[] toStringCache;),所以是线程安全的。而StringBuilder非线程安全。
String在利用+操作时,会将对象先转换为StringBuilder,在数据量大的情况下效率极低。
接口与抽象类的区别:
接口的方法默认为public,jdk1.8开始能够有默认实现。而抽象类可以有抽象方法和非抽象方法。
接口中除了static、final变量,不能有其他变量,而抽象类中则不一定。
接口方法默认修饰符是public,抽象方法可以有public、protected和default这些修饰符(抽象方法就是为了被重写所以不能使用private关键字修饰!)。
从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范(抽象类需要继承–所以是类层面的,而实现接口需要的是重写接口方法,所以是行为上的)。
局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰。
在调用子类的构造方法前,会先调用父类的无参数构造
hashCode()与equals()的相关规定:
1.如果两个对象相等,则hashcode一定也是相同的
2.两个对象相等,对两个对象分别调用equals方法都返回true
3.两个对象有相同的hashcode值,它们也不一定是相等的
4.因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖
5.hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)
final关键字:
对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。
使用final方法,把方法锁定,以防任何继承类修改它的含义;
对于不想进行序列化的变量,使用transient关键字修饰。
transient关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被transient修饰的变量值不会被持久化和恢复。transient只能修饰变量,不能修饰类和方法。