Java实验四 深入面向对象

实验四  深入面向对象

一、实验目的与要求

1、深刻理解面向对象的三大特征;

2、熟练掌握关键super、final的含义及用法;

3、理解什么是抽象类、抽象方法,以及两者间的关系;

4、深刻理解接口的概念、作用,以及与抽象类的差别;

5、类型的转换(向上和向下转换),运算符 instanceof的使用;

6、深刻理解、掌握动态多态性(难点重点);

7、初步了解对象间进行消息传递的方式(两种一是乙类对象作为甲类的成员,二是对象作为方法的参数,本质是一样的);

8、逐步掌握异常的分类、处理方法。

 

二、实验原理

   1、面向对象的三大特征

面向对象的3大特征是封装、继承、多态。

封装:在定义一个类时都需要认真思考,类是现实世界中事物的属性和对这些属性进行操作的方法的集合体。因此一个类应该包括数据成员和函数成员,仅仅只含一种成员的类很少(除非特别需要),一般一个属性对应一对set、get,但并非set、get方法一定会成对出现。如何去进行类的封装呢?可以从操作反推属性的确定,即要完成哪些操作,这些操作的进行需要什么数据、得到怎样的结果。

继承:子类继承了父类非私有的成员,(实际上子类继承了父类的所有成员,只是私有的成员在子类中被隐藏了,通过方法还是可以访问到的)。可定义成员的访问权限时,不要把问题复杂化,即在实际应用中大多仅使用公共和私有权限。子类重写父类的方法时,不能缩小该方法的访问权限,(如果是缩小的、则子类的该方法就没有意义了,因为访问不到嘛)。

多态性:包含静态多态和动态多态,一般是指动态多态性。静态多态通过函数的重载实现,较为简单。困难的是动态多态,通过父子类、接口来实现。一般是父类的引用或者接口的引用指向子类的对象的形式。出现在赋值、做参数、方法的调用等位置。务必深刻理解。

三、实验内容、过程、结果(带*的本次不做,下次一起)

1、定义父类Person,派生出Teacher、Student。请选取合适的成员变量、方法。(考虑使用super、final、static关键字)

package test04;
public class Test {public static void main(String[] args){Student s = new Student();s.eat();s.sleep();System.out.println("---------");Teacher t = new Teacher();t.eat();t.sleep();t.teach();}
}
class Person{String name;void eat(){System.out.println("吃饭");}void sleep(){System.out.println("睡觉");}
}
class Student extends Person{int sid; //学号
}
class Teacher extends Person{int tid; //工号void teach(){System.out.println("老师教课");}
}

2、定义抽象类Shape(含求面积的抽象方法,常量PI),派生出圆、三角形(或者长方形、正方形、梯形);由圆派生出圆锥体求体积。

package test04;
class Shape {public double pi;public double  GetCircle (double pi) {double s=3.14*3.14*pi;return s;}public static void main(String [] args) {Circle a=new Circle(3);Tangle b=new Tangle(3);System.out.println(a.GetCircle(3));System.out.println(b.GetTangle(3));}public double  GetTangle (double pi) {double s=pi*pi;return s;}public Shape(double pi) {super();this.pi = pi;}
}
class Circle extends Shape
{public Circle(double pi) {super(pi);}
}
class Tangle extends Shape
{public Tangle(double pi) {super(pi);}
}

*3、什么是适配器?定义一个接口包含求面积、体积的抽象方法,由此定义适配器,通过重写实现求圆、三角形的面积、圆锥体的体积。

适配器就是继承接口的类做父类 派生出的子类能够重写父类的方法

package test04;
import java.util.Scanner;
interface Area {abstract double mianji(double x) ;abstract double mianji(double y,double z) ;abstract double  tiji(double r,double h)  ;public static void main (String [] args) {Scanner a=new Scanner (System.in);double x=a.nextDouble();Scanner b=new Scanner (System.in);double y=b.nextDouble();Scanner c=new Scanner (System.in);double z=c.nextDouble();Scanner d=new Scanner (System.in);double r=d.nextDouble();Scanner e=new Scanner (System.in);double h=e.nextDouble();area1 area2= new area1();System.out.println(area2.mianji(x));System.out.println(area2.mianji(y,z));System.out.println(area2.mianji(r,h));}
}
class area1 implements Area{public double mianji( double x) {double s1=3.14*x*x;return s1;}public double mianji( double y,double z) {double s2=0.5*z*y;return s2;}public double tiji(double r,double h) {double s3=1/3*3.14*r*r*h;return s3;}
}

