开篇语:这篇文章是 java面试那件小事  系列文章的第一篇。该系列的文章将所有的读者都想象成是一个初学者,由浅入深的引入java相关的一些问题。这些问题都是sandeziVIP和朋友一起整理,或在群里或在论坛或查阅网络收集的一些出现频率较高且重要,当然也是必须要掌握的内容。如果你认为i你已经超出初学者了,却不是很懂每篇文章开头引入的几个问题,请把自己重归到初学者的行列。

java基础知识篇将涉及到 面向对象基本,操作符,控制执行流程以及初始化相关的内容。

问题:

  1. 面向对象的特征有哪些方面?
  2. Integer与int的区别?
  3. short num = 1;num = num+1;有什么错?short num =1 ; num +=1;有没有错?
  4. &和&&的区别?以及用最有效率的方法算出2乘以8等于几
  5. 静态变量和实例变量的区别
  6. equals()和==到底有什么区别?
  7. Overloaded和Override的区别。Overloaded的方法是否可以改变返回值的类型?
  8. fianl,finally,finalize的区别?
分析和解答:
 面向对象的特征有哪些方面?
学习java一开始接触的概念应该就是面向对象了,那么什么是面向对象,面向对象有哪些特点,面向对象编程有哪些好处?提到面向对象,诸如此类的问题一定也会扑面而来,但是个人认为面向对象毕竟是一种思想,没有长期的接触应用和体会还是很难用简短的文字去告诉你有关面向对象的这样那样的问题。但有一点可以肯定,熟记面向对象的特征,对你日后逐步深化面向对象的理解有很大的帮助。所以这一部分我还是以教科书的方式给出官方的答案:

 

  • 抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
  • 继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
  • 封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
  • 多态性:多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
基本理清这方面的概念之后,推荐大家看看这篇文章:程序员必备的七大面向对象原则

Integer与int的区别?

Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。在jsp开发中,Integer的默认值为null,所以用el表达式在文本框中显示时,值为null;而int默认为0,所以在el表达式在文本框中显示时,结果为0,所以int不适合作为web层的表单数据的类型(具体见下表)。

 

基本类型大  小最小值最大值封装类型
booleanBoolean
char16bits(2字节)Unicode 0Unicode 2^16-1Character
byte8bits(1字节)-128127Byte
short16bits(2字节)-2^15+2^15-1Short
int32bits(4字节)-2^31+2^31-1Integer
long64bits(8字节)-2^63+2^63-1Long
float32bits(4字节)IEEE754标准IEEE754Float
double64bits(8字节)IEEE754IEEE754Double

 

  • 所有数值类型都有正负号,所以不要去寻找无符号的数值类型
  • boolean类型所占用存储空间的大小没有明确指定,仅定义为能够取字面值true或false
short num = 1;num = num+1;有什么错?short num =1 ; num +=1;有没有错?
short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型,这样子才可以正确的编译)  short s1 = 1; s1 += 1;(可以正确编译)

&和&&的区别?以及用最有效率的方法算出2乘以8等于几
&和&&都可以作为逻辑运算符,表示逻辑与(and),当运算符两边的表达式结构都为true时,运算结果才为true,否则,只要有一方为false,则结果为false。

 

&&又叫做短路与,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于 if(!str=null&&!str.equals(""))表达式,当str为null时,后面的表达式不会执行,所以就不会出现NullPoninterException异常,如果将&&改为&,则会抛出空指针异常。

&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作。

2<<3应该是2*8的最有效率的运算方式。因为,将一个数左移n位,就相当于乘以了2的n次方,那么一个数乘以8只要将其左移3位即可。而位运算(<<)是cpu支持的,效率也就最高。

静态变量和实例变量的区别?

有static关键字修饰的变量叫做静态变量,因为其创建只是作为整个类而不是某个特定对象而存在,所以也叫做类变量。反之没有被static修饰的变量则叫做实例变量。

类变量和实例变量的区别:

 

  1. 一个static变量对每个类来说只有一份存储空;而非static变量(实例变量)则是对每个对象都有一个存储空间
  2. static变量即可以通过一个对象去定位它,也可以空过其类名直接引用;而对于非static变量则只能通过对象去引用
看下面这个例子:
class TestStatic{
    
static int i = 5;
}
现在创建两个TestSatic对象
TestStatic ts1 
= new TestStatic();
TestStatic ts2 
= new TestStatic();
这里 ts1.i 和 ts2.
1 指向同一存储空间,因此他们具有相同的值5
如果要引用static变量i的话,既可以通过一个对象去定位,如同ts1.i;也可以通过其类名直接引用,如TestStatic.i,这个对于非静态变量时非法的

 

equals()和==到底有什么区别?

==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。

equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

==比较的是2个对象的地址,而equals比较的是2个对象的内容。

深入了解此题详见sandeziVIP早前的博文:从equals和==说起

Overloaded和Override的区别。Overloaded的方法是否可以改变返回值的类型?

overloaded表示重载,即在类中可以创建多个方法,它们具有相同的方法名,但具有不同的参数类型列表;Override表示重写,即子类中定义了与基类中具有相同名称和参数列表的方法,此时基类的中的该方法将被隐藏。

深入了解此题详见sandeziVIP的博文 :关于java方法的重载(Overloading),覆写(Override)以及final 方法的几点说明

fianl,finally,finalize的区别?

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

PS:

本系列文章都遵循永久更新原则,发现新的东西都会及时加入,所以依旧希望大家积极讨论,不吝赐教。

另遇到问题较为繁琐且重要都会单独成文以说明之。