Java基础

1、&和&&的区别:
& && 都可以用作逻辑与的运算符,表示逻辑与(
and ),当运算符两边的表达式的结果都为 true 时,整个运算结果才为 true
否则,只要有一方为 false ,则结果为 false
&& 还具有短路的功能,即如果第一个表达式为 false ,则不再计算第二个表达式,例如,对于
if(str != null && !str.equals( “” ))
表达式,当 str null 时,后面的表达式不会执行,所以不会出现 NullPointerException 如果将 && 改为 & ,则会抛出 NullPointerException
常。 If(x==33 & ++y>0) y 会增长, If(x==33 && ++y>0) 不会增长
& 还可以用作位运算符,当 & 操作符两边的表达式不是 boolean 类型时, & 表示按位与操作,我们通常使用 0x0f 来与一个整数进行
& 运算,来获取该整数的最低 4 bit 位,例如, 0x31 & 0x0f 的结果为 0x01

 

2、 八种基本数据类型的大小,以及他们的封装类:
        
整型:byte、short、int、long   
浮点型:float、double
其他:char、boolean
封装类:Byte、Short、Integer、Long、Float、Double、 Character、Boolean
3、 switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上?
switch
expr1 )中, expr1 只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是 int 基本类型或 Integer 包装
类型,由于, byte,short,char 都可以隐含转换为 int ,所以,这些类型以及这些类型的包装类型也是可以的。显然, long String 类型
都不符合 sitch 的语法规定,并且不能被隐式转换成 int 类型,所以,它们不能作用于 swtich 语句中 ( 之前的回答是这样的 )
但是 JDK1.7之后, switch 也支持了 String
4 、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
对于 short s1 = 1; s1 = s1 + 1; 由于 s1+1 运算时会自动提升表达式的类型,所以结果是 int 型,再赋值给 short 类型 s1 时,编译器将
报告需要强制转换类型的错误。
对于 short s1 = 1; s1 += 1; 由于 += java 语言规定的运算符, java 编译器会对它进行特殊处理,因此可以正确编译。

5、 char 型变量中能不能存贮一个中文汉字?为什么?

char 型变量是用来存储 Unicode 编码的字符的, unicode 编码字符集中包含了汉字,所以, char 型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在 unicode 编码字符集中,那么,这个 char 型变量中就不能存储这个特殊汉字。补充说明: unicode
编码占用两个字节,所以, char 类型的变量也是占用两个字节。
备注:后面一部分回答虽然不是在正面回答题目,但是,为了展现自己的学识和表现自己对问题理解的透彻深入,可以回答一些
相关的知识,做到知无不言,言无不尽。
6、 使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:
final StringBuffer a=new StringBuffer("immutable");

 执行如下语句将报告编译期错误:

a=new StringBuffer("");

 但是,执行如下语句则可以通过编译:

a.append(" broken!");

有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象: 

public void method(final StringBuffer param)
{
}

 

实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象: 

param.append("a"); 

7、  "=="和 equals 方法究竟有什么区别?

(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚)

 ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类

型的数据或两个引用变量是否相等,只能用 == 操作符
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内
存,例如:
Objet obj = new Object();
变量 obj 是一个内存, new Object() 是另一个内存,此时,变量 obj 所对应的内存中存储的数值就是对 象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存
中的数值是否相等,这时候就需要用 == 操作符进行比较
equals 方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,
对于下面的代码:
String a=new String("foo");
String b=new String("foo");
两条 new 语句创建了两个对象,然后用 a,b 这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的, 即 a b 中存储的数值是不相同的,所以,表达式 a==b 将返回 false ,而这两个对象中的内容是相同的,所以,表达式 a.equals(b)将返回 true
在实际开发中,我们经常要比较传递进来的字符串内容是否等,例如,
String input = …;input.equals(“quit”)
许多人稍不注意就使用 == 进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上
都是使用 equals 方法。
如果一个类没有自己定义 equals 方法,那么它将继承 Object 类的 equals 方法, Object 类的 equals 方法的实现代码如下
boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义 equals 方法,它默认的 equals 方法(从 Object 类继承的)就是使用 == 操作符,也是在比较两
个变量指向的对象是否是同一对象,这时候使用 equals 和使用 == 会得到同样的结果,如果比较的是两个独立的对象则总返回 false 。如
果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖 equals 方法,由你自己写代码来决定在什么情
况即可认为两个对象的内容是相同的。
8、 静态变量和实例变量的区别?
在语法定义上的区别:静态变量前要加 static 关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实
例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静
态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直
接使用类名来引用。
例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个 staticVar 变量,并且每创建一个实例对象,这个 staticVar
就会加 1 ;但是,每创建一个实例对象,就会分配一个 instanceVar ,即可能分配多个 instanceVar ,并且每个 instanceVar 的值都只自加了 1 次
public class VariantTest {
public static int staticVar = 0
public int instanceVar = 0;
public VariantTest() {
staticVar++;
instanceVar++;
System.out.println(
staticVar= + staticVar + ,instanceVar= + instanceVar);
        }
}
这个解答除了说清楚两者的区别外,最后还用一个具体的应用例子来说明两者的差异,体现了自己有很好的解说问题和设
计案例的能力,思维敏捷,超过一般程序员,有写作能力!
9、 Integer 与 int 的区别? 
int java 提供的 8 种原始数据类型之一。 Java 为每个原始类型提供了封装类, Integer java int 提供的封装类。
int 的默认值为
0 ,而 Integer 的默认值为 null ,即 Integer 可以区分出未赋值和值为 0 的区别, int 则无法表达出未赋值的情况,例如,要想表达出没有
参加考试和考试成绩为 0 的区别,则只能使用 Integer 。在 JSP 开发中, Integer 的默认为 null ,所以用 el 表达式在文本框中显示时,值
为空白字符串,而 int 默认的默认值为 0 ,所以用 el 表达式在文本框中显示时,结果为 0 ,所以, int 不适合作为 web 层的表单数据的
类型。
Integer 提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数, Integer 中还定义了表示整数的最大值和最小值的常

 

