实验3  继承与多态

**类可以实现多个接口 但只有单继承!**

1、继承

  1)、继承语法

    class 子类名 extends 父类{

     }

  2)、构造函数(通过source即可得到)

注意: 当子类实例化,首先调用父类构造函数,其次调用子类本身构造函数

  3)、函数重载:

  简单来说 相同函数名 参数需求不同 在调用时自动寻找匹配的函数

  4)、覆盖问题override

  子类重写了一个从父类继承过来的函数与属性

  ---当使用时就直接使用子类函数

  直接alt加 / 键就可重写

2final(用此定义的属性 为常量)

  

  1)、final定义的方法可继承,但不可override!

  2)、fianl定义的类不可派生子类(不可继承),但能生成对象

    3)、final变量对于对象实例a,不可修改指针(×b=a),但可修改实例的内部值(a.heigtht可修改)

3abstract(抽象)  

  1)abstract函数:函数只有声明没有函数体(没有实现)

    public abstract double area();

 注意:此函数主要用作给子类override!

    如果有抽象函数则必是抽象类

  2)abstract类:不能实例化,只能作为父类被其他类继承,可有成员函数、属性、抽象函数

    abstract class Shape{

    public abstract double area();

      /*可以其他非抽象函数*/

     }  

  注意:此类主要用作子类对象的相同处、都有的属性(金字塔顶)

    子类必须实现所有父类抽象类的方法,除非子类也是抽象类

    只有实现所有父亲的抽象类 才能成为非抽象类

4、接口:interface 都是抽象方法和一些静态属性.

具体的方法在子类中实现

  

  1)定义接口

     interface Shape{

  double pi=3.14;

  double area();

     }

  

  2)类实现接口:如果不是抽象类,就需要实现接口中所有抽象方法

   3)类实现多个接口 ,用,隔开

      class Circle implements Shape,Color{}

抽象类与接口的区别:

1 抽象类有部分方法可实现

2 接口所有方法都不可实现

3 接口继承多个接口,抽象类只能继承一个抽象类

4 抽象类有构造函数 接口没有

5 抽象类中可有main函数运行 接口不行

6 抽象类成员 private,public,protected

7 接口成员只能是public

实践编程

1、实现一个名为Person的类和它的子类Employee

具体要求如下:

(1)      Person类中的属性有:姓名name(String类型),地址address(String类型),电话号码telphone(String类型);

public class Person {
private String name;
private String address;
private String telephone;
public Person(String name, String address, String telephone) {
super();
this.name = name;
this.address = address;
this.telephone = telephone;
}
@Override
public String toString() {
return "name=" + name + ", address=" + address + ", telephone=" + telephone ;
}
}

(2)Employee类中的属性有:办公室office(String类型),工资wage(double类型)

public class Employee extends Person {
private String office;
private double wage;
public Employee(String name, String address, String telephone, String office, double wage) {
super(name, address, telephone);
this.office = office;
this.wage = wage;
}
@Override
public String toString() {
return super.toString()+", office=" + office + ", wage=" + wage ;
}
}

(3)测试代码,各个属性赋值在构造函数中完成。

public class test {
public static void main(String[] args) {
Employee e=new Employee("cf", "China", "911", "school", 20000);
System.out.println(e.toString());
}
}

2.方法调用匹配测试

class  methodMatch{
double x=5,y=6;
void test( double y ){
System.out.println(y);
test(this); //转换匹配哪个方法
}
public String toString(){
return x+","+y;
}
void test( String a){
System.out.println(a);
}
void test( Object a){
System.out.println(a);
}
public static void main(String args[]) {
methodMatch a=new methodMatch ();
a.test(8);
a.test("hello");
}
}

Q:分析以上程序运行结果,删除test(String)方法后结果如何?加入一个test(int)方法执行结果又如何?最后,总结方法调用的匹配原则。

A:

  8.0

  5.0,6.0

  hello

  先找是否有与其变量匹配的

  若没有则进入obj(万物皆对象)

  Print(obj)时会调用tostring方法

3.将以下程序补充完整

public class Java_3{
public static void main(String[] args){
Person p = new Student("王甜甜", "计算机科学");
System.out.println(p.getName() + ", "+ p.getDescription());
}
} abstract class Person{
public Person(String n){
name = n;
}
//*********Found********
public __abstract____ String getDescription();
public String getName(){
return name;
}
private String name;
}
//*********Found********
class Student ___extends__ Person{
public Student(String n, String m){
super(n);
major = m;
}
//*********Found********
public String __getDescription___(){
return "学生专业是:" + major;
}
private String major;
}

注意:

  1 abstract函数:函数只有声明没有函数体(没有实现)--》在子类中实现

  2父类的所有抽象函数都需要实现

编写一个抽象的图形类Shape,里面有方法area()计算面积以及方法displayArea()显示面积,编写子类矩形类和三角型类分别实现两个方法。

  抽象shape类

