大数据学习--day11(抽象类、接口、equals、compareTo)
抽象类、接口、equals、compareTo
什么是抽象方法 ?
什么是抽象类 ?
抽象类 可以包含什么成员 ?
抽象类的特性
抽象类的应用场景
抽象类是 完全抽象 -> 部分抽象 -> 正常类 , 中间的过渡
接口
接口中 可以包含什么成员 ?
接口的特性 :
抽象类 和 接口的 异同
你选择使用接口和抽象类的依据是什么?
abstract class Door {
public abstract void open();
public abstract void close();
}
或者:
interface Door {
public abstract void open();
public abstract void close();
}
但是现在如果我们需要门具有报警alarm( )的功能,那么该如何实现?下面提供两种思路:
1)将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;
2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。
从这里可以看出, Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口
interface Alram {
void alarm();
}
abstract class Door {
void open();
void close();
}
class AlarmDoor extends Door implements Alarm {
void oepn() {
//....
}
void close() {
//....
}
void alarm() {
//....
}
}
equals、Comparable
两个类比较,比较的是地址
重写equals方法,每个属性比较相等。要比较大小,实现接口。
public class Person implements Comparable{
public String name;
private int age ;
private boolean sex;
public Person() {
// TODO Auto-generated constructor stub
}
public Person(String name , int age, boolean sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
/**
* 如果有属性是引用数据类型 , 一定不能 == 来比较
* 而是调用属性对象的 equals 方法
*/
/**
* instanceof 关系运算符
* 使用格式 :
* 对象 instanceof 类名 ;
* 返回 布尔值
* 如果 对象是该类的对象 , 那么返回true 反之false
*
*/
/**
* 基本数据类型强转 : 可能会丢失数据
* 引用数据类型强转 : 可能会有类型不匹配异常 java.lang.ClassCastException
* 如果没有继承关系 不能强转
*/
@Override
public boolean equals(Object obj) {
if( this == obj)
return true;
// 判断 obj 是本类对象
if( !(obj instanceof Person) )
return false;
// 引用数据强转 经过判断之后可以放心的强转了
Person p = (Person)obj;
// 接下来是 具体的判断是否相等的 业务逻辑
if( this.age == p.age)
if(this.sex == p.sex)
if(this.name.equals(p.name))
return true;
return false;
}
/**
* 1. 判断参数是不是本类对象
* 2. 书写具体的比较规则
*/
// @Override
// public int compareTo(Object o) {
// if( !(o instanceof Person) )
// return 0 ; // 类型不一样 没办法比 直接给结果
//
// // 强转
// Person p = (Person)o;
//
// // 此次比较完全按照 age 比较
// int result = this.age - p.age;
// System.out.println("Person.compareTo("+result+")");
// return result;
// }
// @Override
// public int compareTo(Object o) {
// if( !(o instanceof Person) )
// return 0 ; // 类型不一样 没办法比 直接给结果
//
// // 强转
// Person p = (Person)o;
//
// // 此次比较完全按照 sex 比较
// // 先规定 true = 0 false = 1 ;
// int result = (this.sex ? 0 : 1) - (p.sex ? 0 : 1);
// System.out.println("Person.compareTo("+result+")");
// return result;
// }
// @Override
// public int compareTo(Object o) {
// if( !(o instanceof Person) )
// return 0 ; // 类型不一样 没办法比 直接给结果
//
// // 强转
// Person p = (Person)o;
//
// // 此次比较按照 age sex 比较 规定 true = 0 false = 1
// // 先按照age比较 , age 相等 按照 sex 比
//
// int result = this.age - p.age ;
// if( result == 0 ) // 相等
// return (this.sex ? 0 : 1) - (p.sex ? 0 : 1); // age 相等 return sex 的结果
//
// return result;// age 不等 , 直接 return age 的比较结果
// }
@Override
public int compareTo(Object o) {
if( !(o instanceof Person) )
return 0 ; // 类型不一样 没办法比 直接给结果
// 强转
Person p = (Person)o;
// 此次比较按照 age sex name比较 规定 true = 0 false = 1
// 先按照age比较 , age 相等 按照 sex 比 , sex 相等按照 name
int result = this.age - p.age ;// age 的结果
if( result == 0 ){ // 相等
result = (this.sex ? 0 : 1) - (p.sex ? 0 : 1); // sex 的结果
if(result == 0)
return this.name.compareTo(p.name);
}
return result;
}
}
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
Person p = new Person("张三a",18, true);
Person p2 = new Person("张三c",18, true);
Person p3 = new Person("张三2",20, true);
Person p4 = new Person("张三3",18, false);
Person p5 = new Person("张三b",18, true);
Person[] ps = {p , p2 , p3 , p4 , p5};
// 直接把 Person 数组给Arrays 排序
Arrays.sort(ps);
// java.lang.ClassCastException: com.equals.Person cannot be cast to java.lang.Comparable
System.out.println("=============================");
for (Person person : ps) {
System.out.println(person);
}
}
}
大数据学习--day11(抽象类、接口、equals、compareTo)的更多相关文章
- 大数据学习笔记——Java篇之集合框架(ArrayList)
Java集合框架学习笔记 1. Java集合框架中各接口或子类的继承以及实现关系图: 2. 数组和集合类的区别整理: 数组: 1. 长度是固定的 2. 既可以存放基本数据类型又可以存放引用数据类型 3 ...
- 大数据学习笔记——Hadoop编程实战之HDFS
HDFS基本API的应用(包含IDEA的基本设置) 在上一篇博客中,本人详细地整理了如何从0搭建一个HA模式下的分布式Hadoop平台,那么,在上一篇的基础上,我们终于可以进行编程实操了,同样,在编程 ...
- 大数据学习系列之五 ----- Hive整合HBase图文详解
引言 在上一篇 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机) 和之前的大数据学习系列之二 ----- HBase环境搭建(单机) 中成功搭建了Hive和HBase的环 ...
- 大数据学习系列之九---- Hive整合Spark和HBase以及相关测试
前言 在之前的大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 中介绍了集群的环境搭建,但是在使用hive进行数据查询的时候会非常的慢,因为h ...
- 大数据学习系列之—HBASE
hadoop生态系统 zookeeper负责协调 hbase必须依赖zookeeper flume 日志工具 sqoop 负责 hdfs dbms 数据转换 数据到关系型数据库转换 大数据学习群119 ...
- 大数据学习(一) | 初识 Hadoop
作者: seriouszyx 首发地址:https://seriouszyx.top/ 代码均可在 Github 上找到(求Star) 最近想要了解一些前沿技术,不能一门心思眼中只有 web,因为我目 ...
- 大数据学习路线,来qun里分享干货,
一.Linux lucene: 全文检索引擎的架构 solr: 基于lucene的全文搜索服务器,实现了可配置.可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面. 推荐一个大数据学习群 ...
- 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机)
引言 在大数据学习系列之一 ----- Hadoop环境搭建(单机) 成功的搭建了Hadoop的环境,在大数据学习系列之二 ----- HBase环境搭建(单机)成功搭建了HBase的环境以及相关使用 ...
- 大数据学习系列之六 ----- Hadoop+Spark环境搭建
引言 在上一篇中 大数据学习系列之五 ----- Hive整合HBase图文详解 : http://www.panchengming.com/2017/12/18/pancm62/ 中使用Hive整合 ...
随机推荐
- python 案例一(电话铺)
经过自己努力,做了一个简单的电话铺的录入和查询小程序,比较简单,喜欢的朋友可以练练手. 题目: 创建你自己的命令行 地址簿 程序.在这个程序中,你可以添加.修改.删除和搜索你的联系人(朋友.家人和同事 ...
- 新鲜出炉的Java开发者中心,约起来!
入门教程.SDK 和工具推荐下载.操作方法指导.API 参考,Java 开发者需要的,这里应有尽有. ▼ 话说现在 Java 开发者在云端进行开发非常火热啊,「云+Java」就好比才子配佳人,真是难以 ...
- .Net深入体验与实践第一章
什么是委托?委托和事件是什么关系? 我的理解是委托朋友,事件是一个事情比如,中午12点要吃饭了,咱家搞忘了!还在继续嗨皮,我的朋友会叫我与他一起吃饭. 什么事反射? 可以获取.Net中的每个类型(类, ...
- Jenkins安装 CentOS 7上安装Jenkins
CentOS 7上安装Jenkins Jenkins 安装 只安装不介绍 步骤1:更新CentOS 7 Linux系统管理员的最佳做法之一是使系统保持最新.安装最新的稳定包,然后重新启动. 1 2 ...
- 元素设置float属性后,其后面的元素的位置问题
分两种情况: .content{ width:350px; height:150px; color:#fff; } .content1,.content2{ background-color: #00 ...
- 总结:从Node爬取数据到前端图表展示
最近寒假在家学习Node.js开发,光看书或者跟着敲代码还不够,得找一点有趣的事情来玩一玩,于是我决定写一个Node爬虫,爬取一些有意思或者说是有用的数据.这个决定只与我的兴趣有关,与Python或者 ...
- hdu-2685 I won't tell you this is about number theory---gcd和快速幂的性质
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2685 题目大意: 求gcd(am-1,an-1)%k 解题思路: 对于am-1 = (a - 1) ...
- 大数因式分解 Pollard_rho 算法详解
给你一个大数n,将它分解它的质因子的乘积的形式. 首先需要了解Miller_rabin判断一个数是否是素数 大数分解最简单的思想也是试除法,这里就不再展示代码了,就是从2到sqrt(n),一个一个的试 ...
- css 17课--
---------------------------------------------------------------------------------------------------- ...
- mxnet导入图像数据
图像的标签在一个json文件中. %matplotlib inline import json import gluonbook as gb import mxnet as mx from mxnet ...