1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以有多个类,但是只能有一个public类,切public类和文件名必须一致
2、Java有没有goto?
java语言中的保留字,目前没有在java中使用
3、说说&和&&的区别
相同点:
&和&&都可以作为逻辑远算符,表示与(and),两边都是true是才是true
不同点:
1.&&有短路的功能,如果第一个表达式为false时,将不再判断下一个表达式,&&不会出现空指针异常,&会出现
2.&可以用作位运算符,当&两边不是boolean是,就是位运算符
4、在JAVA中如何跳出当前的多重嵌套循环?
break:跳出本次循环:如果设置break标志,则跳出循环,并且可以执行后面的代码
continue:跳出本次循环
return:跳出循环,跳出循环的方式是返回到首次调用return的方法处,不在执行后面的代码
5、switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
- switch可作用在char byte short int,以及对应的包装类上
- switch不能作用在long double float boolean,以及他们的包装类上
- (jdk1.7之后)switch可以作用在string上
6、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
s1是short类型
s1+1就变成int类型
必须强制转换成short:s1=(short) (s1+1);
没错:s1本身加1,类型还是short
7、char型变量中能不能存贮一个中文汉字?为什么?
char中储存汉字是进行了Unicode编码
8、用最有效率的方法算出2乘以8等於几?
左移
2<<3
相当于2x23
10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
final可以修饰类,方法和变量(成员和局部)
- final 修饰类该类不能被继承
- final修饰方法该方法不能被重写
- final修饰变量,该变量为常量,若修饰基本数据类型,该类的值不能改变,若修饰引用数据类型,地址不能变,内容可以改变
- final修饰参数同上
11、"=="和equals方法究竟有什么区别?
相同之处:==和equals都是比较地址
不同:
1.==操作基本数据类型,比较的是值是否相等;引用数据类型比较地址
2.equals只能操作引用数据类型,比较地址,但如果该类重写了equals,比较的就是内容
12、静态变量和实例变量的区别?
静态变量:被static修饰的变量
实例变量:没有被static修饰的变量
相同之处:都是成员变量.都能被对象调用
不同之处:
- 修饰符不同:是否被static修饰
- 调用不同
静态变量是属于类的:不但可以被对象调用 还可以被类直接调用
实例变量 是属于对象的:只能被对象调用 - 静态变量是共享数据 多有的对象共用一个
实例变量每个对象都有属于自己的实例变量 - 加载的时间不同
静态变量在类加载时加载
实例变量在对象创建时加载
13、是否可以从一个static方法内部发出对非static方法的调用
加载时间不同
静态方法类加载时加载
普通法发是创建对象是加载
14、Integer与int的区别
可以通过自动装箱和自动拆箱 互相转换
- 类型不同
int 是基本数据类型
integer是引用数据类型 - 默认值不同
int默认0
integer默认null - 占的内存不同
int固定占4个字节
integer因为有方法和属性 所以占的内存要大
15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)=12
Math.round(-11.5)=-11
Math.ceil() 小数点后0.1以上都进一
Math.floor() 和ceil想法,少0.1就不进,去整数部分
Math.rint() 整数部分是奇数大于等于0.5进一,偶数小于0.6去偶,大于等于0.6进一
Math.round() 四舍五入
16、下面的代码有什么不妥之处?
1. if(username.equals(“zxx”){}
2. int x = 1;
return x==1?true:false;
- 少了一个)
- x==1本身就是判断返回的是true
17、请说出作用域public,private,protected,以及不写时的区别
private私有的 本类
不写 默认的 本包
protected受保护的 本包和其他包的子类
public 公共的 整个项目
18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
overload重载:一个类中的方法, 方法名相同,参数列表不同的现象
override重写:子类重写父类的方法
相同:都是方法,方法名相同
不同:
-
要求:
重载要求方法名相同,参数列表不同(参数种类,个数,排列顺序不同)
重写要求方法名,参数列表完全相同,返回值相同,子类的异常不能比父类大,范围修饰符不能不父类小 -
位置:
一个类中
重写的方法在子类中 -
影响:
几个方法之间没有影响父类的方法被隐藏
21、写clone()方法时,通常都有一行代码,是什么?
clone有缺省行为,super.clone();
因为首先要把父类中的成员复制到位,然后在复制自己的成员
22、面向对象的特征有哪些方面
-
封装:把对同一事物进行操作的方法和相关的方法和数据放在同一个类中,实现高内聚低耦合
-
继承:在定义和实现一个类的时候,可以在一个已经存在的的类的基础上进行:提高代码的复用性和扩展性
-
抽象:找到一些事物之间的相似和共性之处:抽象类的意义就是为了被继承
-
多态:父类引用指向子类对象
23、java中实现多态的机制是什么?
靠的是父类或者接口定义的引用变量可以指向子类或者具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体的实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法
自己的理解:
父类引用指向子类对象
通过继承,在实现类的创建就让该子类赋予了一些基础属性(来自父类),并且子类可以根据自己的需求,获得自己特有的属性
24、abstract class和interface有什么区别?
抽象类;abstract class
接口:interface
相同:
- 都不能实例化,都可以用于引用,引用用于指向子类对象或者实现类
- 两者的创建都是为了给子类或实现类制定规则
- 使用时都是多态
不同:
-
是否能有普通方法
抽象类可以有普通方法
接口不能有普通方法(jdk1.8之后可以有静态方法和默认方法) -
关键字
抽象类:extends
接口:implement -
成员是否用默认的修饰符
抽象类:没有
接口:方法默认public abstract
成员变量public 是他提出 final -
类之间是单继承
接口之间是多实现
25、abstract的method是否可同时是static,是否可同时是native,
是否可同时是synchronized?
abstract:找出一些事物的共性创建的特殊的类,存在的意义就是被继承
是否可同时是static:否,方法被static后就成了类方法,不能被重写,没有了抽象类的意义了
是否可同时是native:否
是否可同时是synchronized:否
没有意义
abstract的method 不可以是static的,因为抽象的方法是要被子类实现的,
而static与子类扯不上关系!
native方法表示该方法要用另外一种依赖平台的编程语言实现的,
不存在着被子类实现的问题,所以,它也不能是抽象的,
不能与abstract混用。例如,FileOutputSteam类要硬件打交道,
底层的实现用的是操作系统相关的api实现,例如,在windows用c语言实现的,
所以,查看jdk 的源代码,可以发现FileOutputStream的open方法的定义如下:
private native void open(String name) throws FileNotFoundException;
如果我们要用java调用别人写的c语言函数,
我们是无法直接调用的,我们需要按照java的要求写一个c语言的函数,又我们的这个c语言函数去调用别人的c语言函数。由于我们的c语言函数是按java的要求来写的,我们这个c语言函数就可以与java对接上,java那边的对接方式就是定义出与我们这个c函数相对应的方法,java中对应的方法不需要写具体的代码,但需要在前面声明native。
关于synchronized与abstract合用的问题,我觉得也不行,
因为在我几年的学习和开发中,从来没见到过这种情况,
并且我觉得synchronized应该是作用在一个具体的方法上才有意义。
而且,方法上的synchronized同步所使用的同步锁对象是this,而抽象方法上无法确定this是什么。
26、什么是内部类?Static Nested Class 和 Inner Class的不同
内部类就是在一个类内部定义的类,内部类不建议定义成静态的,内部类可以直接访问外部类的成员变量,内部类可以定义在外部类方法外,也可以定义在外部类的方法内
27、内部类可以引用它的包含类的成员吗?有没有什么限制?
没有什么限制.但如果静态内部类是一个特例的话,那就只能方法静态的成员
28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
可以继承其他类或实现其他接口。不仅是可以,而是必须!
29、super.getClass()方法调用
下面程序的输出结果是多少?
import java.util.Date;
public class Test extends Date{
public static void main(String[] args) {
new Test().test();
}
public void test(){
System.out.println(super.getClass().getName());
}
}
Test,返回类名
30、String是最基本的数据类型吗?
基本数据类型:
整型:byte int long short
浮点型: float double
字符型: char
布尔型:boolean
string类是final类型的,因此不可以继承这个类,不能修改这个类.为了提高效率节省空间,我们应该用stringbuffer类,创建string对象有两种方式:
String s=new String(“1111”)
"“和n0555555555 ew,”"在字符串常量池创建一个字符串1111,在内存中通过new 创建一个第一步的字符串的副本对象
31、String s=“Hello”;s=s+“world!”;这两行代码执行后,原始的String对象中的内容到底变了没有?
string:字符串常量:字符串是不可变序列:字符串对象一旦创建 字符序列是无法更改的
32、是否可以继承String类?
string是final类,不能被继承
33、String s = new String(“xyz”);创建了几个String Object?
2个,通过""在字符串常量池中创建一个xyz,通过new创建一个"xyz"的副本字符串对象
34、String 和StringBuffer,StringBuilder的区别
string是字符串常量
stringbuffer和stringbuilder是字符串缓冲区
相同之处:
- 都可以来表示字符串序列
- 都是final类,不能被继承
string和stringbuffer,stringbuilder不同之处:
- string是字符串常量:对象一旦创建 字符序列不能更改
stringbuffer和stringbuilder是字符串缓冲区:字符序列可以更改
stringbuffer和stringbuilder相同之处:
- api兼容(两个类的方法完全相同)
- 都是字符串缓冲区:字符序列可变
不同之处:
- 版本不同:
stringbuffer是1.0版本
stirngbuilder是1.5版本 - stringbuffer线程安全效率低
stringbuilder线程不安全效率高
35、如何把一段逗号分割的字符串转换成一个数组?
常用的操作string的方法
split() 将字符串分割
substring(int begin,int end) 获取begin到end-1的字符串
concat(string str) 把参数字符拼接到当前字符串后面
replace(string str,string str) 后面替换前面
36、数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。String有length()这个方法。
37、下面这条语句一共创建了多少个对象:String s=“a”+“b”+“c”+“d”;
一个对象
String s="a"+"b"+"c"+"d";
System.out.println(s=="ab"+"cd");//true
String s="a"+"b"+"c"+"d";
System.out.println(s=="abcd");//true
38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
try {
for (int i = 0; i < 3; i++) {
for (int i1 = 0; i1 < 3; i1++) {
if(i==2){
System.out.println("return要执行了");
return;
}
System.out.println(i+"===="+i1);
}
}
}
finally {
System.out.println("finally执行");
}
控制台
39、说一下 HashSet 的实现原理?
HashSet底层由HashMap实现
HashSet的值存放于HashMap的key上
HashMap的value统一为PRESENT
40、final, finally, finalize的区别。
- final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 内部类要访问局部变量,局部变量必须定义成final类型
- finally是异常处理语句结构的一部分,表示总是执行。
- finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用