- 子类继承父类方法时,子类对象调用父类方法,父类方法中引用的是父类的成员变量,甚至是私有变量。(意思是说子类没有重写父类的方法,继承了父类的方法,则当子类对象调用该方法时,方法中引用的变量都是父类的变量)
- 子类实例方法覆盖父类实例方法时,子类对象调用的是子类方法,方法中的成员变量是子类的。(子类中重写了父类的方法,当子类对象调用该方法时,方法中引用的变量是子类的。)
- 多态时,即父类引用指向子类对象时,对象调用同名方法,调用的是子类的方法。(上转型时)
这就是上篇末尾疯狂打感叹号的地方
super引用
super在程序中表示当前对象的父类,是对当前对象的父类对象的引用。在Java中,当子类的变量或方法隐藏了父类中的变量或静态方法,而在子类中又要引用父类的成员时,就要使用super。
super的用法
- 调用父类的构造方法。子类不能继承父类的构造方法,在子类的构造方法体中,可以使用super调用父类的构造方法
super([参数列表]); - 引用父类同名的成员。当子类重定义了父类成员时,则存在同名成员问题。此时在子类方法体中,成员变量和成员方法均默认为子类的成员变量或成员方法。如果需要引用父类的同名成员,则需要使用super引用。(当子类覆盖父类实例成员方法或子类隐藏父类成员变量和静态方法,可以使用super. 进行调用)
不知道你是否有些许问号,就是覆盖和隐藏到底有什么区别呢?覆盖和隐藏都是子类重写了父类的某些东西,覆盖是子类重写了父类的实例成员方法,隐藏是子类重写了父类的成员变量和静态方法。
我是这样理解的,在上转型中,子类调用实例成员方法时,调用的是子类的实例方法,因为父类的成员方法被覆盖了。子类调用成员变量或静态方法时,调用的是父类的,因为子类的成员变量和静态方法被隐藏了。(可能不太准确啊,如果有错误,请一定指正!!)
几点需要注意的地方
- super不能像this一样单独使用,如return this; this=a;
- super只能在子类使用(这一点似乎显而易见)
- super不能引用父类的私用成员(这点需要注意!!)
- super不能用在静态方法中,与this一样。因为没有所指的对象。
abstract修饰的类
很像C++的virtual,相信你理解起来一定非常轻松
使用关键字abstract声明的类称为抽象类
Public abstract class Graphics{
//图形类,抽象类
public abstract double area();
//计算面积,抽象方法,只写定义不写实现!分号必不可少!
}
为什么要有抽象类呢?
想想在上一篇,上转型部分。那个demo中的父类Patterning中的getArea和getPerimeter方法的实现,直接return 0;所以这个方法体的实现并没有什么意义,在抽象类中,就无需写方法体的实现了。
抽象类的性质
1.抽象类不能够被实例化。
2.抽象类中可以不包含抽象方法,但包含抽象方法的类必须声明未抽象类。
抽象方法的性质
1.抽象方法必须被子类覆盖
2.不能将构造方法、类成员方法声明为抽象方法
3.abstract抽象方法不能和static同用
4.父类的非抽象方法可以被子类的抽象方法覆盖
这里是一个抽象类去继承一个非抽象类,重写父类的方法,不常用
可以自己试着去把上篇上转型部分的demo用抽象类修改一下。Java对象的还有最后一更,会过几天吧。这几天要研究一下Android开发和CTF招新赛了!>_>,加油!!



