杨玲 201771010133《面向对象程序设计(java)》第六周学习总结

杨玲 201771010133《面向对象程序设计(java)》第六周学习总结

第一部分:理论知识学习部分

1.继承

用已有类来构建新类的一种机制。新类可以继承父类的方法和域,同时可以在新类中添加新的方法和域。

已有类称为:超类、基类或父类。新类称作:子类、派生类或孩子类。

子类的构造器不能直接访问超类的私有域,必须通过调用超类构造器,而且必须是第一条语句。子类不能直接访问超类的私有域,必须和其它方法一样,使用公有接口。

在子类中可以增加域、增加方法或覆盖超类的方法,但绝对不能删除超类的任何域和方法。

super关键字一般有两个用途:一是调用超类的方法(格式:super.方法名()),二是调用超类的构造器(格式:super())。

若子类构造器没有显式地调用超类的构造器,则将自动地调用超类默认构造器。如果超类只定义了带参数的构造器,若子类构造器没有显式地调用超类的构造器,则Java编译器将报告错误。

Java不支持多继承。

2.多态性

多态性泛指在程序中同一个符号在不同的情况下具有不同解释的现象。

超类中定义的域或方法,被子类继承之后,可以具有不同的数据类型或表现出不同的行为。

这使得同一个域或方法在超类及其各个子类中具有不同的语义。超类中的方法在子类中可方法重写。

Java中,对象变量是多态的。

不能把对超类的对象引用赋给子类对象变量。

继承层次结构中,每个子类对象也可视作是超类对象,因此,可以将子类对象赋给超类变量。

3.抽象类

从某种角度看,祖先类更加通用,人们只将它作为派生其他类的基类,而不作为特定的实例类。

用abstract方法定义抽象类时,abstract方法只能声明,不能实现!

包含一个或多个抽象方法的类本身必须被声明为抽象类。除了抽象方法之外,抽象类还可以包含具体数据和具体方法。

抽象方法充当着占位的角色,它们的具体实现在子类中。扩展抽象类可以有两种选择:一种是在子类中实现部分抽象方法,这样就必须将子类也标记为抽象类;另一种是实现全部抽象方法,这样子类就可以不是抽象类。此外,类即使不含抽象方法,也可以将类声明为抽象类。

抽象类不能被实例化,即不能创建对象,只能产生子类。可以创建抽象类的对象变量,只是这个变量必须指向它的非抽象子类的对象。

4.受保护访问

如果希望超类的某些方法或域允许被子类访问,就需要在超类定义时,将这些方法或域声明为protected。

实际中要谨慎使用protected的属性。假设需要将设计的类提供给其他程序员使用,而在这个类中设置了一些受保护域,由于其他程序员可以由这个类再派生出新类,并访问其中的受保护域。在这种情况下,如果对这个类进行修改,就必须通知所有使用这个类的程序员。这违背了OOP提倡的数据封装原则。

如果定义类时要限制某个方法的使用,就可以将它声明为protected。这表明子类得到信任,可以使用这个方法,而其他类则不行。

Java用于控制可见性的4个访问权限修饰符:private(只有该类可以访问),protected(该类及其子类的成员可以访问,同一个包中的类也可访问),public(该类或非该类均可访问),默认(相同包中的类课以访问)。注:不写访问修饰符时默认为friendly。

使用访问修饰符的原因:实现受限信息隐藏。

信息隐藏目的:
– 对类中任何实现细节的更改不会影响使用该类的代码。
– 防止用户意外删除数据。
– 易于使用类。

5.Objective类

Object类是Java中所有类的祖先——每一个类都由它扩展而来。在不给出超类的情况下,Java会自动把Object作为要定义类的超类。

可以使用类型为Object的变量指向任意类型的对象。但要对它们进行专门的操作都要进行类型转换。

第二部分:实验部分

1.实验名称:实验六 继承定义与使用

2.  实验目的:

(1) 理解继承的定义;

(2) 掌握子类的定义要求

(3) 掌握多态性的概念及用法;

(4) 掌握抽象类的定义及用途;

(5) 掌握类中4个成员访问权限修饰符的用途;

(6) 掌握抽象类的定义方法及用途;

(7)掌握Object类的用途及常用API;

