Java基础知识汇总系列(二)

1.String,StringBuffer,StringBuilder三者的区别

String是字符串常量,内容创建后不可变,每一次修改内容,都会在内存中new一个对象出来,然后指向这个新的对象;StringBuffer和StringBuilder是字符串变量,内容创建后可以变化;在使用StringBuffer和StringBuilder时可以适当考虑一下初始化大小,通过减少扩容次数来提高代码运行效率。

StringBuffer是线程安全的,StringBuild不是线程安全的,线程安全会带来额外的系统开销,所以StringBuilder的执行效率要高于StringBuffer。

2.String不可变的原因

在JDK中将String类声明为final类,而且类内部的value字节数组也是final的。因为字符串的不可变,实现了字符串池,而字符串池的实现可以在运行时节约许多的堆空间,因为不同字符串变量都指向同一个字符串池中的同一个字符串。

3.String s = "Hello World" 和 String s = new String("Hello World")的区别

String s = "Hello World"在编译期间生成了字面常量和符号引用,运行期间字面常量"Hello World"被保存在了方法区中的运行时常量池中(只有一份儿);

String s = new String("Hello World")生成的对象保存在堆中,堆中生成的对象不会检查该对象是否已经存在,所以会创建不同的对象,即使字符串的内容是相同的。

4.String的 + 和 += 操作在编译后会自动优化为StringBuilder和append调用,所以在循环下使用+或+=操作,就是不停的调用new StringBuilder对象和append了,是一种浪费。

5.面向对象的特征

继承:继承性是类的一种层次模型,其提供了一种明确表述共性的方法,对象的新类可以从现有的类中继承派生,类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

封装:封装性是把过程和数据包围起来,使得数据的访问只能通过已定义的接口,保证了对象被访问的隐私性和可靠性。

多态:多态性是对象在不同时刻表现出来的多种状态,是一种编译时期状态和运行时期状态不一致的现象,多态性包括参数化多态性和包含多态性。

抽象:抽象性是指对一类事物的高度提炼以得到共同的共性部分,抽象不需要了解全部细节,而只是一种通用的描述约束,抽象可以是过程抽象或者数据抽象。抽象类是对类的抽象,接口是对行为的抽象。

6.重载与重写

重载使多个具有不同参数个数或者类型的同名函数存在于同一个类中(返回值类型可随便定义,因为不以返回值类型作为重载函数的区分标准),调用方法时通过传递不同参数个数和参数类型来决定具体使用哪个方法,是多态性的一种表现形式。

重写是父类与子类之间的多态性,实质是对父类中的函数进行重新定义,不过子类函数的访问权限不能小于父类函数的访问权限。

重载与重写是Java多态性的不同表现,重写是父类与子类之间的多态性的体现,在运行时起作用(动态多态性),重载是一个类中的多态性的提现,在编译时起作用(静态多态性)。

7.构造函数的重写与重载

因为Java中的构造函数与Java类名保持一致,因为父类与子类的类名不可能一样,所以不存在构造函数被重写的问题,但是可以根据参数的个数和类型对构造函数进行重载。

8.final,static,static final之间的区别

final可以修饰属性,方法,类,局部变量,修饰属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变;修饰属性表示其为一个常量,修饰方法表示该方法不能被子类重写,修饰类表示该类不能被继承。

static可以修饰属性,方法,代码段,内部类(静态内部类或嵌套内部类),修饰属性的初始化在编译期,初始化后可以修改值;修饰的属性,方法,代码段该类的具体对象无关,可直接通过类调用方法,参数等;static不可以修饰局部变量。

static final 是组合修饰,static修饰的属性表示它们只有一个,final修饰的属性表示它是一个常数,不可被修改。static final 修饰的属性表示一旦给值就不可修改并且可以通过类名访问,static final 也可以修饰方法,表示该方法不能重写,可以在不 new 对象的情况下调用。

9.代码块的定义,代码块的分类,作用是什么

代码块就是用{}将多行代码封装在一起形成一个独立的数据体,用于实现特定的需求,一般来说代码块不能独立运行的,必须要有运行主体。

(1)普通代码块(局部代码块)

        在方法名后面用 {} 括起来的代码段,不能够单独存在,必须要紧跟在方法名后面且必须使用方法名调用它,作用是限定变量的生命周期和提高效率。

(2)构造代码块

        在类中方法外用{}括起来的代码,作用是把所有构造方法中相同的内容抽象出来,在调用构造方法时会自动调用构造代码块,构造代码块优先与构造函数执行。

(3)静态代码块

        静态代码块是在类中方法外用 {} 括起来且添加了 static 前缀修饰的代码,作用是随着类的加载而加载且只加载一次。

(4)同步代码块

        同步代码块是方法中使用 synchronized 关键字修饰并使用 {} 括起来的代码片段,表示同一时间只能有一个线程进入到该代码块中,作用是一种多线程并发保护机制。

10.静态代码块,构造代码块,构造方法的执行顺序

静态代码块作用于类级别,随着类的加载而被执行,而且只会执行一次,主要用于给类进行初始化;

构造代码块作用于对象级别,每创建一个对象都会执行一次,而且构造代码块优先于构造函数执行,用于初始化不同对象共同的初始化内容和初始化实例环境;

构造方法也作用于对象级别,每一次创建对象时执行一次,构造方法是对特定的对象进行初始化,构造代码块对所有的对象进行初始化;

执行顺序:静态代码块 > 构造代码块 > 构造方法。

猜你喜欢

转载自blog.csdn.net/zai_xia/article/details/81670988