java学习-抽象类和接口-抽象类初体验
今天在老师的带领下学习了抽象类(abstract)和接口(interface),总结一下今天所学的知识。
抽象类是在学习到接口时之前讲解,作为学习接口的铺垫。
下面是我今天写的例题。
一个Shape(形状)类抽象类为父类。
两个子类,Triangle(三角形) Circle(圆)类;
一个坐标类Point,用来帮助求面积和周长。
父类形状类--》 Shape:
public abstract class Shape {
public String name;
public String getName() {
return name;
}
/**
* 抽象类,求周长
* @return 周长的值
*/
public abstract double perimeter();
/**
* 抽象类,求面积
* @return 面积
*/
public abstract double area();
}
Point类(辅助类,帮助求三角形和圆的面积周长)
public class Point {
private double x; //成员变量
private double y;
/**
* 初始化方法
* @param x 横坐标
* @param y 纵坐标
*/
public void init(double x,double y){
this.x = x;
this.y = y;
}
/**
*
* @param p 计算距离的两个点之一(还有一个是this,即自己)
* @return 距离
*/
public double distance(Point p){
return Math.sqrt(Math.pow((p.x-this.x),2)+Math.pow((p.y-this.y),2)); // 当前对象 p1.distance(p2)) this 表示的是 p1
}
}
三角形类(Triangle)
public class Triangle extends Shape {
private Point ponitA ;// 坐标A
private Point ponitB ;// 坐标B
private Point ponitC ;// 坐标C
@Override
public String getName() {
return "三角形";
}
public Triangle(double x1,double y1,double x2,double y2,double x3,double y3){
ponitA = new Point();
ponitA.init(x1,y1);
ponitB = new Point();
ponitB.init(x2,y2);
ponitC = new Point();
ponitC.init(x3,y3);
}
/**
* 初始化三角形
* @param ponitA 第一个点
* @param ponitB 第二个点
* @param ponitC 第三个点
*/
public Triangle(Point ponitA,Point ponitB,Point ponitC){
this.ponitA = ponitA;
this.ponitB = ponitB;
this.ponitC = ponitC;
}
/**
* 计算周长
* @return 周长
*/
public double perimeter(){
double a = ponitA.distance(ponitB); //a到b的距离
double b = ponitB.distance(ponitC); //b到c的距离
double c = ponitC.distance(ponitA); //c到a的距离
return a+b+c;
}
/**
* 计算面积
* @return 面积
*/
public double area(){
new Point();
double a = ponitA.distance(ponitB); //a到b的距离
double b = ponitB.distance(ponitC); //b到c的距离
double c = ponitC.distance(ponitA); //c到a的距离
double s = (a+b+c)/2;
return Math.sqrt(s*(s-a)*(s-b)*(s-c));
}
}
圆类 Circle
public class Circle extends Shape{
private double r;
private Point p;// 圆心
@Override
public String getName() {
return "圆";
}
/**
* 初始化
* @param r 初始化半径
* @param x 初始化x
* @param y 初始化y
*/
public Circle(double r, double x,double y){
this.r = r;
Point p = new Point();
p.init(x,y);
this.p = p;
}
/**
* 第二种初始化方法
* @param p 定义一个坐标
* @param r 初始化半径
*/
public Circle(Point p,double r){
new Point();
this.p = p;
this.r = r;
}
/**
* 求面积
* @return 返回面积
*/
public double area( ){
return Math.PI*r*r;
}
/**
* 求周长
* @return 返回周长
*/
public double perimeter( ){
return Math.PI*r*2;
}
}
测试类 Test
public class Test {
public static void main(String[] args) {
Shape shape ;
Circle circle = new Circle(1,0,0);
Triangle triangle = new Triangle(0,0,0,3,4,0);
print(circle);
shape = triangle;//赋值兼容性规则,凡是需要用到父类对象的时候,都可以用子类代替它。
print(shape);
}
public static void print(Shape shape){
System.out.println(shape.getName()+"的周长是:"+shape.perimeter());
System.out.println(shape.getName()+"的面积是:"+shape.area());
}
}
测试结果:
学习总结
.抽象类-- 抽象类不可以用于对象创建, 比如说 Shape shape = new Shape();是错误的,只能 ---》Shape shape;
Shape shape = new Shape() 的时候会弹出来如下图所示,这个叫做匿名内部类。

这个匿名类简化了代码,把偶尔用到的类进行内部匿名。它实现了把接口,定义对象合二为一,是目前的主流写法。
要注意的是:匿名类在 代码段合起来以后 就像是一个语句,后面要加分号,这里容易出错。

匿名类应用最多的地方是键盘事件,下图是做贪吃蛇时用到的匿名类

