杨玲 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];  // 填充对象的雇员信息

people[0] = new Employee("Harry Hacker", 50000, 1989, 10, 1);//引入雇员类对象

people[1] = new Student("Maria Morris", "computer science");//引入student类对象

// 打印出所有对象的民称和描述

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)

{       //  把n传递给超类构造函数

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())。

? 让Rectangle与Circle继承自Shape类。

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

? main方法中

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

思考sumAllArea和sumAllPerimeter方法放在哪个类中更合适?

输入样例:

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类的定义方法及用法;掌握了枚举类定义方法及用途。

原文地址:https://www.cnblogs.com/yanglinga/p/9725239.html

时间: 2024-11-08 16:21:56

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

20182318 2019-2020-1 《数据结构与面向对象程序设计》第六周学习总结

20182318 2019-2020-1 <数据结构与面向对象程序设计>第六周学习总结 教材学习内容总结 第九章 多态 后绑定.效率低于编译阶段的绑定效率. 学习练习如何利用继承方式来实现多态性. 学习练习如何利用接口来实现多态性. 多态性设计(多个不同对象执行相同的基本行为,并且行为的不同实现方式取决于对象的具体类型.) 第十章 异常 异常处理(异常抛出的问题和处理异常的方法) 未捕获的异常. try-catch语句与finally子句. 异常传播.(就与传递性一样,举个例子:程序一存在异常

《数据结构与面向对象程序设计》第六周学习总结

学号 2019-2020-1 <数据结构与面向对象程序设计>第六周学习总结 教材学习内容总结 多态引用可以在不同时间指向不同类型对象,即运行一致性的方法出现不一致的行为. 使用父类声明的引用变量可以指向子类的对象,接口也可以实现多态 使用try-catch来实现未捕获的异常的处理.可以使得异常被捕获进而不导致程序出现错误退出. 使用try写入可能产生异常的语句,使用catch来编写在捕获异常后继续执行的代码(可以为空). 自定义异常 - throw:抛出异常 - throws:用于方法名的后面

201777010217-金云馨《面向对象程序设计(Java)》第二周学习总结

项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/11475377.html 作业学习目标 学习并掌握Java Application程序结构: 学习并掌握Java语言的数据类型与变量: 学会使用Java运算符构造各类表达式: 掌握Java Application输入输出技术: 掌握Java流程控制技术(分支.循环): 掌握Math类.Strin

201771010123汪慧和《面向对象程序设计Java》第二周学习总结

一.理论知识部分 1.标识符由字母.下划线.美元符号和数字组成, 且第一个符号不能为数字.标识符可用作: 类名.变量名.方法名.数组名.文件名等.第二部分:理论知识学习部分 2.关键字就是Java语言中已经被赋予特定意义 的一些单词. ?常见有:class.public.try.catch.if. float.import.void等. 关键字不做变量名. 3.Java有三种注释的方式:   // 注释内容由//一直到此行结束. /*和*/ 定义一个注释块.  /**开始,*/结束 这种注释方法

20165318 2017-2018-2 《Java程序设计》第六周学习总结

20165318 2017-2018-2 <Java程序设计>第六周学习总结 教材内容学习总结 第八章 常用实用类 1.String类 String类用来处理字符序列,在java.lang包中,程序可以直接使用String类.需要注意的是Java把String类声明为final类,因此用户不能扩展String类,即String类不可以有子类. 常量对象:字符串常量对象是用双引号括起的字符序列,例如:"你好"."12.97"."boy"

2017-2018-2学期 20172324《Java程序设计》第六周学习总结

20172324<Java程序设计>第六周学习总结 教材学习内容总结 如何创建数组以及int[] X与int X[]的区别(编译时是没有差别的,只是前者与其他类型的声明方式有一致性) 每一个java数组都是一个迭代器. 数组是作为参数传递给一个方法的,实际上传递的是原始数组引用的副本. 对象数组(基本数据类型+对象) 二维数组中前一个索引值代表行,另一个索引值代表列. 可变长度参数用... 教材学习中的问题和解决过程 问题1: Family代码中String...name中的...是什么意思.

20175202 《Java程序设计》第六周学习总结

20175202 2018-2019-2 <Java程序设计>第六周学习总结 教材知识点总结 1.内部类: Java支持在一个类中定义另一个类,称作内部类,包含内部类的类叫做外嵌类. 内部类的外嵌类的成员变量在内部类中仍然有效,内部类也可以调用其方法. 内部类的类体中不能声明变量和方法. 内部类仅供其外嵌类使用. 2.匿名类: 匿名类可以继承和重写父类的方法,且匿名类一定是内部类. 匿名类可以访问外嵌类的变量和方法,匿名类的类体不能声明static变量和方法. 创建对象时,必须使用父类的构造方

学号 20175329 2018-2019-3《Java程序设计》第六周学习总结

学号 20175329 2018-2019-3<Java程序设计>第六周学习总结 教材学习内容 第七章 内部类与异常类 内部类与外嵌类之间的重要关系如下: 内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法. 内部类的类体中不可以声明类变量和类方法.外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员. 内部类仅供它的外嵌类使用,其他类不可以用某个类的内部类声明对象. 2.匿名类 匿名类可以继承父类的方法也可以重写父类的方法. 使用匿名类时,必然是在某个类中直接

20175317 《Java程序设计》第六周学习总结

20175317 <Java程序设计>第六周学习总结 教材学习内容总结 第六周我学习了教材第七章与第十章的内容,了解了内部类.异常类与输入输出流的知识,学到了以下内容: 什么是内部类 如何编写与运行内部类 了解了和子类有关的匿名类与和接口有关的匿名类 如何自定义异常类.try-catch语句的使用方式 如何使用File类查看文件属性.创建目录.创建删除文件和运行可执行文件 文件字节输入流的构造 在看完课本知识的同时我也将教材配套视频看完了,教材代码也逐一进行了编译运行,通过实践进一步学习了本章

20175234 2018-2019-2 《Java程序设计》第六周学习总结

20175234 2018-2019-2 <Java程序设计>第六周学习总结 教材学习内容总结 第七章内部类和异常类 总结 Java支持在一个类中声明另一个类,这样的类称作内部类,而包含内部类的类成为内部类的外嵌类. 和某类有关的匿名类就是该类的一个子类,该子类没有明显的用类声明来定义. 和某接口有关的匿名类就是实现该接口的一个类,该子类没有明显的用类声明来定义. 使用try-catch语句来处理异常,将可能出现的异常操作放在try-catch语句的try部分,当try部分中的某个方法调用发生