Java基础

2018, Jan 11    

Java基础问题

静态成员变量和非静态成员变量的区别

保存位置: a) 静态成员变量: 方法区的静态区域 b) 非静态成员变量: 堆内存中的对象空间里面 书写格式: a) 静态成员变量: 在数据类型前面多了一个static修饰 b) 非静态成员变量: 没有static修饰 生命周期上: a) 静态成员变量: 在类加载的时候,类加载完成,就分配完空间;直到类被卸载时空间被回收 b) 非静态成员变量: 创建对象的时候分配空间; 对象变为垃圾空间被回收的时候被销毁 使用方法上: a) 静态成员变量: 直接通过类名使用 b) 非静态成员变量: 必须通过对象使用 修改后的影响范围上: a) 静态成员变量: 对该类的所有对象都有影响; b) 非静态成员变量: 只对一个对象有影响

Java的接口,抽象类,和普通类的区别

抽象类和接口的区别: (1)接口里只能包含抽象方法,静态方法和默认方法,不能为普通方法提供方法实现,抽象类则完全可以包含普通方法。

(2)接口里只能定义静态常量,不能定义普通成员变量,抽象类里则既可以定义普通成员变量,也可以定义静态常量。 (3)接口不能包含构造器,抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。 (4)接口里不能包含初始化块,但抽象类里完全可以包含初始化块。 (5) 一个类最多只能有一个直接父类,包括抽象类,但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承不足。 抽象类和接口的相似点: (1) 接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。 (2)接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法

字节流和字符流有什么区别,分别用哪个接口

实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件

object类有哪些方法?

hashcode,equals,clone,notify,wait。hashcode用在hashmap中

Java的四种引用

Java中提供了四个级别的引用:强引用,软引用,弱引用和虚引用(PhantomReference, 回收时会收到一个系统通知)

Java的String类型为什么是不可变的

String内部是依靠一个叫value的cahr数组实现的。以JDK1.6为例(JDK1.7少了offset、count) value,offset和count这三个变量都是private的,并且没有提供setValue, setOffset和setCount等公共方法来修改这些值,所以在String类的外部无法修改String。也就是说一旦初始化就不能修改, 并且在String类的外部不能访问这三个成员。此外,value,offset和count这三个变量都是final的, 也就是说在String类内部,一旦这三个值初始化了, 也不能被改变。所以可以认为String对象是不可变的了。

String 是否可以继承, “+” 怎样实现?

String 是 final 类,不可继承。’‘+ ’‘是通过 StringBuilder(或 StringBuffer) 类,和 append 方法实现。

String,StringBuffer,StringBuilder的区别,项目中哪里用到了 StringBuffer 或者 StringBuilder?

String 不可变,StringBuffer,可变,线程安全,Stringbuilder,可变,线程不安全。

static关键字有什么用,static修饰不同东西时有什么作用,内部类用static修饰和不用static修饰有何区别。

static关键字方便在没有创建对象的情况下来进行调用(方法/变量)。 1)static方法 在不创建对象的情况下调用某个方法,就可以将这个方法设置为static,通过类名来访问该方法 (另外记住,即使没有显示地声明为static,类的构造器实际上也是静态方法。) 2)static变量 static变量也称作静态变量,静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化,static成员变量的初始化顺序按照定义的顺序进行初始化。(而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。) 3)static代码块 static代码块只会在类加载的时候执行一次,static代码块形成静态代码块以优化程序性能。(在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。)

内部类用static修饰和不用static修饰有何区别: static一般用来修饰成员变量或函数也修饰代码块,一般不能修饰类,但是可以修饰内部类,被修饰的内部类可以直接作为一个普通类来用,不需要创建一个外部类的实例,而普通内部类的引用需要创建一个外部类的实例。

Java和其他语言相比有什么不同

Java 是由 C++发展而来的,保留了 C++的大部分内容,其编程方式类似于C++,比较显著的区别 1)指针,在Java 中没有指针,防止出现指针操作失误,更有利于Java程序的安全(C/C++支持指针) 2)多重继承,Java 不支持多重继承,但允许一个类实现多个接口(C++支持多重继承)

Java为什么不用多继承 :

有两个类B和C继承自A。假设B和C都继承了A的方法并且进行了覆盖,编写了自己的实现。假设D通过多重继承继承了B和C,那么D应该继承B和C的重载方法,那么它应该继承哪个的呢?是B的还是C的呢? 而对于接口来说,这种情况就不存在了。 即便两个接口中存在相同的抽象函数。但在实现时,我们只能在当前类中实现一个这样的函数,所以不论是实现的哪个,另外一个同名的也就无所谓了。于是,java就是多实现的了。

C++如何解决多继承带来的二义性(钻石问题):类名限定、同名覆盖等措施

3)数据类型,Java 是完全面向对象的语言,所有方法和数据都必须是类的一部分。除了基本数据类型之外,其余类型的数据都作为对象型数据(C++将函数和变量定义为全局的,然后再来调用这些函数和变量) 4)自动内存管理,Java 自动进行无用内存回收操作(C++中必须由程序释放内存资源,增加了程序设计者的负担) 5)操作符重载,Java 不支持操作符重载,保持 Java 语言尽可能简单(操作符重载被认为是 C++的突出特征) 6)Java 没有函数,作为一个比 C++更纯的面向对象的语言。Java 强迫开发人员把所有例行程序包括在类中。事实上,用方法实现例行程序可激励开发人员更好地组织编码。 7)字符串,C 和 C++不支持字符串变量 8)类型转换,Java 不支持 C++中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。

Java和C相比什么区别

1)C语言是面向过程的语言,执行效率高;Java是面向对象的语言,执行效率比C语言低。 2)C语言最关键的是比Java多了指针,这也说明了Java的健壮性(优势),还有Java的多线程机制使程序可以并行运行,Java程序多用于网络。 3)C语言的安全性不如Java,C语言没有Java的垃圾回收机制,申请的空间要手动释放(优势)。 4)Java的通用性好(优势),可以跨平台直接移植,只要有安装Java虚拟机(JVM)就可以了。 5)当开发规模膨胀到一定程度,Java在规范、协作和性能调优上还是占有很大优势,在大型应用,尤其是企业应用上,Java的地位仍然难以撼动(优势)

Java为什么平台无关?

Java程序在一个计算机上编译得到的字节码文件(就是.class文件),可以复制到任何一个安装了Java运行环境的计算机上直接运行。然后字节码文件由虚拟机负责解释执行,即Java虚拟机将字节码翻译成本地计算机的机器码,然后将机器码交给本地的操作系统运行。

Java为什么说是面向对象的?

因为Java有面向对象的三大特性(也是Java的三大特性):封装、继承和多态。 封装-一个对象通常由一组属性和对这组属性进行操作的若干服务(方法)构成 继承-一个对象从另一个对象中获得属性和方法的过程,继承者称为子类,被继承者称为父类。 (父类的私有属性能否被继承?多态-是在继承的基础上实现的,多态实现的三个必要条件:继承、方法重写(override)、父类引用指向子类对象

平常用到全局变量吗?为什么不用呢?

我们知道全局变量分为静态变量和实例变量,静态变量也可以保证该类的实例只存在一个。 只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。 但是,如果说这个对象非常消耗资源,而且程序某次的执行中一直没用,这样就造成了资源的浪费。利用单例模式的话,我们就可以实现在需要使用时才创建对象,这样就避免了不必要的资源浪费。 不仅仅是因为这个原因,在程序中我们要尽量避免全局变量的使用,大量使用全局变量给程序的调试、维护等带来困难。