(8) 掌握ArrayList类的定义方法及用法;

(9) 掌握枚举类定义方法及用途。

3. 实验步骤与内容:

实验1: 导入第5章示例程序,测试并进行代码注释。

测试程序1:

Ÿ 在elipse IDE中编辑、调试、运行程序5-1 (教材152页-153) ;

Ÿ 掌握子类的定义及用法;

Ÿ 结合程序运行结果,理解并总结OO风格程序构造特点,理解Employee和Manager类的关系子类的用途,并在代码中添加注释。

package inheritance;
 
  /**
   * This program demonstrates inheritance.
   * @version 1.21 2004-02-21
   * @author Cay Horstmann
   */
  public class ManagerTest
  {
    public static void main(String[] args)
    {
       //构造Manager类的一个对象boss
       Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
       boss.setBonus(5000);//boss调用Manager类中的方法
       Employee[] staff = new Employee[3];//构造一个Employee类的数组
       //为数组staff的成员赋值
       staff[0] = boss;//子类的对象可以赋值给超类的变量
       staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
       staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15);
 
       // 循环打印所有员工对象的信息
       for (Employee e : staff)
          System.out.println("name=" + e.getName() + ",salary=" + e.getSalary());
    }
 }
运行结果如下:

测试程序2:

Ÿ 编辑、编译、调试运行教材PersonTest程序(教材163页-165页);

Ÿ 掌握超类的定义及其使用要求;

Ÿ 掌握利用超类扩展子类的要求;

Ÿ 在程序中相关代码处添加新知识的注释。

package abstractClasses;

import java.time.*;

public class Employee extends Person {    private double salary;    private LocalDate hireDay;

   public Employee(String name, double salary, int year, int month, int day)    {       super(name);       this.salary = salary;       hireDay = LocalDate.of(year, month, day);    }

   public double getSalary()    {       return salary;    }

   public LocalDate getHireDay()    {       return hireDay;    }

   public String getDescription()//重写    {       return String.format("an employee with a salary of $%.2f", salary);    }

   public void raiseSalary(double byPercent)    {       double raise = salary * byPercent / 100;       salary += raise;    } }

package abstractClasses;

public abstract class Person {    public abstract String getDescription();    private String name;

   public Person(String name)//构造器--为子类的构造器提供方法    {       this.name = name;    }

