Java 继承之子父类中的成员变量和函数

成员变量:

先看这样一段代码:

//父类。
class Fu
{
	int num = 3;
}

class Zi extends Fu
{
	int num = 4;
	void show()
	{
		System.out.println("num = "+this.num);
	}
}

class ExtendsDemo
{
	public static void main(String[] args)
	{
		Zi z = new Zi();
		z.show();
	}
}

从一张图来看它的原理:

图有点乱,看一下顺序吧。在代码中,super和this 的用法很相似,this代表的是本类对象的引用,super代表的是父类的内存空间。

成员函数:

【子父类中成员函数的特点】

特殊情况:子父类中的定义了一模一样的函数。

运行的结果:子类的函数在运行。

这种情况在子父类中,是函数的另一个特性:override(重写,覆盖,复写)

重写什么时候用?举例:

//描述手机。
class Phone
{
	int number;
	//打电话。
	void call(){}
	//来电显示。
	void show()
	{
		sop("电话号码.."+number);
	}
}
Phone p = new Phone();
p.show();

随着电话的升级,只显示号码不爽,希望显示姓名,照片。
修改源码,虽然费劲但是可以解决,不利于后期的维护和扩展。
为了扩展方便。新功能是不是新的电话具备呢?
单独描述单独封装。新电话也是电话中的一种。继承。直接获取父类中的功能。
但是新电话的来显功能已经变化了。需要重新定义。
那么定义一个新功能合适吗?比如newShow,不合适,因为父类已经将来显功能定义完了,
子类完全不需要重新定义新功能。直接用就可以了。如果子类的来显功能内容不同。
直需要保留来显功能,定义子类的内容即可:这就是重写的应用!

class NewPhone extends Phone
{
	String name;
	String picPath;//图片路径。
	void show()
	{
		//sop("电话号码");
		super.show();//如果还需要父类中原有的部分功能,可以通过super调用。
		System.out.print("姓名"+name);
		System.out.print("照片"+picPath);
	}
}

【重写(覆盖)的注意事项】

1,子类覆盖父类,必须保证全要大于或者等于父类的权限。

Fu:

private void show(){}

Zi:

public void show(){}

2,静态覆盖静态。

写法上稍微注意:必须一模一样:函数的返回值类型 函数名 参数列表都要一样。

【总结】

当一个类是另一个类中的一种时,可以通过继承,来扩展功能。

如果从父类具备的功能内容需要子类特殊定义时,使用重写。

++【子父类中构造函数的特点】

当子父类都有构造函数时,发现结果为:

fu constructor run

zi constructor run

先执行了父类的构造函数,再执行子类的构造函数。

【这是为啥呢?】

因为子类的所有的构造函数中的第一行都有一句隐式语句 super(); //默认调用的是父类中的空参数的构造函数。

【子类中的构造函数为什么有一句隐式的super()呢?】

原因:子类会继承父类中的内容,所以子类在初始化时,必须先到父类中去执行父类的初始化动作。

才可以更方便的使用父类中的内容。

【小结】

当父类中没有空参数构造函数时,子类的构造函数必须同构显示的super语句指定要访问的父类中的构造函数。

这就是传说中的子类实例化过程。

【实例化过程的细节】

1,如果子类的构造函数第一行写了this调用了本类其他构造函数,那么super调用父类的语句就没有了,因为this()或者super(),只能定义在构造函数的第一行,因为初始化动作要先执行。

2,父类构造函数中是否有隐式的super呢?

有。记住:只要是构造函数默认第一行都是super();

父类的父类是谁呢?super调用的到底是谁的构造函数呢?

Java体系在设计,定义了一个所有对象的父类Object ,

【总结】

类中的构造函数默认第一行都有隐式的super()语句,在访问父类中的构造函数。

所以父类的构造函数既可以给自己的对象初始化,也可以给自己的子类对象初始化。

如果默认的隐式super语句没有对应的构造函数,必须在构造函数中通过this或者super的形式明确调用的构造函数。

【问题】

1,this语句和super语句是否可以在同一个构造函数中出现呢?不行,因为必须定义在第一行。

2,为什么要定义在第一行呢?因为初始化动作要先执行。

时间: 2025-01-04 07:36:53

Java 继承之子父类中的成员变量和函数的相关文章

java基础-子父类中的成员变量

