java多态和继承_Java 继承和多态

一、

1、媒体资料库

package dome;

//CD类

public class CD {

private String title;//名称

private String artist;//歌手

private int numofTracks;//几首歌

private int playingTime;//播放时间

private boolean gotIt;//是否借出

private String comment;//评论

//构造函数初始化对象

public CD(String title, String artist, int numofTracks, int playingTime, String comment) {

super();

this.title = title;

this.artist = artist;

this.numofTracks = numofTracks;

this.playingTime = playingTime;

this.comment = comment;

}

public void print() //类输出

{

System.out.println("CD:"+title+"-"+artist);

}

public static void main(String[] args) {

// TODO Auto-generated method stub

}

}

package dome;

//DVD类

public class DVD {

private String title;

private String director;

private int playingTime;

private boolean gotIt;

private String comment;

public DVD(String title, String director, String comment, int playingTime) {

super();

this.title = title;

this.director = director;

this.playingTime = playingTime;

this.comment = comment;

}

public void print() {

System.out.println("DVD:"+title+"-"+director);

}

}

package dome;

import java.util.ArrayList;

//媒体库

public class Datebase {

private ArrayList listCD=new ArrayList();

private ArrayList listDVD=new ArrayList();

public void add(CD cd)

{

listCD.add(cd);

}

public void add(DVD dvd)

{

listDVD.add(dvd);

}

public void list()

{

for(CD cd:listCD)

{

cd.print();

}

for(DVD dvd:listDVD)

{

dvd.print();

}

}

public static void main(String[] args) {

Datebase db=new Datebase();

db.add(new CD("abc", "abc", 4, 60, "***"));

db.add(new CD("def", "def", 4, 60, "***"));

db.add(new DVD("xxx","aaa","...", 60));

db.add(new DVD("yyy","bbb","...", 60));

db.list();

}

}

46b544ca2468e67911ae389ba0b4f92f.png

2、上面程序有很多重复的代码,利用父类和子类的继承,可以将公共的提取出来,作为父类,独有的作为子类,然后利用protected 或者super,实现相互调用

父类 item类程序

package dome;

public class item {

protected String title;//将private 改为protected ,这样整个包下,所有子类都可以访问

private int playingTime;//播放时间

private boolean gotIt;//是否借出

private String comment;//评论

//构造器赋初始值

public item(int playingTime, String comment) {

super();

this.playingTime = playingTime;

this.comment = comment;

}

public void print() {

System.out.print(playingTime+"-"+comment);//这两个private在子类输出不了,在父类定义输出

}

public static void main(String[] args) {

// TODO Auto-generated method stub

}

}

由于两者作用范围不一样,所以具体的代码也不一样。

private 需要在父类中就定义构造器,并初始化。利用super传值。

protected则不用再父类中做操作,但是这种方法相对不安全。

子类

package dome;

//CD类

public class CD extends item{//继承item

private String artist;//歌手

private int numofTracks;//几首歌

//构造函数初始化对象

public CD(String title, String artist, int numofTracks, int playingTime, String comment) {

super(playingTime, comment);

this.title = title;

this.artist=artist;

this.numofTracks = numofTracks;

}

public void print() //类输出

{

System.out.print("CD:"+title+"-"+artist+numofTracks+"-");//直接输出

super.print();//调用父类输出

System.out.println("\n");

}

public static void main(String[] args) {

// TODO Auto-generated method stub

}

}

package dome;

public class DVD extends item {//继承 item

private String director;//导演

public DVD(String title, String director, String comment, int playingTime) {

super(playingTime,comment);

this.title = title;

this.director = director;

}

public void print() {

System.out.print("DVD:"+title+"-"+director+"-");//只有title,director 可以输出

super.print();//调用父类的print

System.out.println("\n");

}

}

主程序

package dome;

import java.util.ArrayList;

