java继承

以下内容是帮你梳理继承究竟是什么,耐心观看哦,一定会茅塞顿开的, 就算是老手也会有更深的体悟呢,代码也在下面,加油!!

一.

面向对象程序设计语言有三大特性:封装、继承和多态性。继承是面向对象语言的重要特征之一,没有继承的语言只能被称作“使用对象的语言”。继承是非常简单而强大的设计思想,它提供了我们代码重用和程序组织的有力工具。

类是规则,用来制造对象的规则。我们不断地定义类,用定义的类制造一些对象。类定义了对象的属性和行为,就像图纸决定了房子要盖成什么样子。

一张图纸可以盖很多房子,它们都是相同的房子,但是坐落在不同的地方,会有不同的人住在里面。假如现在我们想盖一座新房子,和以前盖的房子很相似,但是稍微有点不同。任何一个建筑师都会拿以前盖的房子的图纸来,稍加修改,成为一张新图纸,然后盖这座新房子。所以一旦我们有了一张设计良好的图纸,我们就可以基于这张图纸设计出很多相似但不完全相同的房子的图纸来。

基于已有的设计创造新的设计,就是面向对象程序设计中的继承。在继承中,新的类不是凭空产生的,而是基于一个已经存在的类而定义出来的。通过继承,新的类自动获得了基础类中所有的成员,包括成员变量和方法,包括各种访问属性的成员,无论是public还是private。当然,在这之后,程序员还可以加入自己的新的成员,包括变量和方法。显然,通过继承来定义新的类,远比从头开始写一个新的类要简单快捷和方便。继承是支持代码重用的重要手段之一。

类这个词有分类的意思,具有相似特性的东西可以归为一类。比如所有的鸟都有一些共同的特性:有翅膀、下蛋等等。鸟的一个子类,比如鸡,具有鸟的所有的特性,同时又有它自己的特性,比如飞不太高等等;而另外一种鸟类,比如鸵鸟,同样也具有鸟类的全部特性,但是又有它自己的明显不同于鸡的特性。

如果我们用程序设计的语言来描述这个鸡和鸵鸟的关系问题,首先有一个类叫做“鸟”,它具有一些成员变量和方法,从而阐述了鸟所应该具有的特征和行为。然后一个“鸡”类可以从这个“鸟”类派生出来,它同样也具有“鸟”类所有的成员变量和方法,然后再加上自己特有的成员变量和方法。无论是从“鸟”那里继承来的变量和方法,还是它自己加上的,都是它的变量和方法。

二.

对理解继承来说,最重要的事情是,知道哪些东西被继承了,或者说,子类从父类那里得到了什么。答案是:所有的东西,所有的父类的成员,包括变量和方法,都成为了子类的成员,除了构造方法。构造方法是父类所独有的,因为它们的名字就是类的名字,所以父类的构造方法在子类中不存在。除此之外,子类继承得到了父类所有的成员。

但是得到不等于可以随便使用。每个成员有不同的访问属性,子类继承得到了父类所有的成员,但是不同的访问属性使得子类在使用这些成员时有所不同:有些父类的成员直接成为子类的对外的界面,有些则被深深地隐藏起来,即使子类自己也不能直接访问。下表列出了不同访问属性的父类成员在子类中的访问属性:

父类成员访问属性

在父类中的含义

在子类中的含义

public

对所有人开放

对所有人开放

protected

只有包内其它类、自己和子类可以访问

只有包内其它类、自己和子类可以访问

缺省

只有包内其它类可以访问

如果子类与父类在同一个包内:只有包内其它类可以访问

否则:相当于private,不能访问

private

只有自己可以访问

不能访问

public的成员直接成为子类的public的成员,protected的成员也直接成为子类的protected的成员。Java的protected的意思是包内和子类可访问,所以它比缺省的访问属性要宽一些。而对于父类的缺省的未定义访问属性的成员来说,他们是在父类所在的包内可见,如果子类不属于父类的包,那么在子类里面,这些缺省属性的成员和private的成员是一样的:不可见。父类的private的成员在子类里仍然是存在的,只是子类中不能直接访问。我们不可以在子类中重新定义继承得到的成员的访问属性。如果我们试图重新定义一个在父类中已经存在的成员变量,那么我们是在定义一个与父类的成员变量完全无关的变量,在子类中我们可以访问这个定义在子类中的变量,在父类的方法中访问父类的那个。尽管它们同名但是互不影响。


 

