201871010125 王玉江 《面向对象程序设计(java)》 第四周学习总结
项目 |
内容 |
这个作业属于哪个课程 |
https://www.cnblogs.com/nwnu-daizh/ |
这个作业的要求在哪里 |
|
作业学习目标 |
|
随笔博文正文内容包括:
第一部分:总结第四章理论知识
第四章 对象与类
4.1 面向对象程序设计概述
4.1.1 类
一:常见定义
1.类
定义:一系列事物的统称,同类事物必定具有相同的特性,日常事物的特征根据特性分为状态和行为,对应到类中是变量和方法
.类的定义规则:
public/默认 class 类名{
属性
方法
}
2.类成员
成员变量、成员方法的统称
3.成员变量
用于描述对象的固有状态或属性,也叫公有变量
4.成员方法
用于描述对象的固有行为,也叫实例方法
5.对象
定义:类的具体表现形式,是实际存在的个体,也叫实例(instance)
对象的定义:
类名 对象名; 在定义对象的同时给对象分配内存空间
类名 对象名 = new 类名();
备注:new 调用的是构造方法
6.类和对象的关系
一个类可以创建任意个数的对象
7.封装
对受访问保护的成员进行功能开放的控制,达到保护数据不被非法访问的目的
8.类变量
定义在类中,不属于某个具体对象的特征,被所有对象共同使用的特征
9.类方法
定义在类中,不属于某个具体对象的行为,被所有对象共同使用的行为
9.1.类方法中不允许使用实例变量和实例方法
9.2.类方法中允许使用类变量和类方法,通过第一个参数cls进行
9.3.实例方法中允许使用类变量和类方法
10.静态方法
既不访问成员变量,也不访问类变量,定义成静态方法
11.继承
一种类间的关系,一个类A从另一个类B获取成员信息,称类A继承自类B。提供成员信息的类称为父类(基类),获取成员信息的类称为子类(派生类)
11.1.子类可以添加父类没有的成员
11.2.父类私有成员不可被继承
12.多继承
一个类同时继承多个类,称为多继承。
class 类名(父类名1, 父类名2……)
12.1.多继承关系中,当多个父类具有同名成员,子类调用该成员时先调用继承关系中的第一个声明的类的成员
13.重写
在子类中定义与父类相同名称的成员方法。
super().方法名()
14.多态
一个对象具有多种形态,在不同的使用环境中以不同的形态展示其功能,称该对象具有多态特征。多态通常发生在继承关系的基础之上。
15.注意
只访问成员变量的方法,定义成实例方法
只访问类变量的方法,定义类方法
既访问成员变量,也访问类变量的方法,定义成实例方法
既不访问成员变量,也不访问类变量,定义成静态方法
二:常用类
4.1.2 对象
一:对象的三个主要特性:
1.对象的行为——可以对对象施加哪些操作
2.对象的状态——施加方法时,对象如何反应
3.对象的识别——如何辨别相同行为与状态的不同对象?
4.1.3 识别类
一:类与类之间的关系
1.继承关系
继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。在Java中继承关系通过关键字extends
明确标识,在设计时一般没有争议性。在UML类图设计中,继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口。
2。实现关系
实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系。在Java中此类关系通过关键字implements明确标识,在设计时一般没有
争议性。在UML类图设计中,实现用一条带空心三角箭头的虚线表示,从类指向实现的接口。
3.依赖关系
简单的理解,依赖就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是类B 的变化不会影响类A。在UML类图设计中,依赖关系用由A指向B,用带箭头的虚线表示。
图示如下:
4.3 用户自定义类
在上述实例程序中包含两个类:EmployeeTest Employeel类和带有public访问修饰符的EmployeeTest。EmployeeTest类包含了main方法。源文件名是EmployeeTest.java,这是因为文件名必须与public类的名字相匹配。在一个文件中,只能有一个公有类,但可以有任意数目的非共有类。
接下来,当编译这段代码的时候,编译器将在目录下创建两个类文件:EmployeeTest.class 和Employee.class
将程序中包含main方法的类名提供给字节码解释器,以便启动这个程序: java EmployeeTest
字节码解释器开始运行Test1类的main方法中的代码。在这段代码中,先后构造了三个新的Employee对象,并显示它们的状态。
1.刨析Employee类
下面对Employee类进行刨析。首先从这个类的方法开始。通过查看原代码会发现,这个类包含一个构造器和四个方法
public Employee(String n,double s,int year,int month,int day)
public String getName()
public double getSalary()
public LocalDate getHireDay()
public void raiseSalary(double byPercent)
这个类的方法所有都被标记public。关键字public意味着任何类的任何方法都乐意调用这个方法
接下来,需要注意Emplouee类的实例中有三个实例域用来存放将要操作的数据:(实例域就是一个对象的成员变量,或者说是一个对象的属性)
private String name;
private double salary;
private LocalDate hireDay;
关键字private确保只有Employee类自身的方法能够访问这些实例域,而其他类的方法不能读写这些域。
public(不推荐,因为不安全,任何方法都能够读写这些域)
2.从构造器开始
下面看看Employ类的构造器:
public Employee(String n,double s,int year,int month,int day)
{
name=n;
salary=s;
hireDay=LocalDate.of(year, month, day);
}
可以看出构造器与类同名。在构造Employee类的对象时,构造器会运行以便将实例域初始化所希望的状态。
例如,在使用下条代码创建Employee类实例时:
new Employee("Carl Cracker",75000,1987,12,15);
会将实例域设置为:
name = "Carl Cracker";
salary = 75000;
hireDay = LocalDate.of1987,12,15();
构造器与其他的方法有一个重要的不同。构造器总是伴随着new操作符的执行被调用,而不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的。
注意:
1)、构造器与类名相同
2)、每个类可以有一个以上的构造器
3)、构造器可以有0个、1个或者多个参数
4)、构造器没有返回值
5)、构造器总有伴随new操作一起调用
4.4 静态域与静态方法
1、静态域
如果将域定义为static,每个类中只有一个这样的域。
class Employee
{
private static int nextId = 1;
private int id;
...
}
//现在,每一个雇员对象都有一个自己的id域,但这个类的所有实例将共享一个nextId域。
public void setId()
{
id = nextId;
nextId++;
}
假定为“难免有错”设定雇员标识码:
难免有错.setId(); //“难免有错”的id域被设置为静态域nextId当前的值,并且静态域nextId的值加1:
难免有错.id = Employee.nextId;
Employee.nextId++;
2、静态常量
示例:
public class Math
{
...
public static final double PI = 3.14159265358979323846;
...
}
可以采用Math.PI的形式获得这个常量。
若省略static,PI就变成了Math的一个实例域。需要通过Math类的对象访问PI,并且每个Math对象都有它自己的一份PI拷贝。
3、静态方法
静态方法是一种不能对对象实施操作的方法。例如,Math类的pow方法就是一个静态方法。
表达式:Math.pow(x,a) 计算x的a次方。运算时不使用任何Math对象,即无隐式参数。
可以认为静态方法是没有this参数的方法。
因为静态对象不能操作对象,所以不能在静态方法中访问实例域。但是,静态方法可以访问自身类中的静态域。
使用静态方法的实例:
public class Employee
{
public static int getNextId()
{
return nextId; //returns static field
}
}
//通过类名调用这个方法:
int n = Employee.getNextId();
在下面两种情况下使用静态方法:
I、一个方法不需要访问对象状态,其所需的参数都是通过显式参数提供。
II、一个方法只需要访问类的静态域。
4、工厂方法
静态方法还有一种常见的用途。NumberFormat类使用工厂方法产生不同风格的格式对象。
5、main方法
public class App
{
public static void main(String[] args)
{
....
}
}
main方法不对任何对象进行操作。同理,main方法也是一个静态方法。
4.5 对象构造
一:重载
方法的定义:
访问控制修饰符 返回值类型 方法名(参数列表){
//方法体
}
1. 方法重载:
在同一各类中提供多个同名不同参的方法。
重载要求:方法名称相同,但参数的类型不同 or 参数的个数不同 or 参数的顺序不同
示例:
1 package 第二天; 2 3 public class 第二天 { 4 public void fun1() { 5 } 6 public void fun1(int a) { 7 } 8 public void fun1(String c) { 9 } 10 public void fun1(int c, int d) { 11 } 12 public void fun1(String c, int d) { 13 } 14 public void fun1(int d,String c) { 15 } 16 }
注:对于重载。系统是根据实参来确定最终调用的哪个方法的。
2. 构造方法:
特殊的用法:用来构造 (创建) 对象,即用来在内存中开辟空间。
构造方法定义:
访问控制修饰符 方法名(参数类表){
//方法体
}
默认情况下,系统会给每一个类都提供一个默认的构造方法:
public 类名(){
}
构造方法只能被new关键字调用。
构造方法是特殊的方法,所以构造方法也可以重载。
构造方法重载的主要作用:是在开辟空间的同时给对象中的成员变量赋值。
1 package 第五天; 2 3 public class Teacher { 4 int id; 5 String name; 6 String major; 7 8 public Teacher() { 9 System.out.println("默认构造方法"); 10 } 11 12 public Teacher(int id) { 13 System.out.println("Teacher(int id)"); 14 } 15 16 public Teacher(int id,String name) { 17 this.id = id; 18 this.name = name; 19 System.out.println("Teacher(int id,String name)"); 20 } 21 22 public void shangke() { 23 System.out.println("shangke"); 24 } 25 26 public void beike() { 27 System.out.println("beike"); 28 } 29 }
注:this指的是new出来的空间。
四、封装:
1. 访问控制修饰符
a. private: 私有的,只能在当前类中使用,其他任何类都不能使用
b. public:公用的,谁(任何地方的任何类)都可以使用
c. 示例:
1 package 第五天; 2 3 public class person { 4 private int age; 5 private String gender; 6 private float height; 7 8 public void setAge(int age) { 9 if(age <0 || age > 125) { 10 System.out.println("age input error"); 11 return; 12 } 13 this.age = age; 14 } 15 16 public int getAge() { 17 return this.age; 18 } 19 }
4.6 包
一:通过import语句导入类包中的类
一个类可能需要另一个类声明的对象作为自己的成员或方法中的局部变量,如果这两个类在同一个包中那当然没有问题,但一个类想要使用的类和它本身不再同一个包中那么就需要通过import语句来进行引入。
特别是在编写源程序的时候我们除了自己的类以外,还需要使用java本身提供的许多类(即类库),而这些类肯定和我们自己编写的不再同一包内。
工具/原料
cmd命令提示符
import语句,java自带的类库
方法/步骤
import语句必须放在package语句和类之间。java本身自带了大约130个包,这里列举最常见的几种。
而当我们需要引入一个包中所有类的时候,只需要通过“*”运算符便可以将所有的类全部导入。
4.7 注释的插入
定义规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,减少项目组中因为换人而带来的损失。(这些规范并不是一定要绝对遵守,但是一定要让程序有良好的可读性)。
// 注释一行
/* ...... */ 注释若干行
/** ...... */ 注释若干行,并写入 javadoc 文档
第二部分:实验部分
实验名称:实验三 类与对象的定义及使用
1. 实验目的:
(1) 熟悉PTA平台线上测试环境;
(2) 理解用户自定义类的定义;
(3) 掌握对象的声明;
(4) 学会使用构造函数初始化对象;
(5) 使用类属性与方法的使用掌握使用;
(6) 掌握package和import语句的用途。
3. 实验步骤与内容:
实验1
采用个人账号登录https://pintia.cn/,使用绑定码620781加入PTA平台NWNU-2019CST1教学班(西北师范大学 计算机科学与工程学院 2018级计算机科学与技术),完成《2019秋季西北师范大学面向对象程序设计程序设计能力测试1》,测试时间50分钟。
实验1.1
公民身份证号码按照GB11643—1999《公民身份证号码》国家标准编制,由18位数字组成:前6位为行政区划分代码,第7位至14位为出生日期码,第15位至17位为顺序码,第18位为校验码。从键盘输入1个身份证号,将身份证号的年月日抽取出来,按年-月-日格式输出。注意:输入使用Scanner类的nextLine()方法,以免出错。
输入样例:
34080019810819327X
输出样例:
1981-08-19
实验截图如下:
实验1.2
studentfile.txt文件内容是某班同学的学号与姓名,利用此文件编制一个程序,将studentfile.txt文件的信息读入到内存,并提供两类查询功能:(1)输入姓名查询学号;(2)输入学号查询姓名。要求程序具有友好人机交互界面。
编程建议:
(1)从文件中读入学生信息,可以编写如下函数:
public static void StudentsFromFile(String fileName))
(2)输入姓名查找学生学号,可以编写如下函数:
public static String findStudent(String name)
(3)输入学号查找学生姓名,可以编写如下函数:
public static String findStudent(String ID)
运行截图如下:1):用泛型列表做
2):用对象数组
实验2 导入第4章示例程序并测试。
测试程序1:
l 编辑、编译、调试运行程序4-2(教材104页);
l 结合程序运行结果,掌握类的定义与类对象的用法,并在程序代码中添加类与对象知识应用的注释;
l 尝试在项目中编辑两个类文件(Employee.java、 EmployeeTest.java ),编译并运行程序。
l 参考教材104页EmployeeTest.java,设计StudentTest.java,定义Student类,包含name(姓名)、sex(性别)、javascore(java成绩)三个字段,编写程序,从键盘输入学生人数,输入学生信息,并按以下表头输出学生信息表:
姓名 性别 java成绩
截图如下:employee.java
employeeText.java
按以下表头输出学生信息表:
姓名 性别 java成绩
测试程序2:
l 编辑、编译、调试运行程序4-3(教材116);
l 结合程序运行结果,理解程序代码,掌握静态域(netxtId)与静态方法(getNextId)的用法,在相关代码后添加注释;
理解Java单元(类)测试的技巧。
测试程序3:
l 编辑、编译、调试运行程序4-4(教材121);
l 结合程序运行结果,理解程序代码,掌握Java方法参数的用法,在相关代码后添加注释;
截图如下:
测试程序4:
l 编辑、编译、调试运行程序4-5(教材129);
l 结合程序运行结果,理解程序代码,掌握Java用户自定义类的用法,掌握对象构造方法及对象使用方法,在相关代码后添加注释。
实验截图如下:
测试程序5:
l 编辑、编译、调试运行程序4-6、4-7(教材135);
l 结合程序运行结果,理解程序代码,掌握Java包的定义及用法,在相关代码后添加注释;
4.6截图如下:
4.7截图如下:
第三部分 实验总结
这周我们所学的内容主要包括Java理论知识学习和实验操作部分。
强化了自己使用集成开发平台(eclipse)来编写,导入以及运行程序的能力,结合c语言的语法与java语法的区别有了对于Java语言更深的理解。