标签:
类中的成员:变量,函数,构造函数
1.变量
如果子类中出现非私有的同名成员变量时
子类要访问本类中的变量用this,this代表的是本类对象的引用
子类要访问父类中的同名变量,用super,super代表的是父类空间
1 public class ExtendsDemo3 { 2 public static void main(String[] args) { 3 Zi z=new Zi();//建立了子类对象,加载子类,但在加载子类前会先加载父类 4 z.show(); 5 //System.out.println(z.num+"..."+z.num);//打印的都是子类中的num 6 } 7 } 8 class Fu{ 9 int num=4;//如果该父类的变量私有了,子类不能直接访问该变量,应该设置set。get方法让子类间接访问 10 } 11 class Zi extends Fu{ 12 int num=5; 13 14 void show(){ 15 System.out.println(num);//打印的是子类的num因为num前省略了this. 要想打印父类的num前面加上super. 16 } 17 }
2.函数:
当子类出现和父类一摸一样的函数时
当子类对象调用该函数,会运行子类函数的内容,如同父类的函数被覆盖一样。这种情况是函数的另一个特性:重写(覆盖)
当子类继承父类,沿袭了父类的功能到子类中, 但是子类虽具备该功能,但是功能的内同却和父类不一致 这时,没有必要定义新功能而是使用覆盖,保留父类的功能定义,并重写功能内容
注意:子类覆盖父类,必须保证子类权限大于等于父类权限才可以覆盖,否则编译失败
静态只能覆盖静态
重载:同一个类中,只看同名函数的参数列表overload
重写:子父类方法要一摸一样(包括返回值类型)override
1 public class ExtendsDemo4 { 2 public static void main(String[] args) { 3 Zi z=new Zi(); 4 z.show(); 5 } 6 } 7 8 class Fu{ 9 void show(){ 10 System.out.println("fu show"); 11 } 12 //如果将其用private修饰了的话,下面子类的speak就不能复写该功能了,因为被私有了子类不知道父类有这个功能 13 void speak(){ 14 System.out.println("vb"); 15 } 16 } 17 class Zi extends Fu{ 18 void show(){ 19 System.out.println("zi show"); 20 } 21 void speak(){ 22 System.out.println("java"); 23 } 24 }
什么时候使用覆盖操作?
当对一个类进行子类的扩展时,子类需要保留父类的功能声明,但是要定义子类中该功能的特有内容时,就使用覆盖操作完成
1 class Phone{ 2 void call(){} 3 void show(){ 4 System.out.println("number"); 5 } 6 } 7 class NewPhone extends Phone{ 8 void show(){ 9 System.out.println("name"); 10 System.out.println("pic"); 11 //System.out.println("number"); 12 super.show(); 13 } 14 }
3.子父类中的构造函数
构造函数不可以覆盖:因为覆盖要一摸一样,构造函数随着类名走,而每个类的类名都不同
在对子类对象进行初始化时,父类的构造函数也会运行那是因为子类的构造函数默认的第一行有一条隐式的语句super();
super():会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super()
为什么子类一定要访问父类中的构造函数
因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的
所以子类在对象初始化时要先访问一下父类中的构造函数。如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定(父类的构造函数有什么参数super也要有对应的参数)
结论:(子类的实例化过程)
子类的所有构造函数,默认都会访问父类中空参数的构造函数,因为子类每一个构造函数内的第一行有一句隐式super()
当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问父类中的构造函数
当然子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数
子类中至少会有一个构造函数会访问父类中的构造函数
1 public class ExtendsDemo5 { 2 public static void main(String[] args) { 3 Zi z=new Zi(); 4 } 5 } 6 class Fu{//extends object 7 8 Fu(){ //super() //父类也有,因为java有个最终的父类 9 System.out.println("fu run"); 10 } 11 } 12 class Zi extends Fu{ 13 Zi(){ 14 //super();//如果父类中没有空参数的构造函数则要指明访问父类中的哪个构造函数,反正是一定要访问父类中的构造函数 15 //要指定的话super() 也要放在构造函数的第一行 16 //如果第一行有this() 那么就没有了super()了 17 System.out.println("zi run"); 18 } 19 }
标签:
原文地址:http://www.cnblogs.com/LO-ME/p/3553379.html