在构造一个子类的对象时,父类的构造方法也是会被调用的,而且父类的构造方法在子类的构造方法之前被调用。在程序运行过程中,子类对象的一部分空间存放的是父类对象。因为子类从父类得到继承,在子类对象初始化过程中可能会使用到父类的成员。所以父类的空间正是要先被初始化的,然后子类的空间才得到初始化。在这个过程中,如果父类的构造方法需要参数,如何传递参数就很重要了。

三.

我们把用来做基础派生其它类的那个类叫做父类、超类或者基类,而派生出来的新类叫做子类。Java用关键字extends表示这种继承/派生关系:

class ThisClass extends SuperClass {

    //…

}

继承表达了一种is-a关系,

就是说,子类的对象可以被看作是父类的对象。

比如鸡是从鸟派生出来的,因此任何一只都可以被称作是一只鸟。

但是反过来不行,有些鸟是鸡,但并不是所有的鸟都是鸡。如果你设计的继承关系,导致当你试图把一个子类的对象看作是父类的对象时显然很不合逻辑,

比如你让鸡类从水果类得到继承,然后你试图说:这只本鸡是一种水果,所以这本鸡煲就像水果色拉。这显然不合逻辑,如果出现这样的问题,那就说明你的类的关系的设计是不正确的。

Java的继承只允许单继承,即一个类只能有一个父类。

下面来看代码

这是父类:

package 继承;

public class item {

	 //protected String title;//如果改成private,那么子类虽然继承了title,但是不可见,继承不代表能使用,private只有类内部能访问
	//也可以这样
	private String title;
	private int playtime;
	 private boolean gotit=false;
    private String comment;
	
	
	


//构造方法一
	public item(String title, int playtime, boolean gotit, String comment) {
		
		this.title = title;
		this.playtime = playtime;
		this.gotit = gotit;
		this.comment = comment;
	}


//构造方法二(无参)
	public item() {
		
	}


	public void settertitle(String title)
	{
		this.title=title;
	}
	

	public void print() {

		System.out.print(title);
	}

}

这是子类,public class DvD extends item表示DvD这个类继承item这个类,用extends关键字表示

package 继承;

public class DvD extends item {

	   //private String title;
	   private String director;
	   //private int playtime;
	  // private boolean gotit=false;
	   //private String comment;
	 
	   
	   
	public DvD(String title, String director, int playtime, String comment) {
		//如果没有super(),就会自动地去父类中找没有参数的构造函数
		//如果有super()但没有参数,也会去父类中找没有参数的构造函数
		//如果有super()也有参数,该函数就会去父类中找相应形参的构造函数
		//不能在一个构造函数里调用两次super()
		//super()必须在子类构造函数的第一行
		super(title,playtime,false,comment);//super可以借助构造函数来初始化父类里的private变量
		
		
		//this.title = title;//当子类拥有与父类完全一样的变量或方法时,子类就拥有两个一样的变量或方法,并且(以下接)
		//在子类中对这个变量或方法的操作是对子类自己这个变量或方法的操作,父类那个被隐藏起来了	
		//但回到父类那边进行操作时,是对从父类继承那个进行操作,即离我最近那个是我的,以下settertitle函数是例子
		settertitle("b");//变量例子
		this.director = director;
		
		
		
	}

public static void main(String[] args) {
	DvD dvD=new DvD("afjm", "bjbhh", 2, "good");
	
	dvD.print();
	
	
	
}


	public void print() {
		

		System.out.print("DvD:");
		super.print();//子类与父类中含有一模一样的方法时,用super.访问父类那个方法,方法后记得加括号
		
		System.out.println(director);
	}
	
	
	
	
}

运行结果如下:

DvD:bbjbhh

风轻轻吹!!!

5cf87d7c012a4f699131de32f537650a.png

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

76博ding

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

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

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

打赏作者

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

抵扣说明:

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

余额充值