1. String相关
static String E = "abc";
String B = "a" + "bc";
String C= new String("abc");
String D="a" + new String("bc");
String F = new String("abc");
System.out.println(A==B);//true 地址一样
System.out.println(A==C);//false
System.out.println(A==D);//false
System.out.println(A==E);//true 地址一样
System.out.println(C==F);//false 地址不一样 每次new都产生新的地址
System.out.println(A.equals(B));//true 二者内容一样
System.out.println(A.equals(C));//true
System.out.println(A.equals(D));//true
System.out.println(A.equals(E));//true
String hello = "hello";
String s1 = "hel";
String s2 = "lo";
System.out.println(hello == "hel" + "lo"); //true 地址一样
System.out.println(hello == "hel" + s2); //false "hel" +s2 虽然内容也是"hello",但是它将在堆里面生成一个"hello"对象,并返回这个对象
String s1 = "abc"; //创建一个或者0个对象,如果缓冲区已有"abc",则不创建,直接拿来用,反之则创建一个“abc”
String s2 = new String("abc"); //创建一个或者2个对象,如果缓冲区已有"abc",则new创建一个对象
//如果缓冲区还没有"abc",则创建“abc”,然后再new一个,一共2个对象
String s1 = "abc";
String s2 = "a";
String s3 = "bc";
String s4 = s2 + s3;
System.out.println(s1 == s4); // false, java中字符串相加,内部是使用StringBuilder的append()和tostring()方法实现的,toString()使用了构造函数,地址重新生成
String str = "abc";
str.substring(3);
str.concat("123");
System.out.println(str); //结果是"abc". 由于字符串是常量(内存中创建对象后不能修改), 该类中所有方法都不会改变字符串的值. 如果希望使用一个可变的字符串, 可以使用StringBuilder或StringBuffer类.
2. &与&&的区别
&和&&都可以用作逻辑与的运算符,表示逻辑与(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。
3. switch语句能否作用在String上
在 Java 7之前,switch 只能支持 byte、short、char、int或者其对应的封装类以及 Enum 类型。在 Java 7中,String支持被加上了。
String temp = "abc";
switch(temp){
case "a":
System.out.println("case a");
break;
case "abc":
System.out.println("case abc");
break;
default:
break;
}
4. short s1 = 1; s1 = s1 + 1; 与 short s1 = 1; s1 += 1;
第一种:编译不过,无法运行。 s1+1自动转为int,将int赋值给short,编译报错。
第二种:编译通过,运行正常。 +=是java规定的运算符,特殊处理,可以正常编译。
5. char类型能否存储一个汉字
在Java中,char类型占2个字节,而且Java默认采用Unicode编码,以个Unicode码是16位,所以一个Unicode码占两个字节,Java中无论汉字还是英文字母都是用Unicode编码来表示的。所以,在Java中,char类型变量可以存储一个中文汉字。
6.静态变量和实例变量区别
静态变量用static修饰
静态变量属于类,实例变量必须创建了类的实例之后才会被分配空间。
7. Math.round Math.ceil Math.floor
ceil,天花板,向上取整 Math.ceil(11.6)=12 Math.ceil(11.2)=12 Math.ceil(-11.6)=-11
floor 地板,向下取整 Math.floor(11.6)=11 Math.floor(11.2)= 11 Math.floor(-11.6)=-12
round 四舍五入 Math.round(x)=Math.floor(x+0.5)
8. 指出代码不当之处
if(username.equals("abc") {}
username有可能会null,会报空指针错误,改成“abc”.equals(username)
int x = 1; return x==1?true:false; //这个改成 return x==1;就可以了
9. public ,private protected作用域
默认不加,则使用friendly修饰符
作用域 当前类 同一包(package) 子孙类 其他包(package)
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
10. overload与override区别
overload是重载,一个类中可以有多个名称相同,参数不同的方法;可以有多个参数,但每个参数类型不能相同,例如 fun(int,int)就是错误的
override是覆盖,重写 ,继承的子类中方法与父类名称和参数完全一样。如果父类的方法是private,则不能被override,只是在子类中新建了一个方法(仅仅是同名);
constructor不可以被继承,所以也不能被override 但可以被overload
11. 接口继承接口,抽象类实现接口,抽象类继承具体类,抽象类中是否可以有静态main方法
接口可以继承接口
抽象类也可以实现接口,implements
抽象类可以继承具体类
抽象类可以有静态main方法
抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。含有抽象方法的类叫抽象类。
接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
12. 面向对象的四个特征
封装 保证软件有模块性的基础,目标是实现“高内聚,低耦合”。 把描述一个对象的属性和行为代码封装在一个类中,叫封装。
抽象 找出事物的一些相似和共性之处,然后将这些归为一个类,这个类只考虑相似和共性之处,忽略与主题无关的方面,集中在当前目标有关的方面,叫抽象。
继承 把一个已存在类定义的内容作为自己的类的内容,并加入一些新的内容,或者修改原来的方法使之更适合特殊需要,叫做继承,提高软件的可重用性和可扩展性。
多态 多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。增强了软件的灵活性和扩展性