201871010114-李岩松《面向对象程序设计(java)》第八周学习总结
项目 |
内容 |
这个作业属于哪个课程 |
https://www.cnblogs.com/nwnu-daizh/ |
这个作业的要求在哪里 |
https://www.cnblogs.com/nwnu-daizh/p/11435127.html |
作业学习目标 |
|
第一部分:总结第六章理论知识
一、接口
1.1、接口概念
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
1.2、接口与类相似点
一个接口可以有多个方法。
接口文件保存在 .java 结尾的文件中,文件名使用接口名。
接口的字节码文件保存在 .class 结尾的文件中。
接口相应的字节码文件必须在与包名称相匹配的目录结构中。
1.3、接口与类的区别
接口不能用于实例化对象。
接口没有构造方法。
接口中所有的方法必须是抽象方法。
接口不能包含成员变量,除了 static 和 final 变量。
接口不是被类继承了,而是要被类实现。
接口支持多继承。
1.4、接口特性
接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
接口中可以含有常量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
1.5、抽象类和接口的区别
抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的常量。
一个类只能继承一个抽象类,而一个类却可以实现多个接口。
1.6、接口和抽象类的语法区别:
1)接口不能有构造方法,抽象类可以有。
2)接口不能有方法体,抽象类可以有。
3)接口不能有静态方法,抽象类可以有。
4)在接口中凡是变量必须是public static final,而在抽象类中没有要求。
1.7、静态方法与默认方法
1、静态方法
在Java SE 8中,允许在接口中增加静态方法。理论上讲 , 没有任何理由认为这是不合法的。只是这有违于将接口作为抽象规范的初衷 。
public interface A {
static String aa(){
return "my is A aa";
}
}
A.aa();//my is A aa
2、默认方法
Java 8 允许给接口添加一个非抽象的方法实现,只需要使用 default 关键字即可,这个特征又叫做扩展方法(也称为默认方法或虚拟扩展方法或防护方法)。在实现该接口时,该默认扩展方法在子类上可以直接使用,它的使用方式类似于抽象类中非抽象成员方法。
默认方法允许我们在接口里添加新的方法,而不会破坏实现这个接口的已有类的兼容性,也就是说不会强迫实现接口的类实现默认方法。
默认方法和抽象方法的区别是抽象方法必须要被实现,默认方法不是。作为替代方式,接口可以提供一个默认的方法实现,所有这个接口的实现类都会通过继承得到这个方法(如果有需要也可以重写这个方法)
public interface A {
static String aa(){
return "my is A aa";
}
String bb();
default String cc(){
return "my is A cc";
};
default String dd(){
return "my is A dd";
};
}
public class B implements A{
@Override
public String bb() {
return "my is B bb";
}
@Override
public String cc(){
return "my is B cc";
}
}
3、默认方法冲突
如果先在一个接口中将一个方法定义为默认方法,然后又在超类或另一个接口中定义了同样的方法,就会产生一个二义性错误.对于解决这个问题,java提供了相对简单的规则.
1)、超类优先.如果超类提供了一个具体方法,同名并且有相同参数的默认方法会被忽略
2)、接口冲突.如果一个接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型相同的方法,必须覆盖这个方法来解决冲突
第二部分:实验部分
1、实验目的与要求
(1) 掌握接口定义方法;
(2) 掌握实现接口类的定义要求;
(3) 掌握实现了接口类的使用要求;
(4) 掌握程序回调设计模式;
(5) 掌握Comparator接口用法;
(6) 掌握对象浅层拷贝与深层拷贝方法;
(7) 掌握Lambda表达式语法;
(8) 了解内部类的用途及语法要求。
2、实验内容和步骤
实验1: 导入第6章示例程序,测试程序并进行代码注释。
测试程序1:
l 编辑、编译、调试运行阅读教材214页-215页程序6-1、6-2,理解程序并分析程序运行结果;
l 在程序中相关代码处添加新知识的注释。
l 掌握接口的实现用法;
- package interfaces;
- import java.util.*;
- /**
- * This program demonstrates the use of the Comparable interface.
- * @version 1.30 2004-02-27
- * @author Cay Horstmann
- */
- public class EmployeeSortTest
- {
- public static void main(String[] args)
- {
- Employee[] staff = new Employee[3];//创建一个数组对象,大小为三
- staff[0] = new Employee("Harry Hacker", 35000);
- staff[1] = new Employee("Carl Cracker", 75000);
- staff[2] = new Employee("Tony Tester", 38000);
- Arrays.sort(staff);
- // 打印所有员工对象的信息
- for (Employee e : staff)
- System.out.println("name=" + e.getName() + ",salary=" + e.getSalary());
- }
- }
- package interfaces;
- public class Employee implements Comparable<Employee>
- {
- private String name;
- private double salary;
- public Employee(String name, double salary)
- {
- this.name = name;
- this.salary = salary;
- }
- public String getName()
- {
- return name;//name访问器
- }
- public double getSalary()
- {
- return salary; //salary访问器
- }
- public void raiseSalary(double byPercent)
- {
- double raise = salary * byPercent / 100;
- salary += raise;
- }
- /**
- * Compares employees by salary
- * @param other another Employee object
- * @return a negative value if this employee has a lower salary than
- * otherObject, 0 if the salaries are the same, a positive value otherwise
- */
- public int compareTo(Employee other)
- {
- return Double.compare(salary, other.salary);
- }
- }
运行结果:
测试示例程序:
- interface A
- {
- double g=9.8;
- void show( );
- }
- class C implements A
- {
- public void show( )
- {System.out.println("g="+g);}
- }
- class InterfaceTest
- {
- public static void main(String[ ] args)
- {
- A a=new C( );
- a.show( );
- System.out.println("g="+C.g);
- }
- }
运行结果:
测试程序3:
l 在elipse IDE中调试运行教材223页6-3,结合程序运行结果理解程序;
l 26行、36行代码参阅224页,详细内容涉及教材12章。
l 在程序中相关代码处添加新知识的注释。
l 掌握回调程序设计模式;
- package week8;
- /**
- @version 1.02 2017-12-14
- @author Cay Horstmann
- */
- import java.awt.*;
- import java.awt.event.*;
- import java.time.*;
- import javax.swing.*;
- public class TimerTest
- {
- public static void main(String[] args)
- {
- var listener = new TimePrinter();//定义一个Timeprinter
- // construct a timer that calls the listener
- // once every second
- var timer = new Timer(1000, listener);
- timer.start();
- // keep program running until the user selects "OK"
- JOptionPane.showMessageDialog(null, "Quit program?");
- System.exit(0);
- }
- }
- class TimePrinter implements ActionListener //ActionListener是TimePrinter的接口
- {
- public void actionPerformed(ActionEvent event)
- {
- System.out.println("At the tone, the time is "
- + Instant.ofEpochMilli(event.getWhen()));
- Toolkit.getDefaultToolkit().beep();
- }
- }
6-3
测试程序4:
l 调试运行教材229页-231页程序6-4、6-5,结合程序运行结果理解程序;
l 在程序中相关代码处添加新知识的注释。
l 掌握对象克隆实现技术;
l 掌握浅拷贝和深拷贝的差别。
- package clone;
- /**
- * This program demonstrates cloning.
- * @version 1.10 2002-07-01
- * @author Cay Horstmann
- */
- public class CloneTest
- {
- public static void main(String[] args)
- {
- try
- {
- Employee original = new Employee("John Q. Public", 50000);
- //Employee是一个自定义类
- original.setHireDay(2000, 1, 1);
- Employee copy = original.clone();
- copy.raiseSalary(10);//原有对象不会发生变化
- copy.setHireDay(2002, 12, 31);//更改器
- System.out.println("original=" + original);//字符串连接
- System.out.println("copy=" + copy);
- }
- catch (CloneNotSupportedException e)
- {
- e.printStackTrace();
- }
- }
- }
- package clone;
- import java.util.Date;
- import java.util.GregorianCalendar;
- public class Employee implements Cloneable
- {
- private String name;
- private double salary;
- private Date hireDay;
- public Employee(String name, double salary)
- {
- this.name = name;
- this.salary = salary;
- hireDay = new Date();
- }
- public Employee clone() throws CloneNotSupportedException
- {
- // 调用object.clone()
- Employee cloned = (Employee) super.clone();
- // 克隆可变的字段
- cloned.hireDay = (Date) hireDay.clone();
- return cloned;
- }
- /**
- * Set the hire day to a given date.
- * @param year the year of the hire day
- * @param month the month of the hire day
- * @param day the day of the hire day
- */
- public void setHireDay(int year, int month, int day)
- {
- Date newHireDay = new GregorianCalendar(year, month - 1, day).getTime();
- // 实力字段突变的例子
- hireDay.setTime(newHireDay.getTime());
- }
- public void raiseSalary(double byPercent)
- {
- double raise = salary * byPercent / 100;
- salary += raise;
- }
- public String toString()
- {
- return "Employee[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay + "]";
- }
运行结果:
实验2: 导入第6章示例程序6-6,学习Lambda表达式用法。
l 调试运行教材233页-234页程序6-6,结合程序运行结果理解程序;
l 在程序中相关代码处添加新知识的注释。
l 将27-29行代码与教材223页程序对比,将27-29行代码与此程序对比,体会Lambda表达式的优点。
- import java.util.*;
- import javax.swing.*;
- import javax.swing.Timer;
- /**
- * This program demonstrates the use of lambda expressions.
- * @version 1.0 2015-05-12
- * @author Cay Horstmann
- */
- public class LambdaTest
- {
- public static void main(String[] args)
- {
- String[] planets = new String[] { "Mercury", "Venus", "Earth", "Mars",
- "Jupiter", "Saturn", "Uranus", "Neptune" };
- System.out.println(Arrays.toString(planets));
- System.out.println("Sorted in dictionary order:");
- Arrays.sort(planets);
- System.out.println(Arrays.toString(planets));
- System.out.println("Sorted by length:");
- Arrays.sort(planets, (first, second) -> first.length() - second.length());
- System.out.println(Arrays.toString(planets));
- Timer t = new Timer(1000, event ->
- System.out.println("The time is " + new Date()));
- t.start();
- // 持续运行程序直到按下ok键
- JOptionPane.showMessageDialog(null, "Quit program?");
- System.exit(0);
- }
- }
运行结果:
注:以下实验课后完成
实验3: 编程练习
l 编制一个程序,将身份证号.txt 中的信息读入到内存中;
l 按姓名字典序输出人员信息;
l 查询最大年龄的人员信息;
l 查询最小年龄人员信息;
- package week8;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collections;
- import java.util.Scanner;
- public class Main{
- private static ArrayList<Person> Personlist;
- public static void main(String[] args) {
- Personlist = new ArrayList<>();
- Scanner scanner = new Scanner(System.in);
- File file = new File("D:\\java\\身份证号.txt");
- try {
- FileInputStream fis = new FileInputStream(file);
- BufferedReader in = new BufferedReader(new InputStreamReader(fis));
- String temp = null;
- while ((temp = in.readLine()) != null) {
- Scanner linescanner = new Scanner(temp);
- linescanner.useDelimiter(" ");
- String name = linescanner.next();
- String ID = linescanner.next();
- String sex = linescanner.next();
- String age = linescanner.next();
- String place =linescanner.nextLine();
- Person people = new Person();
- people.setname(name);
- people.setID(ID);
- people.setsex(sex);
- int a = Integer.parseInt(age);
- people.setage(a);
- people.setbirthplace(place);
- Personlist.add(people);
- }
- } catch (FileNotFoundException e) {
- System.out.println("查找不到信息");
- e.printStackTrace();
- } catch (IOException e) {
- System.out.println("信息读取有误");
- e.printStackTrace();
- }
- boolean isTrue = true;
- while (isTrue) {
- System.out.println("————————————————————————————————————————");
- System.out.println("1:按姓名字典序输出人员信息");
- System.out.println("2:查询最大年龄人员信息和最小年龄人员信息");
- System.out.println("3:查询人员中是否有你的老乡");
- System.out.println("4:输入你的年龄,查询年龄与你最近人的所有信息");
- System.out.println("5:退出程序");
- int nextInt = scanner.nextInt();
- switch (nextInt) {
- case 1:
- Collections.sort( Personlist);
- System.out.println( Personlist.toString());
- break;
- case 2:
- int max=0,min=100;int j,k1 = 0,k2=0;
- for(int i=1;i< Personlist.size();i++)
- {
- j= Personlist.get(i).getage();
- if(j>max)
- {
- max=j;
- k1=i;
- }
- if(j<min)
- {
- min=j;
- k2=i;
- }
- }
- System.out.println("年龄最大:"+ Personlist.get(k1));
- System.out.println("年龄最小:"+ Personlist.get(k2));
- break;
- case 3:
- System.out.println("place?");
- String find = scanner.next();
- String place=find.substring(0,3);
- String place2=find.substring(0,3);
- for (int i = 0; i < Personlist.size(); i++)
- {
- if( Personlist.get(i).getbirthplace().substring(1,4).equals(place))
- System.out.println(Personlist.get(i));
- }
- break;
- case 4:
- System.out.println("年龄:");
- int yourage = scanner.nextInt();
- int near=agenear(yourage);
- int d_value=yourage-Personlist.get(near).getage();
- System.out.println(""+Personlist.get(near));
- /* for (int i = 0; i < Peoplelist.size(); i++)
- {
- int p=Personlist.get(i).getage()-yourage;
- if(p<0) p=-p;
- if(p==d_value) System.out.println(Peoplelist.get(i));
- } */
- break;
- case 5:
- isTrue = false;
- System.out.println("退出程序!");
- break;
- default:
- System.out.println("输入有误");
- }
- }
- }
- public static int agenear(int age) {
- int min=25,d_value=0,k=0;
- for (int i = 0; i < Personlist.size(); i++)
- {
- d_value= Personlist.get(i).getage()-age;
- if(d_value<0) d_value=-d_value;
- if (d_value<min)
- {
- min=d_value;
- k=i;
- }
- } return k;
- }
- }
- package week8;
- public class Person implements Comparable<Person > {
- private String name;
- private String ID;
- private int age;
- private String sex;
- private String birthplace;
- public String getname() {
- return name;
- }
- public void setname(String name) {
- this.name = name;
- }
- public String getID() {
- return ID;
- }
- public void setID(String ID) {
- this.ID= ID;
- }
- public int getage() {
- return age;
- }
- public void setage(int age) {
- // int a = Integer.parseInt(age);
- this.age= age;
- }
- public String getsex() {
- return sex;
- }
- public void setsex(String sex) {
- this.sex= sex;
- }
- public String getbirthplace() {
- return birthplace;
- }
- public void setbirthplace(String birthplace) {
- this.birthplace= birthplace;
- }
- public int compareTo(Person o) {
- return this.name.compareTo(o.getname());
- }
- public String toString() {
- return name+"\t"+sex+"\t"+age+"\t"+ID+"\t"+birthplace+"\n";
- }
运行结果:
实验4:内部类语法验证实验
实验程序1:
l 编辑、调试运行教材246页-247页程序6-7,结合程序运行结果理解程序;
l 了解内部类的基本用法。
实验程序2:
l 编辑、调试运行教材254页程序6-8,结合程序运行结果理解程序;
l 掌握匿名内部类的用法。
实验程序3:
l 在elipse IDE中调试运行教材257页-258页程序6-9,结合程序运行结果理解程序;
l 了解静态内部类的用法。
实验总结
本章主要学习了掌握接口定义方法;实现接口类的定义要求;实现了接口类的使用要求;程序回调设计模式;Comparator接口用法;对象浅层拷贝与深层拷贝方法;Lambda表达式语法;内部类的用途及语法要求。通过对新知识的代码注解,理解起来更加清楚。但是我感觉程序设计回调模式我还不能完全理解,后面我会查阅资料,进行更进一步的学习。
201871010114-李岩松《面向对象程序设计(java)》第八周学习总结的更多相关文章
- 201771010134杨其菊《面向对象程序设计java》第九周学习总结
第九周学习总结 第一部分:理论知识 异常.断言和调试.日志 1.捕获 ...
- 扎西平措 201571030332《面向对象程序设计 Java 》第一周学习总结
<面向对象程序设计(java)>第一周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 ...
- 201871010132-张潇潇《面向对象程序设计(java)》第一周学习总结
面向对象程序设计(Java) 博文正文开头 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cn ...
- 杨其菊201771010134《面向对象程序设计Java》第二周学习总结
第三章 Java基本程序设计结构 第一部分:(理论知识部分) 本章主要学习:基本内容:数据类型:变量:运算符:类型转换,字符串,输入输出,控制流程,大数值以及数组. 1.基本概念: 1)标识符:由字母 ...
- 201871010124 王生涛《面向对象程序设计JAVA》第一周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://edu.cnblogs.com/campus/xbsf/ ...
- 201871010115——马北《面向对象程序设计JAVA》第二周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- 201777010217-金云馨《面向对象程序设计(Java)》第二周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- 201871010132——张潇潇《面向对象程序设计JAVA》第二周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- 201771010123汪慧和《面向对象程序设计Java》第二周学习总结
一.理论知识部分 1.标识符由字母.下划线.美元符号和数字组成, 且第一个符号不能为数字.标识符可用作: 类名.变量名.方法名.数组名.文件名等.第二部分:理论知识学习部分 2.关键字就是Java语言 ...
- 20155321 2016-2017-2 《Java程序设计》第八周学习总结
20155321 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 创建Logger对象 static Logger getLogger(String name ...
随机推荐
- MySQL 5.7安装(多实例)最佳实践
MySQL 5.7安装(多实例)最佳实践,接上一篇<MySQL 5.7安装最佳实践>在已有的实例上面新增一个实例,主要是为了资源合理利用:下面是具体的步骤: 1.新实例目录规划,my.cn ...
- javascript 对象和字符串互转
Object => String : console.log(JSON.stringify(e)); String => Object : JSON.parse(str)
- django1-环境搭建
我的环境:win10 + pycharm2019.1.3 + python3.6.5 + Django2.1.10 安装django cmd下执行:pip install django==2.1.10 ...
- 后缀数组(SA)
学习了LRJ神犇的代码.orz. 首先真心建议了解下基数排序!!且要有一定的c++程序经验,否则程序很难看懂. 然后对着下面的程序调试(假装你已经会了算法思想) 弄个一个礼拜一下午就能学会了. 该算法 ...
- win7重装系统经验总结报告(2013年6月29日凌晨1:45)
win7重装系统经验总结报告(2013年6月29日凌晨1:45) 步骤: 1.考虑被重做的电脑是否有重要文件在C盘.有则转移到D盘等非系统盘. 2.看该电脑是2GB内存还是4GB以上内存. 3.准备好 ...
- 主流 CSS 布局(水平居中、垂直居中、居中 )
什么是布局 html 页面的整体结构或骨架 布局不是某个技术内容 而是一种设计思想 [ 布局方式 ] 水平居中布局 垂直居中布局 居中布局( 水平 + 垂直 ) 什么是水平居中布局 水平居中布局 元素 ...
- Java基础(二十八)Java IO(5)RandomAccessFile类与过滤器流(Filter Stream)
一.RandomAccessFile类 使用RandomAccessFile类可以读取任意位置数据的文件. 1.构造方法 RandomAccessFile(String name, String mo ...
- Java网络编程(二)IP、URL和HTTP
一.IP InetAddress类有一些静态工厂方法,可以连接到DNS服务器来解析主机名. 示例1:InetAddress address = InetAddress.getByName(" ...
- LeetCode刷题总结-数组篇(上)
数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...
- 在k8s上安装Jenkins及常见问题
持续集成和部署是DevOps的重要组成部分,Jenkins是一款非常流行的持续集成和部署工具,最近试验了一下Jenkins,发现它是我一段时间以来用过的工具中最复杂的.一个可能的原因是它需要与各种其它 ...