public class Datebase {

private ArrayList listItem=new ArrayList();//用父类

public void add(item i)

{

listItem.add(i);

}

public void list()

{

for(item i:listItem)

{

i.print();

}

}

public static void main(String[] args) {

Datebase db=new Datebase();

db.add(new CD("abc", "abc", 4, 60, "***"));//本来db add的是item,这里用子类对象来赋值给父类变量,向上造型

db.add(new CD("def", "def", 4, 60, "***"));

db.add(new DVD("xxx","aaa","...", 60));

db.add(new DVD("yyy","bbb","...", 60));

db.list();

}

}

再有注意,print()构造函数由于子类输出的独特性,所以在子类总构造了输出函数,

父类和子类中都有print输出函数,运行时会根据变量类型(item,CD,DVD )来选择适当的函数。这叫多态。

40d39ec0cf926397f51332b51bd8c0f1.png

二、

2.1

9172e38cad30474009df0617d0eeab65.png

其实就是定义了一个父类将所有共有的可以提取出来,然后子类当父类,进行运行,简化重复代码。

235f2b01d5f5de170a1fbdfb26580638.png

package Hello;

import java.util.ArrayList;

import java.util.HashSet;

public class test {

public static void main(String[] args) {

String s = "hello";

s="hi";

System.out.println(s);

}

}

33b12f22e04c5bccec15c3026cf6b5c1.png

7625e77222370d83ff744e1a0ce621db.png

可以看到s的对象是“Hello”时,id=19;

对象是hi时,id=23;可以看出并不是Hi将hello替换掉了,而是s指向了新的对象。

2.2

2815d744d455155bee34e06d33204983.png

注意变量和对象的区别。变量只是声明了个名称,对象则是new了初始化个值,

85b5aef26eb60a93914c1e6b5207b623.png

父类的对象不可以赋值给子类的变量

ce472bab701ed9f3ff27bb7ed184afeb.png

子类的对象可以赋给父类的变量。

debug 程序如下

22行运行后,得到如下结果

d44dec462d3e9b3da73640dead14d104.png

23行运行完后

de2ee011b1514c4dd708d526e24f1cfc.png

24行运行完后

3da0313431b13caa0b95588f2f37eba3.png

it和cd指向了同一个对象。

9160a1eee1c9b2f609d8e3dedd61092c.png

对于基本数据类型叫类型转换,对对象来说叫造型。

34aec1f9249ada0c3f1b90505db94585.png

三、多态

b7800b3cb466d6ee9250d2fbbc03fd5c.png

3bd054c61e9431c5174403b68ea6798a.png

根据变量类型,自动调用合适的函数。

四、

f48ec31a62118dc86b020b4b536bf544.png

object的函数

f3c07461236836ba1bcda2e81e9618e8.png

4.1  toString()

1a3e9e8fd9327cf5991562a9afce54c0.png

68485553c1777935e2ba8e253743a79d.png

利用Object的toString()函数输出

修改item

package dome;

public class item {

protected String title;//将private 改为protected ,这样整个包下,所有子类都可以访问

private int playingTime;//播放时间

private boolean gotIt;//是否借出

private String comment;//评论

//构造器赋初始值

public item(int playingTime, String comment) {

super();

this.playingTime = playingTime;

this.comment = comment;

}

public void print() {

System.out.print(playingTime+"-"+comment);//这两个private在子类输出不了,在父类定义输出

}

@Override

public String toString() {

//return "item [title=" + title + ", playingTime=" + playingTime + ", gotIt=" + gotIt + ", comment=" + comment

//+ ", toString()=" + super.toString() + "]";

return playingTime+"-"+comment;

}

public static void main(String[] args) {

// TODO Auto-generated method stub

}

}

修改CD

package dome;

//CD类