/*子父类成员特点 成员: 1.成员变量 2.函数 3.构造函数 变量: this: 代表当前对象的引用 this.变量 首先在本类中找所需要的这个变量,如果没有找到,再去父类中找 super:用于访问当前对象的父类成员 super.变量 直接在父类中找所需变量 */ class Pers{ String name="张三"; } class Stud extends Pers{ String name="李四"; void view(){ System.out.p

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承.(4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承. 分析以上程序示例,主要疑惑点是“子类继承父类的成员变量,父类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量

java学习之继承之子父类中变量的特点

子父类出现后,类成员的特点: 明确一个类中的成员组成:1.变量 2.函数 3.构造函数 首先,看1.变量: 如果子类中出现非私有的同名成员变量时, 子类要访问本类中的变量,用this 子类要访问父类中的同名变量,用super super的使用和this的使用几乎一致 this代表的是本类对象的引用 super代表的是父类对象的引用 其次,看2.函数: 当子类出现和父类一模一样的函数时,当子类对象调用该函数,会运行子类函数的内容,如同父类的函数被覆盖一样. 这种情况是函数的另一个特性重写(覆盖)

2016.7.11子父类中方法的覆盖要点

子类new出来的对象,可以调用父类中的方法(private修饰的除外),但当子类中出现父类方法名以及参数一样的方法时,子类中的方法就是重载,覆盖父类中的相同的方法. 注意的方面: 1.子类中的方法与父类中的方法在“有无返回”.“有无参数”都应该一样的.不一样无法覆盖,但是子类中的方法还是可以被调用的,因为它就是区别于父类中的方法了. 2子类中权限修饰符的等级一定要大于或者等于父类中的,不然也是无法覆盖的哦.(public>defualt默认的>private) 3.静态的方法只能覆盖静态的方法

子父类中的构造函数

继承: 特点: 1,提高了代码的复用性. 2,让类与类之间产生关系,是多态性的前提. Java中的继承. 1,java只支持单继承,不支持多继承.为啥呢?答案:因为继承了多个父类如果有相同方法时, 子类对象不确定运行哪一个. 2,Java还支持多层继承.A-->B--->C 原来可以形成继承体系. 想要使用体系功能,"查阅父类功能,建立子类对象调用功能." 注解:父类的由来其实是由事物中的共性内容不断向上抽取而来的. 所以父类中定义的是该体系中的最基本,最共性功能. 继承出

面向对象(子父类中函数的特点-覆盖)

/* 2,子父类中的函数. 当子类出现和父类一模一样的函数时,//不同名的函数,父类中的非私有函数子类乐意直接拿来用. 当子类对象调用该函数,会运行子类函数的内容. 如同父类的函数被覆盖一样. 这种情况是函数的另一个特性:重写(覆盖)   //前面讲了一个函数的特性,重载//其实父类中的方法还在内存当中,只是没有运行而已. 当子类继承父类,沿袭了父类的功能,到子类中,  //覆写的好处可以用于扩展. 但是子类虽具备该功能,但是功能的内容却和父类不一致, 这时,没有必要定义新功能,而是使用覆盖特殊

面向对象(子父类中变量、函数、构造函数的特点)

/** * Created by 刘朋程 博客园 on 2014-07-15. */ class fu {     int num = 4 ;               //定义父类的变量num = 4     fu()                        //定义父类的构造函数     {         System.out.println("fu run");     }     void speak()                //定义父类的方法     {

面向对象(子父类中变量的特点)

/* 子父类出现后,类成员的特点: 类中成员: 1,变量. 2,函数. 3,构造函数. //如果子类中出现父类中非私有的非同名成员变量时,可以直接使用. 1,变量 如果子类中出现非私有的同名成员变量时, 子类要访问本类中的变量,用this            //不写也行,省略了this.//this是本类对象的引用,super是父类对象的引用. 子类要访问父类中的同名变量,用super. super的使用和this的使用几乎一致. this代表的是本类对象的引用. super代表的是父类对象

JavaSE8基础 当父类与子类中的成员变量重名了,使用super.名字 来访问父类的成员变量

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        代码: /* * 当父类与子类中的成员变量重名了,使用super.名字 来访问父类的成员变量 */ //基类 class Person { public int num = 1; } //子类 class Javaer extends Person { //子类中的成员变量与父类重名了 public int num