面向对象——继承

一、继承概述:

  多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只需要继承那个类即可。

多个类可以称为子类,单独这个类称为父类或者超类,基类等。

子类可以直接访问父类中的非私有的属性和行为。

通过extends关键字让类与类之间产生继承关系。

例如: class B extedns A {  }

 

二、继承的好处?

1、提高了代码的复用性。

2、继承的出现让类与类之间产生了关系,提供了多态的前提。

 

Java中只支持单继承。不直接支持多继承,但是对c++中的多继承提供了改良。

单继承:一个类只能有一个父类。类似于一个儿子只能有一个父亲。

多继承:一个子类可以有多个直接父类(java中不允许,进行改良)

              不直接支持,因为多个父类中有相同成员,会产生调用的不确定性。在Java中是通过“多实现”的方式来体现。

Java支持多层(多重)继承

C继承B,B继承A时,就会出现一个继承体系。

1、查看该体系的顶层类,了解该体系的基本功能。

2、创建体系中的最子类对象,完成功能的使用。

 

三、什么时候定义继承呢?

当类与类之间存在着所属关系的时候,就定义继承。xxx是yyy中的一种。xxx extends yyy

所属关系: is a 的关系。

class Demo
{
	void show1(){}
}


class DemoA extends Demo
{
//	void show1(){}
	void show2(){}
}
class DemoB extends Demo
{
//	void show1(){}
	void show3(){}
}

四、子父类中成员变量的特点。

  1、在子父类中,成员的特点体现。

(一)、成员变量

(二)、成员函数

(三)、构造方法

 

(一)、成员变量

 

当本类中的成员和局部变量同名时用this区分

当子父类中的成员变量同名用super关键字区分父类。

 

this和super的用法很相似。

this :代表一个本类对象的引用。

super: 代表一个父类空间

 

class Fu
{
	private int num = 4;  //继承中不能定义为private,虽然下面定义了函数可以访问,但实
                              //际开发中不允许此类写法。

	public int getNum()
	{
		return num;
	}
}


class Zi extends Fu
{
	private int num = 5;


	void show()
	{
		System.out.println(this.num+"....."+super.getNum());
	}
}


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

   (二)、成员函数

当子父类中出现成员函数一模一样的情况,会优先运行子类的函数。
这种现象,称为覆盖操作。这是函数在子父类中的特性。
函数两个特性:
    1,重载。同一个类中。overload
    2,覆盖。子类中。覆盖也称为重写,覆写。override
    
覆盖注意事项:
1,子类方法覆盖父类方法时,子类权限必须要大于等于父类的权限。 
2,静态只能覆盖静态,或被静态覆盖。

3、覆盖的应用:当子类需要父类的功能,而子类中又有自己特有的方法时,可以重写父类方法,这样既沿袭了父类方法,又定义了子类特有的内容。

 

 

class Fu
{
	public static  void show()
	{
		System.out.println("fu show run");
	}
}

class  Zi extends Fu
{
	public static void show()
	{
		System.out.println("Zi show run");
	}
}

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

	}
}

 

 

当子父类中出现成员函数一模一样的情况,会运行子类的函数。
这种现象,称为覆盖操作。这时函数在子父类中的特性。
函数两个特性:
    1,重载。同一个类中。overload
    2,覆盖。子类中。覆盖也称为重写,覆写。override
    
覆盖注意事项:
1,子类方法覆盖父类方法时,子类权限必须要大于等于父类的权限。 
2,静态只能覆盖静态,或被静态覆盖。
 

(三)构造函数

 子父类中构造函数的特点。

 在子类构造对象时,发现访问子类的构造函数时,父类的构造函数也执行了。为什么?

     子类构造函数中第一行有一个默认的隐式语句。super();

子类的实例化过程:子类中所有的构造函数会默认的访问父类中的空参构造函数。

 

 为什么子类实例化过程的时候要访问父类的空参数构造函数?

   那是因为子类继承了父类,获取了父类的属性,在使用父类内容之前,要先去父类中看是如何初始化父类属性的。所以子类在实例化过程中必须要访问父类中的构造函数。为了子类必须访问父类的空参构造函数,必须在子类的第一行加上super();默认有

 

如果父类中没有定义空参构造函数,那么子类狗造函数中必须用super(); 明确要调用父类中的哪个构造函数。

如果子类中有this 调用了当前构造函数时,那么super(); 就没有了,因为this 和super() 只能存在子类构造函数的第一行。两个都只能存在第一行,所以两个只能存在一个。但是可以保证的是,子类中肯定会有其他构造函数去访问父类的构造函数。

注意:supre语句必须要定义在子类构造函数的第一行。因为父类的初始化动作要先完成。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真香号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值