10、 作用域 public,private,protected,以及不写时的区别
这四个作用域的可见范围如下表所示。
说明:如果在修饰的元素上面没有写任何访问修饰符,则表示 friendly
作用域
当前类
同一 package 子孙类
其他 package
public
√   √   √   √
protected
√   √   √   ×
friendly
√   √   ×   ×
private
√   ×   ×   ×
只要记住了有 4 种访问权限, 4 个访问范围,然后将全选和范围在水平和垂直方向上分别按排从小到大或从大到小的顺序
排列,就很容易画出上面的图了。

 

11、 Overload 和 Override 的区别。Overloaded 的方法是否可以改变返回值的类型?
Overload 是重载的意思, Override 是覆盖的意思,也就是重写
重载 Overload 表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。
重写 Override 表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。
至于 Overloaded 的方法是否可以改变返回值的类型这个问题,要看你倒底想问什么呢?这个题目很模糊。如果几个 Overloaded 的方法的参数列表不一样,它们的返回者类型当然也可以不一样。但我估计你想问的问题是:如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载 Override。这是不行的,我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用 map.remove(key) 方法时,虽然 remove 方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同, java 就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。

12、 构造器 Constructor 是否可被 override?

构造器 Constructor 不能被继承,因此不能重写 Override,但可以被重载 Overload

13、 面向对象的特征有哪些方面

计算机软件系统是现实生活中的业务在计算机中的映射,而现实生活中的业务其实就是一个个对象协作的过程。面向对象编程就是按现实业务一样的方式将程序代码按一个个对象进行组织和编写,让计算机系统能够识别和理解用对象方式组织和编写的程序代码,这样就可以把现实生活中的业务对象映射到计算机系统中。
面向对象的编程语言有封装、继承 、多态等 3 个主要的特征

14、abstract class 和 interface 有什么区别?
含有 abstract 修饰符的 class 即为抽象类,abstract 类不能创建的实例对象。含有 abstract 方法的类必须定义为 abstract class,abstract class 类中的方法不必是抽象的。abstract class 类中定义抽象方法必须在具体子类中实现,所以,不能有抽象构造方法或抽象静态方法。
如果子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为 abstract 类型。
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口 中的方法定义默认为 public abstract 类型,接口中的成员变量类型默认为 public static final。
下面比较一下两者的语法区别:

1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是 public,protected 和默认类型,但接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是 public static 类型,并且默认即为 public static 类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。


下面接着再说说两者在应用上的区别:
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有 Servlet 类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的 Servlet 都继承这个抽象基类,在抽象基类的 service 方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码,伪代码如下:

public abstract class BaseServlet extends HttpServlet{
public void service(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException {
记录访问日志
进行权限判断
if(具有权限) {
try {
doService(request,response);
}
catch(Excetpion e) {
记录异常信息
}
}
}
protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException;
//注意访问权限定义成 protected,显得既专业,又严谨,因为它是专门给子类用的
}
public class MyServlet1 extends BaseServlet
{
protected void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException
{
本 Servlet 只处理的具体业务逻辑代码
}
}

父类方法中间的某段代码不确定,留给子类干,就用模板方法设计模式。 

这道题的思路是先从总体解释抽象类和接口的基本概念,然后再比较两者的语法细节,最后再说两者的应用区别。比较两
者语法细节区别的条理是:先从一个类中的构造方法、普通成员变量和方法(包括抽象方法),静态变量和方法,继承性等 6 个方面
逐一去比较回答,接着从第三者继承的角度的回答,特别是最后用了一个典型的例子来展现自己深厚的技术功底。
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值