   public String getName()//访问器    {       return name;    } }

package abstractClasses;

/**  * This program demonstrates abstract classes.  * @version 1.01 2004-02-21  * @author Cay Horstmann  */ public class PersonTest {    public static void main(String[] args)    {       Person[] people = new Person[2];

      // fill the people array with Student and Employee objects       people[0] = new Employee("Harry Hacker", 50000, 1989, 10, 1);//引入雇员类对象       people[1] = new Student("Maria Morris", "computer science");//引入student类对象

      // print out names and descriptions of all Person objects       for (Person p : people)          System.out.println(p.getName() + ", " + p.getDescription());    } }

 

package abstractClasses;

public class Student extends Person {    private String major;

   /**     * @param nama the student's name     * @param major the student's major     */    public Student(String name, String major)    {       // pass n to superclass constructor       super(name);       this.major = major;    }

   public String getDescription()//实现    {       return "a student majoring in " + major;    }

   }

程序运行结果如下:

测试程序3:

Ÿ 编辑、编译、调试运行教材程序5-8、5-9、5-10,结合程序运行结果理解程序(教材174页-177页);

Ÿ 掌握Object类的定义及用法;

Ÿ 在程序中相关代码处添加新知识的注释。

package equals;

import java.time.*;
import java.util.Objects;

public class Employee
{
   private String name;
   private double salary;
   private LocalDate hireDay;

   public Employee(String name, double salary, int year, int month, int day)
   {
      this.name = name;//this指代当前对象
      this.salary = salary;
      hireDay = LocalDate.of(year, month, day);
   }

   public String getName()
   {
      return name;
   }

   public double getSalary()
   {
      return salary;
   }

   public LocalDate getHireDay()
   {
      return hireDay;
   }

   public void raiseSalary(double byPercent)
   {
      double raise = salary * byPercent / 100;
      salary += raise;
   }

   public boolean equals(Object otherObject)
   //Objects类中的equals方法用于检测一个对象是否等于另外一个对象
   {
      // a quick test to see if the objects are identical
      if (this == otherObject) return true;

      // must return false if the explicit parameter is null 如果显示参数为空,则返回false
      if (otherObject == null) return false;

      // if the classes don't match, they can't be equal
      if (getClass() != otherObject.getClass()) return false;
//getClass方法将返回一个对象所属的类
      // now we know otherObject is a non-null Employee
      Employee other = (Employee) otherObject;

      // test whether the fields have identical values 测试字段是否有相同的值
      return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);
   }

   public int hashCode()
   {
      return Objects.hash(name, salary, hireDay); 
      //Objects.hash()  这个类用于操作对象的静态实用方法这些工具包括用于计算对象的哈希代码的空安全或空容错方法,返回一个对象的字符串,并比较两个对象
      //Object类中的hashCode方法导出某个对象的散列码。散列码世人以整数,表示对象的存储地址
      //两个相等对象的散列码相等
   }

   public String toString()
   //toString() 方法返回一个代表该对象域值的字符串
   {
      return getClass().getName() + "[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay
            + "]";
   }
}

package equals;

/**  * This program demonstrates the equals method.  * @version 1.12 2012-01-26  * @author Cay Horstmann  */ public class EqualsTest {    public static void main(String[] args)    {       Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);       Employee alice2 = alice1;       Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);       Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);

      System.out.println("alice1 == alice2: " + (alice1 == alice2));

      System.out.println("alice1 == alice3: " + (alice1 == alice3));

      System.out.println("alice1.equals(alice3): " + alice1.equals(alice3));

      System.out.println("alice1.equals(bob): " + alice1.equals(bob));

      System.out.println("bob.toString(): " + bob);

      Manager carl = new Manager("Carl Cracker", 80000, 1987, 12, 15);       Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);       boss.setBonus(5000);       System.out.println("boss.toString(): " + boss);       System.out.println("carl.equals(boss): " + carl.equals(boss));       System.out.println("alice1.hashCode(): " + alice1.hashCode());       System.out.println("alice3.hashCode(): " + alice3.hashCode());       System.out.println("bob.hashCode(): " + bob.hashCode());       System.out.println("carl.hashCode(): " + carl.hashCode());    } }

package equals;

public class Manager extends Employee
{
   private double bonus;

   public Manager(String name, double salary, int year, int month, int day)
   {
      super(name, salary, year, month, day);
      bonus = 0;
   }

   public double getSalary()
   {
      double baseSalary = super.getSalary();
      return baseSalary + bonus;
   }

   public void setBonus(double bonus)
   {
      this.bonus = bonus;
   }

   public boolean equals(Object otherObject)
   {
      if (!super.equals(otherObject)) return false; 
      //在子类中定义equals 方法时,首先调用超类的equals,如果检测失败,对象就不可能像等,如果超类中的域都相等,就需要比较子类中的实例域
      Manager other = (Manager) otherObject;
      // super.equals checked that this and other belong to the same class
      return bonus == other.bonus;
   }

   public int hashCode()
   {
      return java.util.Objects.hash(super.hashCode(), bonus);
   }

   public String toString()
   {
      return super.toString() + "[bonus=" + bonus + "]";
   }
}

运行结果如下:

测试程序4

Ÿ 在elipse IDE中调试运行程序5-11(教材182页),结合程序运行结果理解程序;

Ÿ 掌握ArrayList类的定义及用法;

Ÿ 在程序中相关代码处添加新知识的注释。

package arrayList;

import java.util.*;

/**
 * This program demonstrates the ArrayList class.
 * @version 1.11 2012-01-26
 * @author Cay Horstmann
 */
public class ArrayListTest
{
   public static void main(String[] args)
   {
      // fill the staff array list with three Employee objects
      ArrayList<Employee> staff = new ArrayList<>();//构建一个空数组列表

      staff.add(new Employee("Carl Cracker", 75000, 1987, 12, 15));
      staff.add(new Employee("Harry Hacker", 50000, 1989, 10, 1));
      staff.add(new Employee("Tony Tester", 40000, 1990, 3, 15));

      // raise everyone's salary by 5%
      for (Employee e : staff)//使用for each循环遍历数组列表
         e.raiseSalary(5);

      // print out information about all Employee objects
      for (Employee e : staff)
         System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ",hireDay="
               + e.getHireDay());
   }
}