public abstract class Shape {
abstract double area();
abstract void displayArea();
}

注意: abstract函数:函数只有声明没有函数体(没有实现)--》在子类中实现

  子类矩形类

public class MyRectangle extends Shape {
private double length;
private double width;
public MyRectangle(double length, double width) {
super();
this.length = length;
this.width = width;
}
@Override
double area() {
return length*width;
}
/*
* 覆盖了父类Shape的displayArea函数
*/
@Override
void displayArea() {
System.out.println("Rectangle's area:"+area());
}
}

注意:父类的所有抽象函数都需要实现

  子类三角型类

public class MyTriangle extends Shape {
private double length;
private double height;
public MyTriangle(double length, double height) {
super();
this.length = length;
this.height = height;
}
@Override
double area() {
return 0.5*length*height;
}
/*
* 覆盖了父类Shape的displayArea函数
*/
@Override
void displayArea() {
System.out.println("Triangle's area:"+area());
}
}

  测试数据

public class test {
public static void main(String[] args) {
Shape a=new MyRectangle(10, 20.5);
Shape b=new MyTriangle(10, 20.5);
a.displayArea();
b.displayArea();
}
}

5编写一个完整的Java  Application 程序。包含接口Shape,MyRectangle类,MyTriangle类及Test类,具体要求如下:

⑴、接口ShapeArea

double  area():求一个形状的面积

  double   perimeter ():求一个形状的周长

interface ShapeArea {
double area();
double perimeter();
}

⑵、类 MyRectangle

实现Shape接口,并有以下属性和方法:

  ①    属性

  width:  double类型,表示矩形的长

  height:  double类型,表示矩形的高

  ②    方法

  MyRectangle(double  w, double  h):构造函数

  toString()方法 :输出矩形的描述信息,如“width=1.0,height=2.0, perimeter=6.0, area=2.0”

class MyRectangle implements ShapeArea {
private double width;
private double height; public MyRectangle(double width, double height) {
super();
this.width = width;
this.height = height;
}
@Override
public double area() {
return width*height;
}
@Override
public double perimeter() {
return 2*(width+height);
}
@Override
public String toString() {
return "MyRectangle [width=" + width + ", height=" + height + ", area=" + area() + ", perimeter="
+ perimeter() + "]";
}
}

⑶、类MyTriangle

实现Shape接口,并有以下属性和方法:

  ①    属性

  x,y,z: double型,表示三角形的三条边

  s: 周长的1/2(注:求三角形面积公式为, s=(x+y+z)/2 ,开方可用Math.sqrt(double)方法)

  ②    方法

  MyTriangle(double  x,  double  y,  double  z):构造函数,给三条边和s赋初值。

  toString():输出矩形的描述信息,如“three sides:3.0,4.0,5.0,perimeter=12.0,area=6.0”

class MyTriangle implements ShapeArea {

    private double x;
private double y;
private double z; public MyTriangle(double x, double y, double z) {
super();
this.x = x;
this.y = y;
this.z = z;
} @Override
public double area() {
double s=perimeter();
return Math.sqrt(s*(s-x)*(s-y)*(s-z));
} /*
* 覆盖了父类application的perimeter函数
*/
@Override
public double perimeter() {
return 0.5*(x+y+z);
} @Override
public String toString() {
return "MyTriangle [x=" + x + ", y=" + y + ", z=" + z + ", area=" + area() + ", perimeter=" + perimeter()
+ "]";
}
}

⑷、Test类作为主类要完成测试功能

  ①生成MyRectangle对象

  ② 调用对象的toString方法,输出对象的描述信息

public class test {
public static void main(String[] args) {
ShapeArea sa;
sa=new MyRectangle(10, 20.5);
System.out.println(sa.toString());
sa=new MyTriangle(3,4,5);
System.out.println(sa.toString());
}
}

结果

6、定义一个接口CanFly,描述会飞的方法public void fly();

interface CanFly {
public void fly();
}

分别定义类飞机和鸟,实现CanFly接口。

//飞机类
public class airplane implements CanFly {
@Override
public void fly() {
System.out.println("我是飞机我会飞");
}
}
//鸟类
public class bird implements CanFly {
@Override
public void fly() {
System.out.println("我是鸟我会飞");
}
}

定义一个测试类,测试飞机和鸟,在main方法中创建飞机对象和鸟对象,再定义一个makeFly()方法,其中让会飞的事物飞。并在main方法中调用该方法,让飞机和鸟起飞。

public class test {
public static void main(String[] args) {
CanFly c1=new airplane();
CanFly c2=new bird();
makeFly(c1);
makeFly(c2);
}
private static void makeFly(CanFly c) {
c.fly();
}
}

结果

