public class AListTest { public static void main(String[] args) throws Exception { AList alist = new AList(); A a0 = new A(0); Object a1 = new A(1); alist.add(a0); alist.add(a1); System.out.println(alist); System.out.println(alist.get(1)); System.out.println(alist.size()); System.out.println(a0.toString()); System.out.println(a1.toString()); System.out.println(a1.getClass().getName()); System.out.println(a1.getClass().toString()); } }
class A { private int number;
A(int i) { number = i; } public void toString() { System.out.println(number); } } 你在A类里面加上toString()方法,估计能得到你所要打印的值。
我上面说错了你在class A里面加上 public int getNumber() { return number; } 然后(A)alist.get(1).getNumber(); 就能取到你想要的值了。 你上面alist.get(1)得到的只是一个object。并没有从这个object里面取出东西来。
如果两个object加到了alist里,为什么要调用super.get(index)来取出,alist的父对象在这里起什么作用另外,下面这个程序要把this改为super.toString(),否则死循环,也是同样的问题,能否详细告知父对象(这里是Object)起什么作用,应该如何使用这种作用 import java.util.*; public class A { public String toString() { return "address" + this; } public static void main(String[] args) { ArrayList v = new ArrayList(); for (int i = 0; i < 10; i++) { v.add(new A()); } System.out.println(v); } }
这就是OOD中的Class Factory思想。ArrayList只对Object操作,Object是所有class的超类,所有的class都是Object的子类,所以,ArrayList可以操作所有的class(这时你的A的实例就upcast为一个Object)。当然,你取出来还要再downcast为A。改一下你的程序: import java.util.*; class A { private int number; A(int i) { number = i; } public int getNum() { return number; } } class AList extends ArrayList { public void add(A a) { super.add(a); } public Object get(int index) { return super.get(index); } public int size() { return super.size(); } } public class AListTest { public static void main(String[] args) { AList alist = new AList(); A a0 = new A(0); Object a1 = new A(1); alist.add(a0); alist.add(a1); System.out.println(((A)alist.get(0)).getNum()); //System.out.println(alist.get(1)); System.out.println(alist.size()); } }
可以。所有的public 的方法,子类都已经继承。其实你根本不必覆盖这些方法。你的程序改为: class AList extends ArrayList { AList(){ System.out.println("this is creat a child of ArrayList!"); } } 其他的都不变,在运行一下看看。
我明白了。 但是还有个问题,下面这个程序要把this改为super.toString(),否则死循环。 这是否说明子类连被覆写的父类方法都继承下来了,只是调用它时要用super? 如果是,那么伴随子类生成的父类对象岂不是没有意义了? 如果不是,是什么?import java.util.*; public class A { public String toString() { return "address" + this; } public static void main(String[] args) { ArrayList v = new ArrayList(); for (int i = 0; i < 10; i++) { v.add(new A()); } System.out.println(v); } }
public static void main(String[] args) throws Exception {
AList alist = new AList();
A a0 = new A(0);
Object a1 = new A(1);
alist.add(a0);
alist.add(a1);
System.out.println(alist);
System.out.println(alist.get(1));
System.out.println(alist.size());
System.out.println(a0.toString());
System.out.println(a1.toString());
System.out.println(a1.getClass().getName());
System.out.println(a1.getClass().toString());
}
}
private int number;
A(int i) {
number = i;
}
public void toString() {
System.out.println(number);
}
}
你在A类里面加上toString()方法,估计能得到你所要打印的值。
public int getNumber() {
return number;
}
然后(A)alist.get(1).getNumber();
就能取到你想要的值了。
你上面alist.get(1)得到的只是一个object。并没有从这个object里面取出东西来。
import java.util.*;
public class A {
public String toString() {
return "address" + this;
} public static void main(String[] args) {
ArrayList v = new ArrayList();
for (int i = 0; i < 10; i++) {
v.add(new A());
}
System.out.println(v);
}
}
import java.util.*;
class A {
private int number; A(int i) {
number = i;
} public int getNum()
{
return number;
}
}
class AList extends ArrayList {
public void add(A a) {
super.add(a);
} public Object get(int index) {
return super.get(index);
} public int size() {
return super.size();
}
}
public class AListTest {
public static void main(String[] args) {
AList alist = new AList();
A a0 = new A(0);
Object a1 = new A(1);
alist.add(a0);
alist.add(a1);
System.out.println(((A)alist.get(0)).getNum());
//System.out.println(alist.get(1));
System.out.println(alist.size());
}
}
多谢高手给指点一下吧
java的子类在实例化的时候,首先实例化一个父类。所以,你可以调用super的方法。
如果是,我能不通过这个AList实例直接访问那个ArrayList实例吗?
如果不是,是什么?
class AList extends ArrayList {
AList(){
System.out.println("this is creat a child of ArrayList!");
}
}
其他的都不变,在运行一下看看。
但是还有个问题,下面这个程序要把this改为super.toString(),否则死循环。
这是否说明子类连被覆写的父类方法都继承下来了,只是调用它时要用super?
如果是,那么伴随子类生成的父类对象岂不是没有意义了?
如果不是,是什么?import java.util.*;
public class A {
public String toString() {
return "address" + this;
} public static void main(String[] args) {
ArrayList v = new ArrayList();
for (int i = 0; i < 10; i++) {
v.add(new A());
}
System.out.println(v);
}
}