黑马程序员技术交流社区
标题:
java初学者学习笔记10——继承
[打印本页]
作者:
郑泽霖
时间:
2014-11-18 14:58
标题:
java初学者学习笔记10——继承
java成员变量的继承
1子类和父类定义的一模一样的成员变量,在只有子类对象存在时,两个变量都存在于子类对象中
2通过super关键字访问同名的父类中的变量
3super和this的区别
this是一个指向本类对象的引用变量,用System.out.println输出的结果和其他两个引用变量(数组名和接口)的格式相同,都是Zi@d9660d(引用变量的类型(类名\接口名\数组类型)+@+哈希值)
super代表父类的内存空间,不能用System.out.println输出
4子类继承了父类的私有属性但是不能直接访问
java成员函数的继承
1子类对父类同名函数会发生覆盖(重写),子类对象发现函数后,现在自己类中寻找此函数,如果有则父类同名函数不再调用,如果没有就调用父类中的函数
2可以用super调用父类中的原有方法
3子类覆盖父类的函数,必须保证子类的函数权限要大于或者等于父类的函数权限
权限private>protect>default>public
但是private的父类方法不能被覆盖
4静态方法不能覆盖或被覆盖
5子类在覆盖父类方法时,返回值也必须相同
java构造函数的继承
1子类和父类构造方法的执行顺序
class Fu
{
Fu()
{System.out.println(“father”);}
}
class Zi extends Fu
{
Zi()
{System.out.println(“son”);}
}
class Demo
{
public static void main(String[] args)
{new Zi();}
}
先执行父类的构造方法,再执行子类的构造方法
子类的所有构造函数的第一行都有一句隐式语句super();默认调用的是父类无参的构造函数
子类会继承父类中的内容,子类在初始化时必须先到父类中去执行初始化工作才可以方便地使用父类中的内容
2如果定义了有参的构造函数,则无参的构造函数就不会存在
class Fu
{
Fu(int x)//定义了有参构造函数,无参的构造函数消失
{System.out.println(“father”);}
}
class Zi extends Fu
{
Zi(int x)
{System.out.println(“son”);}
}
class Demo
{
public static void main(String[] args)
{new Zi(6);}
}
以上代码是错误的,子类会默认调用父类的默认构造函数,super(),但是父类已经定义了有参的构造函数,无参的的构造函数已经消失,所以隐式调用的super()会错误
应该改为:
class Fu
{
Fu(){};//增加无参构造函数
Fu(int x)
{System.out.println(“father”);}
}
class Zi extends Fu
{
Zi(int x)
{
super(9);
//用指定的super语句调用父类指定的构造函数
//C++应写为:Zi(int x):Fu(9){cou<<”son”;}
System.out.println(“son”);
}
}
class Demo
{
public static void main(String[] args)
{new Zi(6);}
}
3如果构造函数的第一行没有用super调用父类构造函数
如果子类的构造函数第一行写了this调用了本类其他构造函数,那么super调用父类的构造函数是不存在的。
原因是this写到了第一行,而this和super只能定义在构造函数的第一行,因为初始化动作要先执行
class Zi extends Fu
{
Zi(){...}
Zi(int x)
{
this();
...
}
}
父类的构造函数也是有隐式的super关键字,只要是构造函数默认第一行都是super();
在C++里面,默认的父类构造函数的调用是函数名的右边不在函数体内。
Java所有类的父类Object,Java.lang.Object
作者:
pillar
时间:
2014-11-18 17:43
学习态度很好,很踏实,努力!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2