第一题:说说&和&&的区别
&和&&都可以用作逻辑与的运算符,表示逻辑与(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)不会增长
第⼆题:char 型变量中能不能存贮一个中文汉字?为什么?
要分析char这个容器的大小和一个汉字的大小.要分 析汉字的大小就要分析编码方式和编码字符集.
java默认编码Unicode,char占两个字节,而汉字也是 占两个字节,所以可以存储一个汉字,如果是字符集中 不包含的汉字就不能存储了.
如果编码方式不是unicode编码集,比如utf8,一个汉 字占3个字节
第三题:”==”和 equals 方法究竟有什么区别
一、对象类型不同
1、equals():是超类Object中的方法。
2、==:是操作符。
二、比较的对象不同
1、equals():用来检测两个对象是否相等,即两个对象的内容是否相等。
2、==:用于比较引用和比较基本数据类型时具有不同的功能。
三、运行速度不同
1、equals():没有==运行速度快。
2、==:运行速度比equals()快,因为==只是比较引用。
扩展资料:
equals()和==的源码定义:
public boolean equals(Object obj) {
return (this == obj);
}
由equals的源码可以看出这里定义的equals与==是等效的(Object类中的equals没什么区别),不同的原因就在于有些类(像String、Integer等类)对equals进行了重写。
但是没有对equals进行重写的类就只能从Object类中继承equals方法,其equals方法与==就也是等效的,除非在此类中重写equals。
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
1、比较的是操作符两端的操作数是否是同一个对象。
2、两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。
3、比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为true,如:
int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆
equals:
equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。
String s=”abce”是一种非常特殊的形式,和new 有本质的区别。它是java中唯一不需要new 就可以产生对象的途径。
以String s=”abce”;形式赋值在java中叫直接量,它是在常量池中而不是象new一样放在压缩堆中。这种形式的字符串,在JVM内部发生字符串拘留,即当声明这样的一个字符串后,JVM会在常量池中先查找有有没有一个值为”abcd”的对象。
如果有,就会把它赋给当前引用.即原来那个引用和现在这个引用指点向了同一对象,如果没有,则在常量池中新创建一个“abcd””,下一次如果有Strings1=”abcd”;又会将s1指向“abcd”这个对象,即以这形式声明的字符串,只要值相等,任何多个引用都指向同一对象。
而String s=new String(”abcd”);和其它任何对象一样.每调用一次就产生一个对象,只要它们调用。
也可以这么理解:String str=”hello”;先在内存中找是不是有“hello”这个对象,如果有,就让str指向那个“hello”。
如果内存里没有”hello”,就创建一个新的对象保存”hello”.String str=new String(“hello”)就是不管内存里是不是已经有”hello”这个对象,都新建一个对象保存”hello”
第四题: ˖静态变量和实例变量的区别
静态变量也称作类变量,声明的时候用static关键字修饰
随着类的加载而加载,只要类加载了字节码文件,不需要创建对象就会被分配空间,可以被调用,不论创建多少对象只会初始化一次
实例变量也称为对象变量
随着对象的创建被被加载,创建对象才会分配空间,才能被调用,每次创建对象都会被初始化一次
第五题:是否可以从一个 static 方法内部发出对非 static 方法的调用
不可以,因为static方法随着类的加载而加载,而非static方法是随着对象的创建被加载的,也就是说static方法要先于非static方法加载的,
第六题:Integer 与 int 的区别
Integer是int的包装类,是一个对象.可以赋值为null,而int则不可以.
Integer可以在未赋值的情况下使用,int不可以
第七题:Overload 和 Override 的区别。Overloaded 的方法 是否可以改变返回值的类型?
Overload 是重载的意思,Override 是覆盖的意思,也就是重写。
重载 Overload 表示同一个类中可以有多个名称相同的方法,但这些 方法的参数列表各不相同(即参数个数或类型不同)。
重写 Override 表示子类中的方法可以与父类中的某个方法的名称和 参数完全相同,通过子类创建的实例对象调用这个方法时,将调用 子类中的定义方法,这相当于把父类中定义的那个完全相同的方法 给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父 类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的 异常的子异常,因为子类可以解决父类的一些问题,不能比父类有 更多的问题。子类方法的访问权限只能比父类的更大,不能更小。 如果父类的方法是 private 类型,那么,子类则不存在覆盖的限制, 相当于子类中增加了一个全新的方法。
至于 Overloaded 的方法是否可以改变返回值的类型这个问题,要看 你倒底想问什么呢?这个题目很模糊。
如果几个 Overloaded 的方法 的参数列表不一样,它们的返回者类型当然也可以不一样。
但我估 计你想问的问题是:如果两个方法的参数列表完全一样,是否可以 让它们的返回值不同来实现重载 Overload。这是不行的,我们可以 用反证法来说明这个问题,因为我们有时候调用一个方法时也可以 不定义返回结果变量,即不要关心其返回结果,例如,我们调用 map.remove(key)方法时,虽然 remove 方法有返回值,但是我们通 常都不会定义接收返回结果的变量,这时候假设该类中有两个名称 和参数列表完全相同的方法,仅仅是返回类型不同,java 就无法确 定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型 来判断。
第八题:java中接口的进化之路
Java7中的接口:抽象方法+常量
常量必须是public static final修饰的,默认也是此修饰的
Java8中的接口:抽象方法+常量+默认方法+静态方法
默认方法必须是public default修饰的,默认也是此修饰的
静态方法必须是public static修饰的,默认也是此修饰的
**Java9中接口:抽象方法+常量+默认方法+静态方法+私有方法+私有静态方法
私有方法可以定义成员看不到的方法,也可以用内部类的方式实现
private和abstract不能同时使用,两者冲突