java学习-抽象类和接口-抽象类初体验的更多相关文章
- Java学习笔记 07 接口、继承与多态
一.类的继承 继承的好处 >>使整个程序架构具有一定的弹性,在程序中复用一些已经定义完善的类不仅可以减少软件开发周期,也可以提高软件的可维护性和可扩展性 继承的基本思想 >>基 ...
- 深度学习之TensorFlow安装与初体验
深度学习之TensorFlow安装与初体验 学习前 搞懂一些关系和概念 首先,搞清楚一个关系:深度学习的前身是人工神经网络,深度学习只是人工智能的一种,深层次的神经网络结构就是深度学习的模型,浅层次的 ...
- (数据科学学习手札35)tensorflow初体验
一.简介 TensorFlow时谷歌于2015年11月宣布在Github上开源的第二代分布式机器学习系统,目前仍处于快速开发迭代中,有大量的新功能新特性在陆续研发中: TensorFlow既是一个实现 ...
- Java 学习笔记(7)——接口与多态
上一篇说了Java面向对象中的继承关系,在继承中说到:调用对象中的成员变量时,根据引用类型来决定调用谁,而调用成员方法时由于多态的存在,具体调用谁的方法需要根据new出来的对象决定,这篇主要描述的是J ...
- Java学习5之接口
接口不是类,而是一个特殊的名称,使用interface关键字.子类可以实现多个接口. 接口实现: public class Child extends Parent implements Interf ...
- java学习——JDK1.8接口和实现类
Java 8 新特性:接口的静态方法和默认方法 https://blog.csdn.net/sun_promise/article/details/51220518 接口的默认方法和静态方法 http ...
- 1)Java学习笔记:接口和抽象类的异同
Java接口和抽象类很像,他们有哪些相同点和异同点呢,下面我们做一个小结 相同 ① 都不能被实例化,都位于继承树的顶端,用于被实现或者继承 ② 都可以包含抽象方法,实现接口或者继承抽象类的普通子类都必 ...
- Java学习笔记之接口和抽象类
接口(interface)1.interface创建一个接口,implements实现接口 interface jiekou{} class lie implements jiekou{}2.接口可以 ...
- 《JAVA学习笔记(14-10---14-11抽象类)》
[14-10]面向对象-抽象类的产生 /* 描述狗,行为,吼叫. 描述狼,行为,吼叫. 发现他们之间有共性,可以进行向上抽取. 当然是抽取他们的所属共性类型,犬科. 犬科这类事物,都具备吼叫行为,但是 ...
随机推荐
- Python - 八大排序算法
1.序言 本文使用Python实现了一些常用的排序方法.文章结构如下: 1.直接插入排序 2.希尔排序 3.冒泡排序 4.快速排序 5.简单选择排序 6.堆排序 7.归并排序 8.基数排序 上述所有的 ...
- acm数论之旅(转载)---最大公约数与最小公倍数
gcd(a, b),就是求a和b的最大公约数 lcm(a, b),就是求a和b的最小公倍数 然后有个公式 a*b = gcd * lcm ( gcd就是gcd(a, b), ( •̀∀•́ ) ...
- JavaSE复习~运算符与表达式
运算符 运算符:进行特定操作的符号 表达式:用运算符进行操作的式子 算术运算符 首先是加减乘除:+.-.*./还有取余:% 整数进行算术操作得到的还是整数,例如整数使用 / 得到的是整数(商的整数部分 ...
- SpringBoot学习笔记(一)——构建springboot项目
生成一个SpringBoot的项目 开发和学习SpringBoot需要一个生成好的SpringBoot项目. 1.可以使用一些IDE(Integrated Development Environmen ...
- HDFS核心类FileSystem的使用
一.导入jar包 本次使用的是eclipse操作的,所以需要手动导入jar包 在Hadoop.7.7/share/hadoop里有几个文件夹 common为核心类,此次需要引入common和hdfs两 ...
- 实验一  GIT 代码版本管理
实验一 GIT 代码版本管理 实验目的: 1)了解分布式分布式版本控制系统的核心机理: 2) 熟练掌握git的基本指令和分支管理指令: 实验内容: 1)安装git 2)初始配置git ,git ...
- Git - reset和checkout的区别
参考 https://segmentfault.com/a/1190000006185954 1. Git的所有操作实际上是在操作这三个区域的状态(或内容) 2. 区别 checkout是会修改HEA ...
- 阿里云linux挂载磁盘
1)使用fdisk -l命令查看主机上的硬盘 2.使用mkfs.ext4命令把硬盘格式化: mkfs.ext4 磁盘名称 如:mkfs.ext4 /dev/vdb/ 3. 使用mount命令 ...
- Atom 必装插件
Atom 必装插件 转载请注明出处. https://blog.csdn.net/Nick_php/article/details/54020956 主题 atom-material-ui 字体配色 ...
- Linux环境查看Java应用消耗资源情况
linux线上资源耗时定位 https://www.cnblogs.com/wuchanming/p/7766994.html 1. jps -ml 查看服务器上运行的Java程序 2. jmap 查 ...
学习总结