继承(代码体现)
2015-07-10 20:59
204 查看
子父类出现后类中成员的特点;
类中成员:
1:变量
如果子类中出现非私有的同名成员变量时
子类要访问本类中的变量,用this
子类要访问父类中的同名变量,用super
super和this的使用几乎一致;
this代表的是本类对象的引用,super代表的是父类对象的引用
2:函数
当子类出现和父类一模一样的函数时
当子类对象调用该函数,会运行子类函数的内容
如同父类的函数被覆盖一样
这种情况是函数的另一个特性:重写(覆盖)
覆盖:
1.子类覆盖父类,必须保证子类的权限大于等于父类,才可以覆盖
2.静态覆盖静态;
记住!!
重载:只看同名函数的参数列表
重写:子父类方法要一模一样
当子类继承父类,沿袭了父类的而功能到子类中,但子类虽具备该功能,但是功能的内容不一致,这时,没有必要新定义功能,而是使用覆盖特殊,保留父类的功能定义,并重写功能内容。
3:构造函数
1:在对子类对象进行初始化时,父类的构造函数也会运行。
那是因为子类的构造函数默认第一行有一天隐式的语句 super();
super();:会访问父类中空参数的构造函数,而且子类中所有的构造函数默认的第一行都是super();
2:为什么子类一定要访问父类中构造函数(也就是说当父类没有空构造函数时,我们在子类的每个构造函数中,必须写上语句,去访问父类构造函数,否则编译不通过)
因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。
所以子类在对象初始化时,要先访问一下父类中的构造函数。
如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。
注意:
super语句一定在子类的第一行,若有this()语句那么就不会有super()省略,二者择其一;
变量
但如果子父类的有相同的变量呢
可以看到第一行打印的是num是子类变量的值;
而第二行show()打印的是子类的是因为show(this.num),省略了this;如果想打印父类的值,这时应用一个关键字 super;
这样就打印的是父类的值
子父类中有相同名的函数
look!!!显示的是子类功能内容
子父类的构造函数
可以看到确实继承父类,而且先走父类;
再看一个
每个构造函数中都有super(),所以有俩fu run;
super()调用的是Fu()而不是Fu(Int x);
类中成员:
1:变量
如果子类中出现非私有的同名成员变量时
子类要访问本类中的变量,用this
子类要访问父类中的同名变量,用super
super和this的使用几乎一致;
this代表的是本类对象的引用,super代表的是父类对象的引用
2:函数
当子类出现和父类一模一样的函数时
当子类对象调用该函数,会运行子类函数的内容
如同父类的函数被覆盖一样
这种情况是函数的另一个特性:重写(覆盖)
覆盖:
1.子类覆盖父类,必须保证子类的权限大于等于父类,才可以覆盖
2.静态覆盖静态;
记住!!
重载:只看同名函数的参数列表
重写:子父类方法要一模一样
当子类继承父类,沿袭了父类的而功能到子类中,但子类虽具备该功能,但是功能的内容不一致,这时,没有必要新定义功能,而是使用覆盖特殊,保留父类的功能定义,并重写功能内容。
3:构造函数
1:在对子类对象进行初始化时,父类的构造函数也会运行。
那是因为子类的构造函数默认第一行有一天隐式的语句 super();
super();:会访问父类中空参数的构造函数,而且子类中所有的构造函数默认的第一行都是super();
2:为什么子类一定要访问父类中构造函数(也就是说当父类没有空构造函数时,我们在子类的每个构造函数中,必须写上语句,去访问父类构造函数,否则编译不通过)
因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。
所以子类在对象初始化时,要先访问一下父类中的构造函数。
如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。
注意:
super语句一定在子类的第一行,若有this()语句那么就不会有super()省略,二者择其一;
变量
class Fu { int num1=4; } class Zi extends Fu { int num2=5; } class ExtendsDemo { public static void main(String[] args) { Zi z=new Zi(); System.out.println("num1="+z.num1+"...num2="+z.num2); } }
但如果子父类的有相同的变量呢
class Fu { int num=4; } class Zi extends Fu { int num=5; void show() { System.out.println(num); } } class ExtendsDemo { public static void main(String[] args) { Zi z=new Zi(); System.out.println("num="+z.num); z.show(); } }
可以看到第一行打印的是num是子类变量的值;
而第二行show()打印的是子类的是因为show(this.num),省略了this;如果想打印父类的值,这时应用一个关键字 super;
..........
class Zi extends Fu { int num=5; void show() { System.out.println(super.num); } }
.....
这样就打印的是父类的值
子父类中有相同名的函数
class Fu { void speak() { System.out.println("vb"); } } class Zi extends Fu { void speak() { System.out.println("java"); } } class ExtendsDemo { public static void main(String[] args) { Zi z=new Zi(); z.speak(); } }
look!!!显示的是子类功能内容
子父类的构造函数
class Fu { Fu() { System.out.println("fun run"); } } class Zi extends Fu { Zi() { System.out.println("zi run"); } } class ExtendsDemo { public static void main(String[] args) { Zi z=new Zi(); } }
可以看到确实继承父类,而且先走父类;
再看一个
class Fu { Fu() { System.out.println("fu run"); } Fu(int x) { System.out.println("fu..."+x); } } class Zi extends Fu { Zi() { //super(); System.out.println("zi run"); } Zi(int x) { //super(); System.out.println("zi..."+x); } } class ExtendsDemo { public static void main(String[] args) { Zi z=new Zi(); Zi z1=new Zi(4); } }
每个构造函数中都有super(),所以有俩fu run;
super()调用的是Fu()而不是Fu(Int x);
相关文章推荐
- java线程的疑问???
- MVC过滤器详解 面向切面编程(AOP)
- python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法
- Java获取图片属性
- Spring特性——事件驱动模型
- [LeetCode][Java] Implement strStr()
- Java学习笔记
- javaweb 待填坑
- java基础-输入流-读取文本文件中数据至字符串数组
- Python编码问题
- JAVA多线程和并发执行
- java.net.UnknownHostException 异常处理
- java多线程------
- 集合的位图表示(C语言描述)
- Java三大修饰符
- c++ primer读书笔记-第十二章 类
- Java面向对象知识点
- C语言 printf
- java底层的深入理解——————堆栈
- Java变量&&简单程序流程&&循环