Java第三次作业——面向对象基础(封装)
(一)学习总结
1.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明。
面向对象的封装性是指,在对该类进行编写的时候,需要对属性和一些类内的方法进行封装,封装的方法有private
和public
,private
为私有属性,只允许类内访问,保证了数据类型的安全性,而public
主要用在方法的调用上,便于程序的调用。
在使用封装性的时候可以排除一些错误。但由于是private
属性,故在类里面需要有set
和get
方法以便于在test
类里调用。
.
class Person{
String name;
int age;
public void totell(){
System.out.println( "姓名:"+name+"年龄:"+age);
}
}
public class Test1 {
public static void main(String arg[]){
Person p=new Person();
p.name="abc";
p.age=-20;
p.totell();
}
}
可以发现输出有错误。
而当使用private
的时候可以在编译的过程中直接报错。
当加上set和get的方法后可以输出。
2.阅读下面程序,分析是否能编译通过?如果不能,说明原因。
2.1
class A{
private int secret = 5;
}
public class Test{
public static void main(String args[]){
A a = new A();
System.out.println(a.secret++);
}
}
以上程序出现的问题是没有对数据secret
进行set
和get
方法,其主要的是在于调用secret
的时候用了++符号。其目的是实现数据的secret
的增长,故用for
来控制。
class A{
private int secret = 5;
public int getSecret() {
return secret;
}
public void setSecret(int secret) {
this.secret = secret;
}
public String toString() {
return "A [secret=" + secret + "]";
}
}
public class Test1{
public static void main(String args[]){
A a = new A();
a.getSecret();
for(int i=0;i<10;i++){
a.setSecret(a.getSecret()+1);
System.out.println(a.toString());
}
}
}
2.2
更改后的程序如下:
public class Test1{
static int x = 50;
static int y = 200;
public static void method(){
System.out.println(x+y);
}
public static void main(String args[]){
Test1.method();
}
}
出现的问题是在于x
和y
变量没有进行静态设置,应该使用static
定义。其正确的输入如下:
3 . 使用类的静态变量和构造方法,可以跟踪某个类创建的对象个数。声明一个图书类,数据成员为编号,书名,书价,并拥有静态数据成员册数记录图书的总数。图书编号从1000开始,每产生一个对象,则编号自动递增(利用静态变量和构造方法实现)。下面给出了测试类代码和Book类的部分代码,将代码补充完整。
正确的代码:
class Book{
private int bookId;
private String bookName;
private double price;
static int booknum; // 声明静态变量
static{
booknum=1000; //定义静态代码块对静态变量初始化
}
public Book(){ //空的构造方法
}
public Book(String bookName,double price){
this.bookName=bookName;
this.price=price;
setBookId(booknum);
booknum++;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public static int totalBook(){ //定义方法求总数
int num=0;
num=booknum-1000;
return num;
}
public String toString() { //定义toString方法返回
return "编号:" + bookId + ", 书名:" + bookName + ", 价格为:" + price;
}
public int getBookId() {
return bookId;
}
public void setBookId(int bookId) {
this.bookId = bookId;
}
}
public class Test1{
public static void main(String args[]){
Book[] books = {new Book("c语言程序设计",29.3),
new Book("数据库原理",30),
new Book("Java学习笔记",68)};
System.out.println("图书总数为:"+ Book.totalBook());
for(Book book:books){
System.out.println(book.toString());
}
}
}
输出的结果:
4.什么是单例设计模式?它具有什么特点?用单例设计模式设计一个太阳类Sun。
单例设计模式是指在设置多个类的对象的时候,并且实现实例化,在调用的时候始终使用的是一个对象。
例如:
class Sun{
private static Sun instance=new Sun();
private Sun(){
}
public void tell(){
System.out.println("hello world!");
}
public static Sun getInstance(){
return instance;
}
}
public class Test1{
public static void main(String []args){
Sun s1=Sun.getInstance();
Sun s2=Sun.getInstance();
s1.tell();
s2.tell();
}
}
5.理解Java参数传递机制,阅读下面的程序,运行结果是什么?说明理由。
public class Test1 {
String str = new String("你好 ");
char[] ch = { 'w','o','l','l','d' };
public static void main(String args[]) {
Test1 test = new Test1();
test.change(test.str, test.ch);
System.out.print(test.str);
System.out.print(test.ch);
}
public void change(String str, char ch[]) {
str = "hello";
ch[0] = 'W';
}
}
字符串的内容不可以更改。该程序str的地址没有变所以仍然输出的是:你好 world。
6.其他需要总结的内容。
在编写类的时候需要添加空的构造方法,构造方法的格式需要注意是空的。
数据的定义的时候一定要注意到其属性,需要用private进行封装,而方法适当性的不用。
设置set和get方法的时候需要注意是否需要形参什么时候需要返回值。一般来说,set空的返回值,需要形参,get方法需要返回值,可以不用形参。
需要学会的是BigDecimal类里面的四舍五入的方法。
在主方法Test类里面需要进行对对象的实例化,以及各种类的方法的实例化,例如输入,random的实例化。
(二)实验总结
(1)职工信息
实验内容:
(1)设计一个日期类,用于记录年、月、日,提供对日期处理的常用方法(日期输出格式xxxx-xx-xx)。
(2)设计一个职工类,该职工类至少具有下面的属性:职工号,姓名,性别,生日,工作部门,参加工作时间,设计相应的方法。
(3)设计一个部门类,包括下列属性:部门编号,部门名称,经理,设计相应方法。
(4)设计一个测试类,采用对象数组模拟一个拥有两个部门,10个职工的单位,实现对相关信息的查询功能。
设计思路:按照顺序建立一个日期类,然后再设置属性即可。对月份进行判断如果月份大于12则输出0。
public int getMonth(){
if(month>0&&month<13){
return month;}
else{
return 0;
}
}
然后再建立一个职工类,需要注意的是怎么用日期类来输出职工的出生日期和参加工作的日期。用date
类来定义这些变量,然后输出即可。
private Date date;
private Date jdate;
public Employee(){
}
public Employee(int emno,String emna,String esex,String depar,Date date,Date jdate){
this.emno=emno;
this.emna=emna;
this.esex=esex;
this.depar=depar;
this.date=date;
this.jdate=jdate;
}
输出的格式为:
public String toString() {
return "员工基本信息: 员工编号:" + emno + ", 员工姓名:" + emna + ", 性别:" + esex + ", 出生日期:" + date + ", 部门:" + depar + ", 参加工作时间:"+jdate;
}
设置部门类:因为经理属于员工的一员所以需要在测试类中需要用该类来定义经理
Depart de =new Depart(1001,"技术部");
public String toString(){
return "部门编号:"+getDname()+"\t"+"部门名称:"+getDname()+"\t"+"经理:"+getDmassg();
}
测试类:用职工类来定义一个对象数组并实例化,设置经理并输出该数组。
public class Test {
public static void main(String args[]){
Employee e[]=null;
e=new Employee [3];
e[0]=new Employee(1001,"张三","男","技术部",new Date(1983,2,2),new Date(2000,2,2));
e[1]=new Employee(1001,"李四","男","技术部",new Date(1991,1,1),new Date(2007,2,2));
e[2]=new Employee(1001,"王红","女","技术部",new Date(1988,1,1),new Date(2000,3,2));
Depart de =new Depart(1001,"技术部");
de.setDmassg(e[0]);
System.out.println(de.toString());
for(int i=0;i<e.length;i++){
System.out.println(e[i]);
}
Employee e1[]=null;
e1=new Employee [3];
e1[0]=new Employee(2001,"王飞","女","工程部",new Date(1998,1,2),new Date(2017,1,2));
e1[1]=new Employee(2001,"张晨","男","工程部",new Date(1991,3,2),new Date(2010,3,2));
e1[2]=new Employee(2001,"赵力","男","工程部",new Date(1996,9,2),new Date(2011,9,2));
Depart gc =new Depart(1002,"工程部");
gc.setDmassg(e1[0]);
System.out.println(gc.toString());
for(int i=0;i<e.length;i++){
System.out.println(e1[i]);
}
}
}
问题1:不会使用日期类来输出工作时间与工人的出生日期
解决方案:用date
(日期类)来定义工人参加工作时间和出生日期这两个变量,然后在toString
方法中使用date
类输出即可。
public String toString() {
return "员工基本信息: 员工编号:" + emno + ", 员工姓名:" + emna + ", 性别:" + esex
+ ", 出生日期:" + date + ", 部门:" + depar + ", 参加工作时间:"+jdate;
}
问题2:不会设置员工为该经理
解决方案:使用set
方法来设置,定义对象,然后对象.set
方法即可。
(2)计算工具类
(1)为用户提供几个常见的几何体面积和体积的算法(如球的体积和表面积,圆柱体的体积和表面积,圆锥体的体积和表面积)(可以学习使用static关键字)
(2)设计一个测试类,给出几个不同的圆柱体,圆锥体,球体的尺寸,用计算工具类分别求它们体积的累加和与表面积的累加和。
(3)设计一个测试类,随机产生球,圆柱、圆锥体的尺寸,模拟考试,要求用户回答它们的体积和面积,并判断用户的回答是否正确
计算类:设置属性,然后设置方法类,编写各个的计算方法。由于存在小数问题,选手需要猜的回答的数据,故需要用到BigDecimal
这个类的四舍五入方法。
测试类计算累加和:
Jisuan s[]=new Jisuan[3];
s[0]=new Jisuan(1.0,2.0);
s[1]=new Jisuan(3.0,4.0);
s[2]=new Jisuan(5.0,6.0);
定义对象数组并实例化,然后计算各个不同的体积之和表面积之和。
double a=s[i].qBmj()+s[i].yZhui()+s[i].yZtbmj();
System.out.println("这是所有的表面积之和:"+Jisuan.round(a, 1));
double b=s[i].qTj()+s[i].yZhuitj()+s[i].yZttj();
System.out.println("这是所有的体积之和:"+Jisuan.round(b, 1));
测试类:用户回答数据
用random
类产生随机数,并提示用户回答,猜一次接着继续,用for来控制循环,采用switch() case
语句来让用户选择猜哪一个。
System.out.println("这是产生的随机数:半径为:"+r+",高为:"+h+",请计算球的表面积:");
double s=in.nextDouble();
if(s==rh.qBmj()){
System.out.println("正确");
}
else{
System.out.println("错误");
}
System.out.println("请输入球的体积:");
double qt=in.nextDouble();
if(qt==rh.qTj()){
System.out.println("正确");
}
else{
System.out.println("错误");
}
break;
基本输入输出板块如下:
问题1:在计算表面积,体积之和时不知道怎么计算
解决方案:使用数组对象.方法来调用即可
double a=s[i].qBmj()+s[i].yZhui()+s[i].yZtbmj();
System.out.println("这是所有的表面积之和:"+Jisuan.round(a, 1));
问题2:在用户的测试类里不知道怎么设置高和半径实现test类和Jisuan类的链接。
解决方案:用对象的实例化来实现高和半径的设置Jisuan rh=new Jisuan(r,h);
3.用面向对象编程思想完成评分系统
设计思路:定义一个选手类,包括多个属性值,编写方法包括max
,min
,最后得分。然后在test
类里定义一个普通数组和一个对象数组,普通数组来接受对象数组的值用于排序,for循环来控制多少个选手,采用set
方法来设置选手姓名和编号,然后调用max
和min
方法来计算最后得分,然后给了普通的数组来输出即可。
package pinFen;
import java.util.Scanner;
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
Xuanshou no=new Xuanshou() ;
Xuanshou name=new Xuanshou() ;
Scanner in=new Scanner(System.in);
int score[]=null;
score=new int[3];
float []p=null;
p=new float[3];
for(int i=0;i<3;i++){
System.out.println("请输入第"+(i+1)+"选手的编号:");
String s=in.next();
no.setXnum(s);
System.out.println("请输入第"+(i+1)+"选手的姓名:");
String n=in.next();
name.setXname(n);
System.out.println("请输入第"+(i+1)+"选手的成绩:");
for(int j=0;j<score.length;j++){
score[j]=in.nextInt();
}
p[i]=Xuanshou.zscore(score);
System.out.println("去掉一个最高分:"+ Xuanshou.max(score) +", 去掉一个最低分:"+ Xuanshou.min(score) +
","+ no.getXnum() +"号选手"+name.getXname()+"最终得分:"+Xuanshou.zscore(score));
}
Arrays.sort(p);
for (int x = 0; x<p.length; x++) {
System.out.println("选手号:"+no.getXnum()+"选手姓名:"+name.getXname());
System.out.println(p[x]);
}
System.out.println(p.toString());
}
}
问题1:在采用set方法来实现用户自己输入选手姓名和学号的时候不会使用
解决方案:定义选手类的变量并且实例化:
Xuanshou no=new Xuanshou() ;
Xuanshou name=new Xuanshou() ;
然后在在输入的时候调用即可。
System.out.println("请输入第"+(i+1)+"选手的编号:");
String s=in.next();
no.setXnum(s);
仍然出现的问题:排序后的输出有问题,而且在Jisuan
类里面定义的函数compareTo
就没有用到,其排序的作用来自java.Arrays
类。
(三)代码托管
http://git.oschina.net/cym1996/java-program-by-cym/tree/master/
在文件ex-04里