IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> &4 - 继承、父子类、多态、向上造型、类型系统 -> 正文阅读

[大数据]&4 - 继承、父子类、多态、向上造型、类型系统

继承

媒体资料库的设计

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, Stirng comment) {
	super();
	this.title = title;
	this.artist = artist;
	this.numofTracks = numofTracks;
	this.playingTime = playingTime;
	this.comment = comment;
	}
	public void print(){
		System.out.println(title+":"+aritst);
		......
	}
}
public class DVD {
	private String title;
	private String director;
	private int playingTime;
	private boolean gotIt = false;
	private String comment;

	public CD(String title, String director, int playingTime, Stirng comment) {
	super();
	this.title = title;
	this.director = director;
	this.playingTime = playingTime;
	this.comment = comment;
	}
}

CD和DVD几乎一摸一样

public class Database {
	private ArrayList<CD> listCD = new ArrayList<CD>();
	private ArrayList<DVD> listDVD = new ArrayList<DVD>();

	public void add(CD cd) {
		listCD.add(cd);
	}
	public void add(DVD dvd) {
		listCD.add(cd);
	}
	public void list(){
		for (CD cd : listCD) {
			cd.print();
		}
		for (DVD dvd : listDVD) {
			dvd.print();
		}
	}
}

在DataBase中的使用也一模一样,不同的只有一个是cd一个是dvd
在这两段代码中出现两大量的代码复制,是代码质量不良的一种表现,意味着将来维护这样的代码是不容易的(后期想修改print函数,每一个print都需要更改;不便于增加新的类)

修改方法:extend

建立一个Item类,CD是一种Item,DVD也是一种Item
public class DVD extends Item
public class CD extends Item
使得DVDheCD都是Item的子类

public class Item {
	public void print() {
	}
}
public class Database {
	private ArrayList<Item> listItem = new ArrayList<item>();

	public void add(Item item) {
		listItem.add(item);
	}

	public void list(){
		for (Item item : listItem) {
			item.print();
		}
	}
	public static void main(String[] args) {
		DataBase db = new DataBase();
		db.add(new CD("abc", "abc", 4, 60, "..."));
		db.add(new CD("def", "def", 4, 60, "..."));
		db.add(new DVD("xxx", "xxx", 4, 60, "..."));
		db.list();
	}
}

在这里插入图片描述

现在DataBase只认识Item这个类,它与CD和DVD没有直接联系了。
CD从Item中继承,cd得到Item中的所有。
父类有什么,子类天然有什么,在子类中都是可能可以用的(涉及到访问权限的问题)。除此之外子类还可以增加新的东西。

此时的继承还不是完美的,还需要继续修改

子类父类关系

目前的代码从DataBase角度看,是完美的,只有一个容器,一个add函数,一个list中的for循环。
但从DVD和CD中看仍存在相同的东西,这些相同的东西可以提取出来,放入Item中。

public class Item {
	private String title;
	
	public void print() {
	}
}

当成员变量以private放入Item(父类)中,CD和DVD的构造函数会提示:“This field item.title is not visible”。
父类中private的东西只有父类自己可以用,子类无法使用(虽然子类继承得到了,但无法直接使用)。
这个问题有两个解决方案:

  1. 将private改为另外一个修饰符——protected(同一个包内可以访问,子类可以访问)
public class Item {
	protected String title;	
	public void print() {
	}
}
  1. 维持为private,不在子类中进行使用(该变量的初始化不放在子类中,在父类中进行初始化,子类中直接传入)
public class Item {
	private String title;
	private int playingTime;
	private String comment;
	public Item(String title) {
		super();
		this.title = title;
		this.playingTime = playingTime;
		this.comment = comment;
	}
	public void print() {
		System.out.println("Item");
	}
}
public class CD {
	private String artist;
	private int numofTracks;
	private boolean gotIt = false;