运行结果如下:

测试程序5:

Ÿ 编辑、编译、调试运行程序5-12(教材189页),结合运行结果理解程序;

Ÿ 掌握枚举类的定义及用法;

Ÿ 在程序中相关代码处添加新知识的注释。

package enums;

import java.util.*;

/**
* This program demonstrates enumerated types.
* @version 1.0 2004-05-24
* @author Cay Horstmann
*/
public class EnumTest

public static void main(String[] args)

Scanner in = new Scanner(System.in);
System.out.print("Enter a size: (SMALL, MEDIUM, LARGE, EXTRA_LARGE) ");
String input = in.next().toUpperCase();
Size size = Enum.valueOf(Size.class, input);//valueOf方法用于返回相关Number对象持有传递的参数的值,该参数可以是基本数据类型,字符串等System.out.println("size=" + size);

System.out.println("abbreviation=" + size.getAbbreviation());
if (size == Size.EXTRA_LARGE)
System.out.println("Good job--you paid attention to the _."); 
}
}

enum Size
{
SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");

private Size(String abbreviation) { this.abbreviation = abbreviation; //构造枚举常量


public String getAbbreviation() { return abbreviation; }

private String abbreviation;
}

实验2编程练习1

Ÿ 定义抽象类Shape

属性:不可变常量double PI,值为3.14

方法:public double getPerimeter();public double getArea())。

Ÿ 让RectangleCircle继承自Shape类。

Ÿ 编写double sumAllArea方法输出形状数组中的面积和和double sumAllPerimeter方法输出形状数组中的周长和。 

Ÿ main方法中

1输入整型值n,然后建立n个不同的形状。如果输入rect,则再输入长和宽。如果输入cir,则再输入半径。 2) 然后输出所有的形状的周长之和,面积之和。并将所有的形状信息以样例的格式输出。 3) 最后输出每个形状的类型与父类型,使用类似shape.getClass()(获得类型),shape.getClass().getSuperclass()(获得父类型);

思考sumAllAreasumAllPerimeter方法放在哪个类中更合适?

输入样例:

3

rect

1 1

rect

2 2

cir

1

输出样例:

18.28

8.14

[Rectangle [width=1, length=1], Rectangle [width=2, length=2], Circle [radius=1]]

class Rectangle,class Shape

class Rectangle,class Shape

class Circle,class Shape

package Areas.java;

public class Shape {
private int radius;
Circle(int radius){
this.radius=radius;
}
public double getPerimeter(int radius){
return (radius*2*3.14);
}
public double getArea(int radius){
return (radius*radius*3.14);
}
@Override
public String toString() {
return "Circle [radius=" + radius + "]";
}
}

package Areas.java;

import java.util.Scanner;

public class Test {

public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
System.out.println("请输入矩形的长:");
int length=scan.nextInt();
System.out.println("请输入矩形的宽:");
int width=scan.nextInt();


Rectangle r=new Rectangle(width,length);
System.out.println("请输入圆的半径:");
int radius=scan.nextInt();
Circle c=new Circle(radius);

System.out.println("周长和:"+(r.getPerimeter(width, length)+c.getPerimeter(radius)));
System.out.println("面积和:"+(r.getArea(width, length)+c.getArea(radius)));
}

}

实验3 编程练习2

编制一个程序,将身份证号.txt 中的信息读入到内存中,输入一个身份证号或姓名,查询显示查询对象的姓名、身份证号、年龄、性别和出生地。

 

4. 实验总结:

通过本次实验我理解了继承的定义;掌握了子类的定义要求;掌握了多态性的概念及用法;掌握了抽象类的定义及用途;掌握了类中4个成员访问权限修饰符的用途;掌握了抽象类的定义方法及用途;掌握了Object类的用途及常用API;掌握了ArrayList类的定义方法及用法;掌握了枚举类定义方法及用途。

 

猜你喜欢

转载自www.cnblogs.com/yanglinga/p/9725239.html