class Ca{
int num = 1;
Ca(int num){
this.num = num;
System.out.print(this.num);
}
}
class Cb extends Ca{
int num = 2;
Cb(int num) {
this.num = num;
System.out.print(num);
}
public static void main(String[] args) {
Ca a = new Cb(5);
}
}
父类已经定义了一个有参构造函数,你是人家儿子,你老爸都弄了个构造函数,你不得调用人家的构造函数呀
原因是我们调用子类,无论是什么情况,都会调用子类的构造函数(不管有参无参)与此同时子类函数extends父类函数,所以不管怎样***就会先调用父类的默认的无参的构造函数***
***更重要一点,我加上一个super()***()里面是父类构造函数里面的参数
class A
{
public void fun1()
{
System.out.println("A fun1 is calling");
}
public void fun2()
{
fun1();
}
}
class B extends A
{
public void fun1()
{
System.out.println("B fun1 is calling");
}
public void fun3()
{
System.out.println("B Fun3 is calling");
}
}
public class C
{
public static void main(String[] args)
{
A a=new B();
a.fun1();
a.fun2();
a.fun3();
}
}
直接看main()函数,第一句话就用了转型定义了a表面上用了A,实则确是B
在函数中B函数重写(overwrite)了fun1
所以调用fun1的时候自动输出“B fun1 is calling”
继续的调用main()第二行,输出:"B fun1 is calling"因为A里面定义的fun2就是自动调用了B的fun1
知道第三行竟然报错
执行之后说A类里面没有fun3()
可能这涉及到转型方面的一些小要点,是说我虽然转型,但是我只能使用我转型后内部的函数方法(包括重写overwrite)不包括原来的(即子类的函数)
class Pencil {
public void write (String content){
System.out.println( "Write"+content);
}
}
class RubberPencil extends Pencil{
public void write (String content){
System.out.println("Rubber Write"+content);
}
public void erase (String content){
System.out.println( "Erase "+content);
}
}
执行下列代码的结果是哪项?
Pencil p=new Pencil();
(( RubberPencil) p).write("Hello");
爸爸变成儿子????