继承中的构造方法:
子类的构造方法必须调用其基类的构造方法。子类可以在自己的构造方法中使用super来调用基类的构造方法,还可以用this来调用本类的其他构造方法。如果要使用super关键字,那么必须出现在构造方法的第一行。如果子类的构造方法中没有显示的调用基类的构造方法,那么系统默认调用无参数的基类构造方法。如果子类的构造方法没有显示调用基类的构造方法,而且基类也没有无参数的构造方法,那么程序就出错了。
class SuperClass{
privateint n;
SuperClass(){
System.out.println("SuperClass");
}
SuperClass(intn){
this.n= n;
System.out.println("SuperClass:"+n);
}
}
class SubClass extends SuperClass{
privateint n;
SubClass(){
//super();
System.out.println("SubClass");
}
SubClass(intn){
super(120);
this.n= n;
System.out.println("SubClass:"+n);
}
}
public class TestSuperSub{
publicstatic void main(String[] args){
SubClasssub1 = new SubClass();
SubClasssub2 = new SubClass(110);
}
}
/*
结果:
--------------------------
SuperClass
SubClass
SuperClass:120
SubClass:110
--------------------------
*/
上面的例子包含了继承中的构造方法,可以看出,super是必不可少的。不然会出错。
总之,集成后的类中,如果要写新的构造方法,一定别忘了父类中的构造方法。
Object类:
Object类是Java中所有类的根基类,如果一个类没有用extend指明从哪继承的,就默认是从object类中继承的。
toString方法:
先写一个例子:
class Man{
privateString name;
privateString wife;
}
public class TestToString{
publicstatic void main(String[] args){
Manm = new Man();
System.out.println("Man:"+m);
}
}
/*
结果:
---------------------
Man:Man@1fb8ee3
---------------------
*/
可以看出,如果一个数据类型和String类型的数据联合操作时,会自动调用该类的toString()方法,它的默认返回时这样的:getClass().getName() +'@' + Integer.toHexString(hashCode())
用户可以根据自己的需要自定义toString()方法。
我把程序这样改一下:
class Man{
private String name;
private String wife;
Man(String name,String wife){
this.name = name;
this.wife = wife;
}
public String toString(){
return"Name:"+name+" Wife:"+wife;
}
}
public classTestToString{
public static void main(String[] args){
Man m = newMan("Tom","Jerry");
System.out.println("Man:"+m);
}
}
/*
-----------------------
Man:Name:Tom Wife:Jerry
-----------------------
*/
把toString()的方法修改一下,得到的结果就不一样了。
equals方法:
equals()方法提供了验证对象是否相等的逻辑。先写一个程序:
public classTestEquals{
public static void main(String[] args){
String s1 = newString("AAAA");
String s2 = newString("AAAA ");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
}
}
/*
结果:
--------------------
false
true
--------------------
*/
看第一个输出语句:System.out.println(s1==s2);s1和s2是同一个类的对象,而且他们的属性相同,但是在内存中,它们指向不同的块,所以不可能相同。而第二句:System.out.println(s1.equals(s2));s1和s2是同一类的对象,且属性相同,则调用equals()方法时,能返回true。
但是,以上的内容只有针对J2SDK提供的一些类的对象才成立。如果是自定义的类,由它产生的对象,那么就返回两个false了。
equals()方法可以根据用户的需要自己改写。再写一个程序:
class Man{
private String name;
private int age;
private double height;
private double weight;
Man(String name,int age,doubleheight,double weight){
this.name = name;
this.age = age;
this.height = height;
this.weight = weight;
}
public boolean equals(Object obj){
if(obj == null) return false;
else{
if(obj instanceofMan){
Man m =(Man)obj;
if(m.name== this.name && m.age == this.age && m.height == this.height&& m.weight == this.weight){
returntrue;
}
}
}
return false;
}
}
public classTestEquals{
public static void main(String[] args){
Man a = newMan("Tom",18,180.0,180.0);
Man b = newMan("Tom",18,180.0,180.0);
boolean c = a.equals(b);
if(c == true){
System.out.println("这是同一个人");
}
else{
System.out.println("这不是同一个人");
}
}
}
/*
结果:
----------------------------
这是同一个人
----------------------------
*/
这里自己定义了equals()方法,比较两个对象是否相同。在main()方法中,验证如果相同,说明两个人是同一个人。