public class CD extends item{//继承item

private String artist;//歌手

private int numofTracks;//几首歌

//构造函数初始化对象

public CD(String title, String artist, int numofTracks, int playingTime, String comment) {

super(playingTime, comment);

this.title = title;

this.artist=artist;

this.numofTracks = numofTracks;

}

public void print() //类输出

{

System.out.print("CD:"+title+"-"+artist+"-"+numofTracks+"-");//直接输出

super.print();//调用父类输出

System.out.println("\n");

}

@Override

public String toString() {

//return "CD: [artist=" + artist + ", numofTracks=" + numofTracks + ", toString()=" + super.toString() + "]";

return "CD:"+title+"-"+artist+"-"+numofTracks+"-"+super.toString();

}

public static void main(String[] args) {

// TODO Auto-generated method stub

CD cd=new CD("abc","def",4,60,"good");

cd.print();//调用 print() 函数输出

System.out.println(cd);//调用toString()函数,不过需要自己修改输出格式

}

}

72d93a3b952b30899fb664ed6e1239a6.png

4.2

package dome;

public class DVD extends item {//继承 item

private String director;//导演

public DVD(String title, String director, String comment, int playingTime) {

super(playingTime,comment);

this.title = title;

this.director = director;

}

public void print() {

System.out.print("DVD:"+title+"-"+director+"-");//只有title,director 可以输出

super.print();//调用父类的print

System.out.println("\n");

}

public static void main(String[] args) {

DVD dvd=new DVD("xxx","aaa","...", 60);

DVD dvd1=new DVD("xxx","aaa","...", 60);

DVD dvd2;

dvd2=dvd;

System.out.println(dvd.equals(dvd1));//调用了Object的equals

System.out.println(dvd.equals(dvd2));

}

}

e380cd6d8f8bf8f141cc7109d5499a68.png

5a433683ffcedaa2dc9454d0720e3e64.png

可以看出dvd和dvd2是一样的,因为dvd2是由dvd赋值过去的,他们共同管理一个位置。

而dvd1是new初始化生成的,位置不同。

但是这里他们的内容明明是相同的,所以还需要修改代码。

4.3

f03d736c11a5831f1f30cd730b8615cf.png

6e769e43b69185517f3e72dbd7165911.png

package dome;

public class DVD extends item {//继承 item

private String director;//导演

public DVD(String title, String director, String comment, int playingTime) {

super(playingTime,comment);

this.title = title;

this.director = director;

}

public void print() {

System.out.print("DVD:"+title+"-"+director+"-");//只有title,director 可以输出

super.print();//调用父类的print

System.out.println("\n");

}

@Override

public boolean equals(Object obj) {

// TODO Auto-generated method stub

//return super.equals(obj);

DVD dvd=(DVD)obj;//向下造型

return director.equals(dvd.director);//导演相同

}

public static void main(String[] args) {

DVD dvd=new DVD("xxx","aaa","...", 60);

DVD dvd1=new DVD("xxx","aaa","...", 60);

DVD dvd2;

dvd2=dvd;

System.out.println(dvd.equals(dvd1));//调用了Object的equals

System.out.println(dvd.equals(dvd2));

}

}

30fbd78ab09830f0c2d6a02c6a20dabb.png

@Override 表明下面的函数是覆盖了父类的函数(Object的函数) ,该函数表头是固定的,不可以修改。

五、类的扩展

1f327a9cf4aa4041fee472be5abe8fbb.png

构造函数

9eea26ef91a355b69e0516e9a82882cb.png

创建print函数

ef034a1c376e73df9533a33d10095e4a.png

package dome;

public class videogame extends item {

private int numofplayer;

private String gamename;

//对象初始化

public videogame(int numofplayer,String gamename,int playingTime, String comment) {

super(playingTime, comment);

// TODO Auto-generated constructor stub

this.numofplayer=numofplayer;

this.gamename=gamename;

}

@Override

public void print() {

// TODO Auto-generated method stub

System.out.print("videogame:"+gamename+"-"+numofplayer+"-");//只有title,director 可以输出

super.print();//调用父类的print

System.out.println("\n");

}

@Override

public String toString() {

// TODO Auto-generated method stub

return "videogame:"+gamename+"-"+numofplayer+"-"+super.toString();

}

public static void main(String[] args) {

videogame vg=new videogame(5,"hah",30,"great");

vg.print();

System.out.println(vg);

}

}

786e2b5c3c6427a08c3d9f285db608bd.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值