	public CD(String title, String artist, int numofTracks, int playingTime, Stirng comment) {
	super(title, playingTime, comment);	//自己不做title赋值,用super调用父类中的构造器
	this.artist = artist;
	this.numofTracks = numofTracks;
	}

没有super(),程序自动会去找父类中没有参数的构造器,父类中可以有很多构造器,只要参数不同就可以同时存在,子类中使用super会自动寻找父类中 合适的构造器

public class Item {
	private String title;
	public Item(){
	}
	public Item(String title) {
		super();
		this.title = title;
	}
	public void print() {
		System.out.println(title);
	}
}

DVD中也有title,从父类中同时继承了title;就近原则,离我最近的是自己的,此处DVD中构造器中的title是它自己的title,父类中的看不见。子类虽然不能直接使用父类中private的东西,但可以通过父类的函数调用来进行更改。
父子类中的同名变量没有任何关系。
若要使用父类中的成员函数,需要用到super去调用,比如这个print功能的完整实现,即需要用到子类中的print,也需要用到父类中的print

public class DVD {
	private String title;
	private String director;
	private boolean gotIt = false;
	private int playingTime;
	private String comment;

	public CD(String title, String director, int playingTime, Stirng comment) {
	this.title = title;
	this.director = director;
	this.playingTime = playingTime;
	this.comment = comment;
	}
	public void print() {
		System.out.ptint("DVD:");
		super.print();
		System.out.print(director);
	}
}

父类的定义、初始化先做,做完之后才轮到子类的定义、初始化

多态变量

  • Java的对象变量是多态的,它们能保存不止一种类型的对象
  • 它们可以保存的声明类型的对象,或声明类型的子类的对象
  • 当把子类的对象赋给父类的变量的时候,就发生了向上造型

在DataBase中,我们给的都是Item的子类的某个对象
在这里插入图片描述

子类和子类型:

  • 类定义了类型
  • 子类定义了子类行
  • 子类的对象可以被当作父类的对象来使用
    • 赋值给父类的变量
    • 传递给需要父类的对象的函数
    • 放进存放父类对象的容器里

子类型与赋值:

子类的对象可以赋值给父类的变量
在这里插入图片描述

子类和参数传递:

子类的对象可以传递给需要父类对象的函数
在这里插入图片描述

子类型和容器:

子类的对象可以放在存放父类对象的容器里
在这里插入图片描述

向上造型

把一个类型的对象赋给另外一个类型的变量
造型cast
子类的对象可以赋值给父类的变量
注意:Java中不存在对象对对象的赋值
父类的对象不能赋值给子类的变量

Vechicle v;
Car c = new Car();
v = c;		//可以
c = v;		//编译错误

可以用造型:
只有当v这个变量实际管理的是Car才行

c = (Car) v;

造型:

  • 用括号围起类型放在值的前面
  • 对象本身并没有发生任何变化(所以不是“类型转换”)
  • 运行时有机制来检查这样的转化是否合理
  • ClassCastException

向上造型:

  • 拿一个子类的对象,当作父类的对象来用
  • 向上造型是默认的,不需要运算符
  • 向上造型总是安全的

多态

此处的print,一个是声明类型,一个是动态类型,当调用时,会让实际管理的对象去做那个动作
在这里插入图片描述
函数调用的绑定:

  • 当通过对象变量调用函数的时候,调用哪个函数这件事情叫做绑定
    • 静态绑定:根据变量的声明类型来决定
    • 动态绑定:根据变量的动态类型来决定(动态——当时实际管理的对象类型,运行的时候才知道,Java中都是动态绑定)
  • 在成员函数中调用其他成员函数也是通过this这个对象变量来调用的。

覆盖override

  • 子类和父类中存在名称和参数表完全相同的函数,这一对函数构成覆盖关系
  • 通过父类的变量调用存在覆盖关系的函数时,会调用变量当时所管理的对象所属的类的函数

cd中的print就覆盖了item中的print,通过一个item的变量去调用print函数时,他会根据实际是哪一个类,来决定到底调用哪一个print函数

类型系统

OBJECT类

所有的类都是继承自Object的
在这里插入图片描述
Object类的函数:

  • toString();
  • equals();

不可以在自己构造的类中直接使用,需要override重载

DoMe的新媒体类型:可扩展性

很方便地添加新的类型,可拓展性好
在这里插入图片描述
在这里插入图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 23:15:00  更:2022-04-06 23:16:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:58:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码