1.== 和 equals 究竟有什么区别?
1)==是比较两个变量的值是否相等或者,要比较两个基本类型的数据或者两个引用变量是否相等,就要使用==
2)如果一个变量指向的数据是引用类型的,那么就涉及到两块内存,对象本身占一块内存(堆内存),变量也要占一块内存。比如StringBuilder builder = new StringBuilder(),这里builder要占用一块内存,new StringBuilder()也要占用一块内存,builder里面存储的值是new StringBuilder()内存的首地址。如果要比较两个变量是否指向同一个对象,即要看两个变量对应的内存中的数值是否相等,这时候需要使用==,equals是用来判断两个独立对象里面的内容是否相同,比如String str1 = new String("str"); String str2 = new String("str"); 由于str1 和 str2 指向两个不同对象,内存地址不同,所以str1==str2 返回false,但是str1和str2里面的内容是相同的,所以str1.equals(str2)返回true.
指的注意的是:一个类如果没有定义自己的equals方法,那么将集成Object的equals方法,Object类的equals方法实现是使用==进行比较的。
boolean equals(Object o){
return this == o
}
对于字符串这种非基本类型的比较,判断两个对象内容是否相同不能使用==,只能使用equals.如果你要比较两个引用类型,必须自己重写Object的equals方法!
2.静态变量和实例变量
1)静态变量前加static关键字,实例变量前不加。
2)静态变量是属于类的,实例变量是属于类的实例的。对于静态变量来说,类还没有实例化的时候就已经为其分配了内存,而实例变量必须在类实例化之后才能分配内存。无论创建多少类的实例,都只有一份静态变量的内存,而实例变量的内存随着实例的创建而创建。
3.static方法能否调用非static方法?
答:不能,非static方法是和类的实例相关联的,而static方法跟类的实例没关系。static方法在类还没有初始化时即可创建,调用非static方法,无法确定是调用哪个对象的非static方法。
4.int和Integer的区别
int 是java中8个原始基本数据类型之一,而Integer是基于int的封装类。int默认值是0,而Integer的默认值是null,所以,Integer可以区分未赋值和赋值的区别,但是int是无法区别的。(类似于.NET中的int?这种形式)为表单设计数据类型时,最好使用Integer,因为可以区别赋值情况。Integer封装了很多与整数相关的操作方法,比如将字符串转化为整数,还定义了整数的最大值和最小值常量。
5.Math中的ceil,floor和round
ceil的意思是"天花板",即向上取整数。floor的意思是地板,即向下取整,round意思是四舍五入。Math.Round(11.5) = 12; Math.Round(-11.5) = -11.
6.注意空指针
如下代码不妥:
public static void main(String[] args) {
String username = null;
if(username.equals("justin")){
System.out.print("yes");
}
else{
System.out.print("no");
}
}
这个错误不会在编译时出现,但是会在运行时出现,因为null无法调用equals。正确做法如下:
public static void main(String[] args) {
String username = null;
if("justin".equals(username)){
System.out.print("yes");
}
else{
System.out.print("no");
}
}
7.public,private,friendly和 protected的作用域
一图胜千言!
8.overload和override的区别
overload是重载,一个类中有多个同名的方法,但是参数列表不同。overload允许返回类型不同。
public class Hello {
public static void main(String[] args) {
System.out.println(Add(2));
System.out.println(Add(2,3));
System.out.println(Add(2,3,4));
System.out.println(Add(2d,3d,4d));
}
private static int Add(int x){
return x + 2;
}
private static int Add(int x,int y){
return x + y;
}
private static double Add(double x,double y,double z){
return x + y + z;
}
//private static int Add(double x,double y,double z){
//return 10;
//}
private static int Add(int x,int y,int z){
return x + y + z;
}
}
输出结果:
4
5
9
9.0
代码里面有个注释掉的方法,参数列表和类型相同,返回类型不同,这样是不行的,因为编辑器根本不知道调用哪个方法!
override是子类重写父类的方法,通常父类的这个方法没有实现,或者实现很简单,需要子类根据需要个性化进行定制。被重写(覆盖)的方法不可以为private的,否则是重新定义,因为子类不可以访问父类的private方法,子类重写后的可访问程度必须>=父类,比如父类为protected,子类需要为protected或者public。
public class Hello {
public static void main(String[] args) {
Person p = new Employee();
p.Print();
}
}
class Person
{
protected void Print(){
System.out.println("I am a person.");
}
}
class Employee extends Person{
@Override
protected void Print() {
// TODO Auto-generated method stub
super.Print();
System.out.println("I am a employee too!");
}
}
输出结果:
I am a person.
I am a employee too!
9.构造函数能否被override?
构造函数不可以被override(覆盖重写),但可以被重载!子类可以调用父类的构造函数来实现自己的构造函数。
class Person
{
private String name;
Person(String name){
this.name = name;
}
}
class Employee extends Person{
Employee(String name) {
super(name);
// TODO Auto-generated constructor stub
}
}