------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1、字符类型
①Java可以把字符作为整数来对待,例如char类型可以隐式转化为int类型。
char是用来存储Unicode编码的字符,占用2个字节(所以可以存储汉字)
若想得到一个0~65536之间的数字锁代表的Unicode码中相应位置上的字符,必须使用char类型显式转换。
②在Java中允许使用汉字或其他语言文字作为变量名。
③&&和&的区别:&&有“短路”运算符之称,即第一个表达式为false时,就不用再计算第二个表达式了,例如
x=4; y=1;
if(x==3%%++y>0){ //第二个表达式的y就不会自增
x++;
}
④位移运算符(<<,>>)适用的数据类型有byte,short,char,int和long(精度从“低”到“高”依次为 byte<short<int<long<float<double)
位移运算的效率最高,例如
y<<2与y*4的结果相同,但是y<<2的效率会比较高
⑤多行注释何以嵌套单行注释,但不可以嵌套多行注释。
2、字符串
①java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。String不是基本数据类型。
②一句相连的字符串不能分别在两行写,例如
System.out.println("I like
java"); //这样会报错
③String、StringBuffer和Stringbulider的区别?
String: String是字符串常量 ,它是一个基本类型,字符串是不可变
StringBuffer是在jdk1.0出现的,果要频繁对字符串内容进行修改,出于效率考虑最好使用StringBuffer,如果想转成String类型,可以调用StringBuffer的toString()方法。
StringBuffer 是线程安全的,可以从StringBuffer类中的代码看到
public synchronized StringBuffer append(StringBuffer sb) {
super.append(sb);
return this;
}
StringBulider 是StringBuffer的一个简易版,它是线程不安全
如果你是要操作少量的数据,直接用String就可以了,
如果在单线程中操作大量数据,用StringBuilder ;
在多线程操作大量数据,当然用StringBuffer,保证了线程的安全。
<span style="font-family:FangSong_GB2312;font-size:12px;"> StringBuilder s=new StringBuilder("abc"); s.append("ef"); //s="abcef" s.insert(3, "d"); //s="abcdef" s.delete(2, 3); //s="adef" System.out.println(s);</span>
2.变量初始化
java中的变量在使用之前必须被初始化,当创建一个对象的时候一些类的变量会自动初始化并赋予缺省值。
数字类赋值0;char类型赋值'\u0000'; boolean类型赋值false;引用对象赋值null;
注意的是在方法之外的类变量的值是自动赋初始值,而方法内的局部变量必须手工初始化。
class AA{
int num;
void test(){
int j;
j =5;//没有这一行则编译不会通过。
j = j+num;
}
}
3.switch语句
这个点经常在求职笔试题目中出现。default放在最上边编译没问题;碰到符合分支的,如果没有break会一直向下运行。
public class tt { public static void main(String args[]) { tt t = new tt(); t.test(4);// 如果参数为1和2 除外的数字会走default和case 1 } void test(int i) { switch (i) { default: System.out.println("default"); case 1: System.out.println("111"); break; case 2: System.out.println("222"); break; } } }
4.方法重载(overloading)、方法覆盖(overriding)
方法重载(overloading)一定要求名字相同,参数不同,返回类型可以相同也可以不同。
class A{
void test(int i){ }
}
class AA extends A{
int test(int i, int j){
return 5;
}
}
注:方法覆盖(overriding)要求名字,参数,返回类型全部必须相同,访问控制符可以不同,但必须大过父类的。因为如果名字和参数都已经相同了则一定要求返回类型相同,否则认为这是一个新的方法了,名字就必须不同了。
class A{
void test(int i){ }
}
class AA extends A{
public void test(int i){//若是换成private则编译不通过。
}
}
注:关于覆盖方法抛出异常的问题。如A是父类,B是继承A的子类。B中的方法meth()去覆盖父类A的此方法时,B中不能throws出新的异常,只能是父类抛出的异常或其子集。更甚至可以不抛出异常
5.关于类的构造器重载问题
class A{
public A(int i){ }
}
class AA extends A{
public AA(){
int i = 5; // 这里出错,没有父构造器
}
}
由于父类A自定义了构造器,所以缺省的构造器就丢失了,当子类的构造器自动试图调用父类没参数的构造器时却没有,所以会编译出错。
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------