JAVA笔记:shape类(接口,继承,lambda表达式...)
目录
写一段程序,实现shape面积,并可以对面积大小排序
定义父类shape类,并定义方法Area()
定义第一个子类Circle类
定义第二个子类Rect类
定义接口Comparator,并写入compare()方法
定义接口ISorter,继承Comparator类,并写入sorter()方法
定义AreaComparator类,实现Comparator接口
定义BubbleSorter类继承AreaComparator类,实现ISorter,Comparator接口
定义SelectSorter类继承AreaComparator类,实现ISorter,Comparator接口
定义Main类,写入主函数
关于这三种方法
一.定义一个AreaComparator的对象
二.不用定义对象,用lambda表达式(更加简洁,但是比较适合较为简单的关系)
三.不用定义对象,直接用匿名内部类
笔记:
关于接口(impelements,Interface)
关于继承(extends)
使用super调用父类中重写的方法、访问父类中被隐藏的字段
写一段程序,实现shape面积,并可以对面积大小排序
定义父类shape类,并定义方法Area()
public class Shape {public double Area() {return 0;}
}
定义第一个子类Circle类
包括圆心的坐标 x,y 圆的半径 r,构造函数及重写父类的Area()方法
public class Circle extends Shape {public int x;public int y;public int r;Circle(int xx,int yy,int rr){this.x=xx;this.y=yy;this.r=rr;}public double Area() { return r*r*3.14; }}
定义第二个子类Rect类
包括矩形的长、宽 x,y,构造函数及重写父类的Area()方法
public class Rect extends Shape{public int x;public int y;Rect(int xx,int yy){this.x=xx;this.y=yy;}public double Area() { return x*y; }}
定义接口Comparator,并写入compare()方法
用来比较面积
public interface Comparator {public boolean compare(Shape s1,Shape s2);
}
定义接口ISorter,继承Comparator类,并写入sorter()方法
用来排序
public interface ISorter extends Comparator{public void sorter(Shape[] ss,Comparator c);
}
定义AreaComparator类,实现Comparator接口
public class AreaComparator implements Comparator{public boolean compare(Shape s1,Shape s2) {return (s1.Area()>s1.Area()) ? true :false;}
}
定义BubbleSorter类继承AreaComparator类,实现ISorter,Comparator接口
这是冒泡排序的排序方法
public class BubbleSorter extends AreaComparator implements ISorter,Comparator{public void sorter(Shape[] ss,Comparator c) {for(int i=0;i<ss.length-1;i++) {for(int j=0;j<ss.length-1-i;j++) {if(c.compare(ss[i], ss[j])) {Shape a=ss[j];ss[j]=ss[i];ss[i]=a;}}}}}
定义SelectSorter类继承AreaComparator类,实现ISorter,Comparator接口
这是选择排序的排序方法
public class SelectSorter extends AreaComparator implements ISorter,Comparator {public void sorter(Shape[] ss,Comparator c) {for(int i=0;i<ss.length;i++) {int minindex=i;for(int j=i+1;j<ss.length;j++) {if(c.compare(ss[minindex], ss[j])) {minindex=j;}Shape a=ss[minindex] ;ss[minindex]=ss[j];ss[j]=a;}}
}}
定义Main类,写入主函数
其中AreaComparator方法可以用对象,lambda表达式,匿名内部类实现
public class Main {public static void main(String[] args) {Shape[] sss=new Shape[6];for(int i=0;i<sss.length;i++) {sss[i]=new Rect(i,i);}ISorter sort=new BubbleSorter(); //普通写法Comparator c= new AreaComparator(); //普通写法sort.sorter(sss, c); //普通写法System.out.println("==========普通写法=========");for(int i=0;i<sss.length;i++) {System.out.println(sss[i].Area());}Shape[] shape=new Shape[6];for(int i=0;i<shape.length;i++) {shape[i]=new Rect(i,i);}sort.sorter(shape, new Comparator() { //匿名内部类public boolean compare(Shape s1,Shape s2) { //匿名内部类return (s1.Area()>s1.Area()) ? true :false; //匿名内部类} //匿名内部类});System.out.println("==========匿名内部类=========");for(int i=0;i<shape.length;i++) {System.out.println(shape[i].Area());}System.out.println("==========Lambda表达式=========");Shape[] ss=new Shape[6];for(int i=0;i<ss.length;i++) {ss[i]=new Circle(i,i,i);}sort.sorter(ss, (s1,s2)->(s1.Area()>s2.Area())); //Lambda表达式for(int i=0;i<ss.length;i++) {System.out.println(ss[i].Area());}}
}
工作区图片
关于这三种方法
一.定义一个AreaComparator的对象
Comparator c= new AreaComparator();
将对象传入
sort.sorter(sss, c);
二.不用定义对象,用lambda表达式(更加简洁,但是比较适合较为简单的关系)
sort.sorter(ss, (s1,s2)->(s1.Area()>s2.Area()));
三.不用定义对象,直接用匿名内部类
sort.sorter(shape, new Comparator() {
public boolean compare(Shape s1,Shape s2) {
return (s1.Area()>s1.Area()) ? true :false;
}
});
笔记:
关于接口(impelements,Interface)
- 接口时为了弥补JAVA单继承的缺陷
- 在实现接口的时候,必须实现接口内的所有方法
- 抽象方法只能存在于抽象类或者接口中,但抽象类中却能存在非抽象方法,即有方法体的方法
- 接口是百分之百的抽象类
- 我们不能直接去实例化一个接口,因为接口中的方法都是抽象的,是没有方法体的
- 我们可以使用接口类型的引用指向一个实现了该接口的对象,并且可以调用这个接口中的方法(如:Comparator c=new AreaComparator)
- 用接口可以降低耦合性
关于继承(extends)
- 每个类都只能继承一个父类
- 每一个类都继承super()类(超级父类)
- 在子类中被重写的方法,其访问权限允许大于但不允许小于被其重写的方法,比如在父类中是protected,在子类中可以是public,但不可以是private
- 子类继承其父类的所有public和protected成员,但不能继承其父类的private成员
- 当调用被重写的方法时,调用的版本是子类的方法;
- 当调用被隐藏的方法时,调用的版本取决于是从父类中调用还是从子类中调用。
使用super调用父类中重写的方法、访问父类中被隐藏的字段
- 对父类的构造放的调用必须放在子类构造方法的第一行
- 如果父类构造器没有参数,则在子类的构造方法中不需要使用 super 关键字调用父类构造方法
- 如果父类的构造方法带有参数,则必须在子类的构造方法中显式地通过 super 关键字调用父类的构造方法
JAVA笔记:shape类(接口,继承,lambda表达式...)相关推荐
- JAVA学习笔记 15 - 函数式接口、Lambda表达式和方法引用
本文是Java基础课程的第十五课.主要介绍在JDK8中,Java引入的部分新特性,包括函数式接口.Lambda表达式和方法引用.这些新特性使得Java能够在按照面向对象思想进行开发的基础上,融合函数式 ...
- Java笔记 - 黑马程序员_08(Lambda表达式,接口组成更新,方法引用,类加载器,反射)
1. Lambda 1.1 函数式编程思想概述 在数学中,函数就是有输入量.输出量的一套计算方案,也就是"数据做操作" 面向对象思想强调"必须通过对象的形式来做事情&qu ...
- 【java笔记】类/接口作为成员变量类型
类/接口 作为成员变量 以英雄角色为例,有姓名,年龄,武器(类),技能(接口),攻击(方法) 技能接口: public interface Skill {void use();//使用技能的抽象方法 ...
- 【Java】 第六章 接口、lambda 表达式与内部类 Java核心技术卷1基础知识原书第10版 读书笔记
第六章 接口.lambda表达式与内部类 6. 接口.lambda 表达式与内部类 6.1 接口 6.1.1 接口概念 6.1.2 接口的特性 6.1.3 接口与抽象类 6.1.4 静态方法 6.1. ...
- CoreJava 笔记总结-第六章 接口、lambda表达式与内部类
文章目录 第六章 接口.lambda表达式与内部类 ==接口== 接口的概念 接口的属性 接口与抽象类 静态和私有方法 默认方法 解决默认方法冲突 接口与回调 `Comparator`接口 对象克隆 ...
- java 函数式接口与lambda表达式的关系
函数式接口与lambda表达式的关系 在java中,lambda表达式与函数式接口是不可分割的,都是结合起来使用的. 对于函数式接口,我们可以理解为只有一个抽象方法的接口,除此之外它和别的接口相比并没 ...
- Java 核心技术卷1 --第六章 接口、lambda表达式和内部类
吧Github代码链接: https://github.com/deyou123/corejava.git 第六章 接口.lambda表达式和内部类 6.1 接口 6.1.1 接口概念 接口不是类,而 ...
- Java新特性:Java8函数式接口与Lambda表达式(一)
摘要 何为函数式接口? 什么是lambda表达式,lambda表达式的本质: 函数式接口与lambda表达式的联系:lambda是实现函数式接口的一个快捷方式,可以作为函数式接口的一个实例: 常用Ja ...
- Lambda01 编程范式、lambda表达式与匿名内部类、函数式接口、lambda表达式的写法...
1 编程范式 主要的编程范式有三种:命令式编程,声明式编程和函数式编程. 1.1 命令式编程 关注计算机执行的步骤,就是告诉计算机先做什么后做什么 1.2 声明式编程 表达程序的执行逻辑,就是告诉计算 ...
最新文章
- OpenCASCADE绘制测试线束:OCAF 命令之标准演示命令
- 百度转换经纬度为地址
- 万恶之源 - Python基础数据类型一
- 同步设备IO与异步设备IO
- 用闭包的写法弹出元素的索引值
- hadoop配置文件还原_hadoop配置文件详解,安装及相关操作
- 加盟商最大的顾虑是什么?
- oracle number +1,number number(1)
- python请编写程序、生成随机密码_python习题:登录注册小程序(用户名密码存在文件中)、生成随机密码小程序...
- python车辆型号识别_python获取服务器的厂商和型号信息
- 理论+故事,开启你的量化阅读之旅
- android 如何绕过签名校验
- 在MySQL中实现交叉表查询2(动态交叉表)
- CAD矩形阵列应用与实战技巧
- 屏幕绘画 V1.1 - 一念(VB 绘制 图形)
- 用css写平行四边形
- char和数值的类型转换
- J2ME开发环境部署!
- 安卓 蓝牙遥控器键值配对 kl文件
- postman显示返回的base64图片验证码、二维码