java 实验3 继承+多态的更多相关文章

  1. Java 实验案例(多态)

    实验任务 任务一:图形面积周长计算小程序 任务二:饲养员喂养动物程序 实验内容: 任务一: 图形面积周长计算 任务目的: 掌握多态的含义及应用场合 掌握上转型对象和多态的实现 掌握abstract关键 ...

  2. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  3. Java继承多态中的方法访问权限控制

    java中的方法天生具有继承多态特性,这点与C++有很大不同(需要在父类方发上加virtual关键字),但用起来确实方便了许多. 最简单的继承多态 声明一个接口BaseIF,只包含一个方法声明 pub ...

  4. Java中类的继承,属性和方法的四种修饰符的作用范围,final关键字,java的三大特点中的2个:封装和多态,以及多态的一个设计模式,模板方法模式(template method)

    (一)Java中的继承: 关于继承,在Java中类的继承只能是单继承,不像C+++那样灵活,可以多继承,多继承的后果就是各种关系乱套,就相当于一个孩子有2个母亲一样,社会关系的复杂,不利于程序后期的开 ...

  5. java类的继承,多态,抽象类与接口

    知识点梳理:     1,怎样定义自己的类. MyStarFrame,MyStarPanel 类中定义: (1)属性(数据),变量. (2)方法(函数),行为. (3)构造方法(特征,作用,何时被调用 ...

  6. 【JAVA零基础入门系列】Day13 Java类的继承与多态

    继承是类的一个很重要的特性,什么?你连继承都不知道?你是想气死爸爸好继承爸爸的遗产吗?(滑稽) 开个玩笑,这里的继承跟我们现实生活的中继承还是有很大区别的,一个类可以继承另一个类,继承的内容包括属性跟 ...

  7. Java三大特性(封装,继承,多态)

    Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...

  8. java四大特性理解(封装继承多态抽象)

    封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...

  9. Java开发知识之Java的继承多态跟接口*

    Java开发知识之Java的继承多态跟接口 一丶继承 1.继承的写法 在Java中继承的 关键字是 extends 代表一个类继承另一个类. 继承的含义以及作用: 继承就是基于某个父类的扩展.制定出来 ...

随机推荐

  1. linux下jdk/maven/tomcat

    debian安装的openjdk只包括jre,没有tools.jar,dt.jar,所以要安装openjdk完全版. sudo apt--jdk 若操作系统中安装多个版本的java,可以采用如下命令来 ...

  2. 解决SharePoint下载文件时自动修改扩展名的问题

    今天,有人告诉了我一个有趣的问题.当用户将一个扩展名为.ai的文件(Adobe illustrator格式的文件)上载到SharePoint 2013文档库中之后,点击它下载时,下载提示栏所显示的文件 ...

  3. Spark 性能相关参数配置详解-压缩与序列化篇

    随着Spark的逐渐成熟完善, 越来越多的可配置参数被添加到Spark中来, 本文试图通过阐述这其中部分参数的工作原理和配置思路, 和大家一起探讨一下如何根据实际场合对Spark进行配置优化. 由于篇 ...

  4. Spark分布式计算执行模型

    引言 相对Hadoop, Spark在处理需要迭代运算的机器学习训练等任务上有着很大性能提升,同时提供了批处理.实时数据处理.机器学习以及图算法等一站式的服务,因此最近大家一起来学习Spark,特别是 ...

  5. nginx源码完全注释(1)ngx_alloc.h / ngx_alloc.c

    首先看 ngx_alloc.h 文件,主要声明或宏定义了 ngx_alloc,ngx_calloc,ngx_memalign,ngx_free. /* * Copyright (C) Igor Sys ...

  6. java-tip-关于StringBuilder的使用

    当我们需要拼接字符串时,通常会使用StringBuilder,这里简单分析下StringBuilder的内部结构. StringBuilder内部是一个char数组,当调用append方法连接字符串时 ...

  7. 如何清除保存的FTP用户名和密码

      很多人习惯登陆FTP时选择保存密码,这样下次只需打开地址就可以进入FTP的页面了.这样确实方便,但如果遇到更换别的FTP用户名登陆,该怎么办?相信不少人还真答不出.重装浏览器,或者重装系统?呵呵, ...

  8. Qt Signal and Slot

    Qt4中的信号槽 Qt4中的信号槽是通过SIGNAL,SLOT两个宏,将参数转换成字符串.Qt编译前,会从源码的头文件中提取由signal和slot声明的信号和槽的函数, 将其组成一张信号和槽对应的字 ...

  9. Thread.sleep原理

    我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题: 假设现在是 2008-4-7 12:00:00.000,如果我调用 ...

  10. jquery中html()、text()、val()的区别

     (2013-03-26 10:49:16) 转载▼ 分类: jquery   .html()用为读取和修改元素的HTML标签 .text()用来读取或修改元素的纯文本内容 .val()用来读取或修改 ...