4、根据Person类的属性、方法、Teacher派生类的属性方法,实现多态性(重点考查哪些能被访问、那些不能访问,及其规则);

package test04;
class Person {public String name;public String work;public int leg;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getWork() {return work;}public void setWork(String work) {this.work = work;}public Person(String name, String work) {this.name = name;this.work = work;}
}
class Teacher extends Person {public Teacher(String name, String work, String edu) {super(name, work);}public String edu;public void setWork(String teacher) {this.work = teacher;}public String getEdu() {return edu;}public void setEdu(String edu) {this.edu = edu;}
}
class Student extends Teacher {public Student(String name, String work,String edu) {super(name, work, edu);}public static void main(String[] args) {Person p = new Teacher("candice", "teacher", "graduate");System.out.println(p.getWork());System.out.println(p.getName());}
}

*5、使用Shape类、接口的数组,求圆、三角形的面积,实现多态性;

package test04;
public class text{public static void main( String [] args){try {class Shape {public double pi;public double  GetCircle (double pi) {double s=3.14*3.14*pi;return s;}public double  GetTangle (double pi) {double s=pi*pi;return s;}public Shape(double pi) {super();this.pi = pi;}}class Circle extends Shape{public Circle(double pi) {super(pi);}}class Tangle extends Shape{public Tangle(double pi) {super(pi);}public void main(String [] args ) {Circle a=new Circle(3);Tangle b=new Tangle(3);System.out.println(a.GetCircle(3));System.out.println(b.GetTangle(3));}}}catch(Exception e){e.printStackTrace();//打印错误//System.out.println("系统出错");}finally {System.out.println("最后");}}
}

*6、通过一个数组的值和下标、使用几种方式验证异常处理。

package test04;
public class testFinally {public static void main(String args[ ]) {  int a,b=0;for(int i=0;i<=3;i++){System.out.println("Test No: "+(i+1));try{  switch(i){case 0:   a=3/b;	break;case 1:   int  c[ ]=new int[10];c[10]=0;break;case 2:   char ch="ABC".charAt(99);break;case 3:   return;}}catch(ArithmeticException  e) {System.out.println("零作除数!");}catch(ArrayIndexOutOfBoundsException  e) {System.out.println("数组下标越界!");}catch(IndexOutOfBoundsException  e) {System.out.println("下标越界!");}finally{ System.out.println("在finally块中!");  }}}
}

7、实际应用(继承、重载)。

定义Employee(员工)类,由员工类派生出SaleMan(销售员)类和Manager(经理)类。要求:

(1)在员工类中包含有编号(num)、姓名(name)、工资(basicSalary)和奖金(prize)。在销售员类中还包含销售提成比例(deductRate)和个人销售额(personAmout),在经理类中还包含经理提成比例(totalDeductRate)和总销售额(totalAmount)。

(2)各类人员的实发工资公式如下:

员工实发工资=基本工资+奖金

销售员      =基本工资+奖金+个人销售额*销售提成比例

经理        =基本工资+奖金+总销售额*经理提成比例

    (3)每个类都有构造函数、输出基本信息的show方法、输出工资的showSalary的方法。

package test04;
public class Employee {public int num;public String name;public int salary;public int prize;public int showSalary(int salary,int prize) {int s;s=salary+prize;return s;}public static void main (String []args) {SaleMan n= new SaleMan(1,"Candice",5000,500,0.5,800);Manager m= new Manager(2,"Lucy",9000,1000,0.5,800);System.out.println("编号"+n.getNum() );System.out.println("姓名"+n.getName() );System.out.println("基本工资"+n.getPrize());System.out.println("个人销售额"+n.getPersonamout());System.out.println("销售提成比例"+n.getRate() );System.out.println("实际工资"+n.showSalary(5000, 500, 0.5, 800) );System.out.println("编号"+m.getNum() );System.out.println("姓名"+m.getName() );System.out.println("基本工资"+m.getPrize());System.out.println("个人销售额"+m.getTotalamount());System.out.println("销售提成比例"+m.getTotalrate());System.out.println("实际工资"+m.showSalary(9000, 1000, 0.5, 800) );}public int getNum() {return num;}public void setNum(int num) {this.num = num;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}public int getPrize() {return prize;}public void setPrize(int prize) {this.prize = prize;}public Employee(int num, String name, int salary, int prize) {super();this.num = num;this.name = name;this.salary = salary;this.prize = prize;}
}
class SaleMan extends Employee{public SaleMan(int num, String name, int salary, int prize) {super(num,name,salary,prize);}public double rate;public int personamout;public double getRate() {return rate;}public void setRate(double rate) {this.rate = rate;}public int getPersonamout() {return personamout;}public void setPersonamout(int personamout) {this.personamout = personamout;}public SaleMan(int num, String name, int salary, int prize, double rate, int personamout) {super(num, name, salary, prize);this.rate = rate;this.personamout = personamout;}public double showSalary(int salary ,int prize ,double rate,int personamout) {double a;a= salary+ prize + rate*personamout;return a;}
}
class Manager extends Employee{public Manager(int num,String name,int salary, int prize) {super(num,name,salary,prize);}public double totalrate;public int totalamount;public double showSalary(int salary ,int prize ,double totalrate, int totalamount ) {double b;b=salary + prize + totalrate + totalamount;return b;}public double getTotalrate() {return totalrate;}public void setTotalrate(double totalrate) {this.totalrate = totalrate;}public int getTotalamount() {return totalamount;}public void setTotalamount(int totalamount) {this.totalamount = totalamount;}public Manager(int num, String name, int salary, int prize, double totalrate, int totalamount) {super(num, name, salary, prize);this.totalrate = totalrate;this.totalamount = totalamount;}
}

四、实验总结与体会

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1383234.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

java面向对象编程实例讲解_Java面向对象编程实例详解

Java是一种面向对象的语言&#xff0c;是实现面向对象编程的强大工具。但如何在编程中实际运用并发挥其最大效能呢&#xff1f;本文通过一个实际Java程序的开发过程&#xff0c;详细说明了如何使用面向对象实现Java编程。 我们要实现的Java应用程序是&#xff1a;当用户输入一个…

高端百度地图开发2:自定义水滴头像(鼠标事件、API封装对接)

高端百度地图开发系列 高端百度地图开发1&#xff1a;自定义水滴头像&#xff08;自定义标注覆盖物、Overlay覆盖类&#xff09; 自定义水滴头像之鼠标事件、API封装对接 高端百度地图开发系列一、添加自定义覆盖物的方法二、对接API数据1.获取API数据(模拟)2.遍历数据3.添加自…

2023年中国智慧公安行业发展现况及发展趋势分析:数据化建设的覆盖范围不断扩大[图]

智慧公安基于互联网、物联网、云计算、智能引擎、视频技术、数据挖掘、知识管理为技术支撑&#xff0c;公安信息化为核心&#xff0c;通过互联互通、物联化、智能方式促进公安系统各功能模块的高度集成、协同作战实现警务信息化“强度整合、高度共享、深度应用”警察发展的新概…

写一个简单炫酷的app程序的打开动画

app也是有颜值&#xff0c;动画就是一种化妆术&#xff0c;他让你的app更加炫酷&#xff0c;首先给你看下图 首先呢&#xff0c;先普及下总体的框架知识&#xff0c;有三种动画 (1)Drawable Animation&#xff1a;逐帧动画&#xff0c;就像电影一样&#xff0c;一帧一帧&am…

安卓开机动画的制作

开机动画的存储位置&#xff1a; system/media/bootanimation.zip。 bootanimation.zip的文件结构&#xff1a;包含一个desc.txt和N个文件夹&#xff08;一般两个&#xff09;。desc.txt是用来指导如何执行动画页面。文件夹里存放要播放的照片&#xff08;支持png和jpg格式&am…

安卓基础动画

在开发的过程中&#xff0c;动画可以实现很好的效果&#xff0c;比如对于图片的旋转&#xff0c;电子罗盘的都可以利用动画来时实现。但是对于动画不太熟悉&#xff0c;经常想用却不会用&#xff0c;特地写这篇博客&#xff0c;记录一下对于动画的学习。 主要学习帧动画和Objec…

安卓动画:

Android的三种动画&#xff0c;即&#xff1a; •View Animation&#xff08;视图动画&#xff09; •Drawable Animation&#xff08;帧动画&#xff09; •Property Animation&#xff08;属性动画&#xff09; Drawable Animation&#xff08;帧动画&#xff09;&#xff1…

安卓手机开机动画制作原理教程

先说开机动画实现原理&#xff1a; Android的动画是由一系列的连续PNG图片作为帧组成的动画形式。 不是合成为一张GIF图片&#xff0c;而是一个文件包&#xff0c;将各帧PNG图片以压缩方式保存。 这个保存的文件名就是bootanimation.zip&#xff0c;这个文件是zip压缩文件&a…

安卓之动画制作

1.知识图谱 &#xff08;补间动画和帧动画&#xff09; 1.补间动画的效果图&#xff1a; &#xff08;alpha透明度&#xff09; &#xff08;ratate旋转&#xff09; XML代码&#xf…

Android BT

整个bluedroid可以分为两大模块&#xff1a;BTIF&#xff0c;BTE BTIF&#xff1a;提供bluedroid对外的接口;作为bluedroid与上层的framework提供interface。所以它处于bluedroid的顶层。 BTE&#xff1a;bluedroid的内部处理&#xff0c;又细分为BTA&#xff0c;BTU&#xf…

04.BT下载

04.BT下载 下载&#xff0c;是很多网络用户必备的需求之一。以往我们使用现成工具迅雷&#xff0c;我们必须保持开机&#xff0c;会员&#xff0c;合法等等要求&#xff0c;但是依托服务器&#xff0c;我们其实也可以搭建BT下载工具&#xff0c;只要你的硬盘够用&#xff0c;把…

BackTrack5(BT5)各版本下载

BT5R3(最新版本)http://www.nigesb.com/backtrack-5-r3-released.html BT5R2 KDE版32位&#xff1a; http://ftp.halifax.rwth-aachen.de/backtrack/BT5R2-KDE-32.iso GNOME32位&#xff1a;http://ftp.halifax.rwth-aachen.de/backtrack/BT5R2-GNOME-32.iso BT5R1 KDE版32位…

mysql 存储用户头像_node+vue用户头像处理上传并保存

2017年7月14日19:21:29 &#xff0c;最近做个网站&#xff0c;需要有用户头像裁剪上传功能&#xff0c;具体流程是用户在本地选择图片&#xff0c;前端将图片裁剪好发给后端&#xff0c;后端接收到图片将它保存起来&#xff0c;并将信息存入数据库。 先说一下环境后端是express…

java 根据用户名生成头像。

先上效果图 自行根据需求修改代码 package com.space; import java.awt.*; import java.awt.geom.RoundRectangle2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Random; import java.util.regex.Matcher; im…

支付宝小程序serverless---获取用户信息(头像)并保存到云数据库

支付宝小程序serverless—获取用户信息&#xff08;头像&#xff09;并保存到云数据库 博客说明 文章所涉及的资料来自互联网整理和个人总结&#xff0c;意在于个人学习和经验汇总&#xff0c;如有什么地方侵权&#xff0c;请联系本人删除&#xff0c;谢谢&#xff01; 我又回…

湘大 XTU OJ 1260 Completed String 题解(非常详细):建立数组下标和数组元素之间的映射关系 ~scanf

一、链接 1260 Completed String 二、题目 题目描述 给一个字符串&#xff0c;请判断字符串是否出现了所有的英文字母&#xff08;不区分大小写&#xff09;。 输入 每行一个只含英文字母的字符串&#xff0c;长度不超过1000。 输出 每行输出一个样例的结果&#xff0c…

openCV配置+cmake操作记录--Ubuntu 16.04版本

项目需要openCV相关操作,于是找了好多教程,琢磨了好久,写个笔记。 更新ubuntu上的一些库: sudo apt-get update sudo apt-get upgrade 安装一些库:(虽然我现在也不明白这玩意,我是纯小白/(ㄒoㄒ)/~~) sudo apt-get install cmake sudo apt-get install build-essen…

笔记2:openCV打开摄像头显示到QT的QLabel--Ubuntu系统

目的: 通过openCV调用摄像头,把捕捉到的画面显示到QT的QLabel控件上。 听起来很easy的样子,我的coding能力很弱,可以找个我是理学院出身的借口,但现实是谁会听你的借口呢,希望这笔记不是给我未来参考的,而是为了博未来的自己一笑,那样才能说明我是进步的哈。 效果:…

【二叉树】1-5,理论基础、前中后序遍历的递归法和迭代法、层序遍历

理论基础、前中后序遍历的递归法和迭代法、层序遍历 1&#xff0c;二叉树的种类满二叉树完全二叉树二叉搜索树平衡二叉搜索树 2&#xff0c;存储方式链式存储线式存储 3&#xff0c;二叉树的遍历深度优先搜索前序遍历&#xff08;递归法、迭代法&#xff09;中序遍历&#xff0…

fork创建多个子进程

fork创建多个子进程 示例代码 fork1.c #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h>int main(int argc,char **argv) {int i, j;pid_t pid;for (i 0; i < 3; i){pid fork();if (pid < 0){perror(&q…