20145304《Java程序设计》第四周学习总结

教材学习内容总结

1.继承共同行为:

  • 继承基本上就是避免多个类间重复定义共同行为,关键词为extends。

代码如下:

  1. //继承共同行为
  2. package cc.openhome;
  3. public class Role {
  4. private String name;
  5. private int level;
  6. private int blood;
  7. public int getBlood() {
  8. return blood;
  9. }
  10. public void setBlood(int blood) {
  11. this.blood = blood;
  12. }
  13. public int getLevel() {
  14. return level;
  15. }
  16. public void setLevel(int level) {
  17. this.level = level;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. }
  26. //剑士类
  27. package cc.openhome;
  28. public class SwordsMan extends Role {
  29. public void fight(){
  30. System.out.println("挥剑攻击");
  31. }
  32. }
  33. //魔法
  34. package cc.openhome;
  35. public class Magician extends Role {
  36. public void fight() {
  37. System.out.println("魔法攻击");
  38. }
  39. public void cure(){
  40. System.out.println("魔法攻击");
  41. }
  42. }

结果截图:

2.多态与is-a:

  • 子类只能继承一个父类。
  • 检查语法的逻辑是否正确时,方式是从=号右边往左读,判断右边是不是左边的子类,若是,则语法正确,若不是,则不正确。
  • 加上Cast语法,可强制使右边成为左边的子类,但有风险。

程序如下:

  1. //第二个主程序
  2. package cc.openhome;
  3. public class RPG1 {
  4. public static void main(String[] args) {
  5. SwordsMan swordsMan=new SwordsMan();
  6. swordsMan.setName("Justin");
  7. swordsMan.setLevel(1);
  8. swordsMan.setBlood(200);
  9. Magician magician=new Magician();
  10. magician.setName("Monica");
  11. magician.setLevel(1);
  12. magician.setBlood(100);
  13. showBlood(swordsMan);
  14. showBlood(magician);
  15. }
  16. static void showBlood(Role role){
  17. System.out.printf("%s 血量 %d%n",role.getName(),role.getBlood());
  18. }
  19. }

结果截图:

3.重新定义行为:

  • 在继承父类之后,定义与父类中相同的方法部署,但执行内容不同,这称为重新定义。
  • 防止因打错字而使程序无法运行,可在重新定义某方法时,加上@Override。

代码如下:


  1. //继承共同行为
  2. package cc.openhome;
  3. public class Role {
  4. private String name;
  5. private int level;
  6. private int blood;
  7. public int getBlood() {
  8. return blood;
  9. }
  10. public void setBlood(int blood) {
  11. this.blood = blood;
  12. }
  13. public int getLevel() {
  14. return level;
  15. }
  16. public void setLevel(int level) {
  17. this.level = level;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. public void fight(){
  26. //子类要重新定义fight()的实际行为
  27. }
  28. }
  29. //P167
  30. package cc.openhome;
  31. public class RPG2 {
  32. public static void main(String[] args) {
  33. SwordsMan swordsMan=new SwordsMan();
  34. swordsMan.setName("Justin");
  35. swordsMan.setLevel(1);
  36. swordsMan.setBlood(200);
  37. Magician magician=new Magician();
  38. magician.setName("Monica");
  39. magician.setLevel(1);
  40. magician.setBlood(100);
  41. drawFight(swordsMan);
  42. drawFight(magician);
  43. }
  44. static void drawFight(Role role){
  45. System.out.print(role.getName());
  46. role.fight();
  47. }
  48. }

结果截图:

4.抽象方法、抽象类:

  • 如果某方法区块中真的没有任何程序代码操作,可以使用abstract标示该方法为抽象方法,该方法不用撰写{}区块,直接“;”结束即可。
  • 类中若有方法没有操作,并且表示为abstract,表示这个类定义不完整,定义不完整的类不能生成实例。
  • Java中规定内含抽象方法的类,一定要在class前标示abstract,表示这是一个不完整的抽象类。
  • 子类如果继承抽象类,对于抽象方法有两种做法:一是做法是继续标示该方法为abstract,该子类也是个抽象类,必须在class前标示abstract;二是操作抽象方法。

代码如下:

  1. //继承共同行为
  2. package cc.openhome;
  3. public abstract class Role {
  4. private String name;
  5. private int level;
  6. private int blood;
  7. public int getBlood() {
  8. return blood;
  9. }
  10. public void setBlood(int blood) {
  11. this.blood = blood;
  12. }
  13. public int getLevel() {
  14. return level;
  15. }
  16. public void setLevel(int level) {
  17. this.level = level;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. public abstract void fight();
  26. }

5.继承语法细节:

  • 被声明为protected的成员,相同包中的类可以直接存取,不同包中的类可以在继承后的子类直接存取。
  • 依权限小至大来区分,就是private、无关键字、protected与public。
  • 重新定义方法要注意,对于父类中的方法权限,这能扩大但不能缩小。
  • 取得父类方法中的定义,可以在调用方法前,加上super关键词。
  • this()与super()只能择一调用,而且一定要在构造函数第一行执行。
  • final关键词,在定义类时,表示这个类是最后一个了,不能被继承;定义方法时,表示子类不可以重新定义final方法。
  • 任何类型,都可以用Object声明的名称来参考。
  • ArrayList类,可以不限长度地收集对象。
  • 如果定义类时没有使用extends关键字指向任何类,那一定是继承java.lang.Object。
  • 在Java中,任何类追溯至最上层父类,一定就是java.lang.Object。

代码如下:

  1. package cc.openhome;
  2. import java.util.Scanner;
  3. import static java.lang.System.out;
  4. public class Guest {
  5. public static void main(String[] args) {
  6. ArrayList names=new ArrayList();
  7. collectNameTo(names);
  8. out.println("访客名单:");
  9. printUpperCase(names);
  10. }
  11. static void collectNameTo(ArrayList names){
  12. Scanner console=new Scanner(System.in);
  13. while(true){
  14. out.print("访客名单:");
  15. String name=console.nextLine();
  16. if(name.equals("quit")){
  17. break;
  18. }
  19. names.add(name);
  20. }
  21. }
  22. static void printUpperCase(ArrayList names){
  23. for(int i=0;i<names.size();i++){
  24. String name=(String)names.get(i);
  25. out.println(name.toUpperCase());
  26. }
  27. }
  28. }

结果截图:

6.垃圾收集:

  • 对于不再有用的对象, JVM有垃圾收集机制,收集到的垃圾对象所占据的内存空间,会被垃圾收集器释放。

7.接口:

  • 接口可以用于定义行为但不能操作,直接标示为abstract,而且一定是public。
  • 类要操作接口,必须使用关键词implements关键字。
  • 操作某接口时,对接口中定义的方法有两种处理方式:一是操作接口中定义的方法,二是再度将该方法标示为abstract。
  • 判断语法是否正确时,看“=”号右边是不是拥有左边的行为,或右边对象是不是操作了左边接口(也可使用Cast语法)。
  • 接口可以继承父接口行为,再在子接口中额外定义行为。

代码如下:

  1. package cc.openhome;
  2. public interface Swimmer {
  3. public abstract void swim();
  4. }
  1. package cc.openhome;
  2. public abstract class Fish implements Swimmer{
  3. protected String name;
  4. public Fish(String name){
  5. this.name=name;
  6. }
  7. public String getName(){
  8. return name;
  9. }
  10. @Override
  11. public abstract void swim();
  12. }
  1. package cc.openhome;
  2. public class Human implements Swimmer {
  3. private String name;
  4. public Human(String name){
  5. this.name=name;
  6. }
  7. public String getName(){
  8. return name;
  9. }
  10. @Override
  11. public void swim(){
  12. System.out.printf("人类 %s 游泳%n",name);
  13. }
  14. }
  1. package cc.openhome;
  2. public class Submarine implements Swimmer{
  3. private String name;
  4. public Submarine(String name){
  5. this.name=name;
  6. }
  7. public String getName()
  8. {
  9. return name;
  10. }
  11. @Override
  12. public void swim(){
  13. System.out.printf("潜水艇 %s 潜行%n",name);
  14. }
  15. }
  1. package cc.openhome;
  2. public class Ocean {
  3. public static void main(String[] args) {
  4. doSwim(new Human("贾斯丁"));
  5. doSwim(new Submarine("黄色一号"));
  6. }
  7. static void doSwim(Swimmer swimmer){
  8. swimmer.swim();
  9. }
  10. }

结果截图:

8.接口语法细节:

  • 在Java中,可使用interface来定义抽象的行为与外观。接口中的方法没有操作时,一定是公开且抽象的,也可省略,编译程序会自动帮你加上public abstract。
  • 接口中枚举的常数,一定要使用“=”指定值。
  • 如果有临时继承某个类或操作某个接口并建立实例的需求,而这子类或接口操作类只使用一次,不需要为这些类定义名称,这时可以使用匿名内部类似来解决这个需求。
  • enum语法,可用于定义枚举常数。

代码如下:

  1. package cc.openhome;
  2. public class Client{
  3. public final String ip;
  4. public final String name;
  5. public Client(String ip,String name){
  6. this.ip=ip;
  7. this.name=name;
  8. }
  9. }
  1. package cc.openhome;
  2. public class ClientEvent{
  3. private Client client;
  4. public ClientEvent(Client client){
  5. this.client=client;
  6. }
  7. public String getName(){
  8. return client.name;
  9. }
  10. public String getIp(){
  11. return client.ip;
  12. }
  13. }
  1. package cc.openhome;
  2. public interface ClientListener{
  3. void clientAdded(ClientEvent event);
  4. void clientRemoved(ClientEvent event);
  5. }
  1. package cc.openhome;
  2. import java.util.ArrayList;
  3. public class ClientQueue{
  4. private ArrayList clients=new ArrayList();
  5. private ArrayList listeners=new ArrayList();
  6. public void addClientListener(ClientListener listener){
  7. listeners.add(listener);
  8. }
  9. public void add(Client client){
  10. clients.add(client);
  11. ClientEvent event=new ClientEvent(client);
  12. for(int i=0;i<listeners.size();i++){
  13. ClientListener listener=(ClientListener) listeners.get(i);
  14. listener.clientAdded(event);
  15. }
  16. }
  17. public void remove(Client client){
  18. clients.remove(client);
  19. ClientEvent event=new ClientEvent(client);
  20. for(int i=0;i<listeners.size();i++){
  21. ClientListener listener=(ClientListener) listeners.get(i);
  22. listener.clientRemoved(event);
  23. }
  24. }
  25. }
  1. package cc.openhome;
  2. public class MultiChat{
  3. public static void main(String[] args){
  4. Client c1=new Client("127.0.0.1","Caterpillar");
  5. Client c2=new Client("192.168.0.2","Justin");
  6. ClientQueue queue=new ClientQueue();
  7. queue.addClientListener(new ClientListener(){
  8. @Override
  9. public void clientAdded(ClientEvent event){
  10. System.out.printf("%s cong %s lianji%n",
  11. event.getName(),event.getIp());
  12. }
  13. @Override
  14. public void clientRemoved(ClientEvent event){
  15. System.out.printf("%s cong %s tuoji%n",
  16. event.getName(),event.getIp());
  17. }
  18. });
  19. queue.add(c1);
  20. queue.add(c2);
  21. queue.remove(c1);
  22. queue.remove(c1);
  23. }
  24. }

结果截图:

教材学习中的问题和解决过程

  • 书上P170页对于子类继承抽象类的两种做法不是很理解。解决方法:希望在之后的学习中可以看到相关的代码帮助理解。

代码调试中的问题和解决过程

  • 1.在调试第一个代码时,无法成功,出现如图所示情况:

    查看原因,应是没有将文件放在同一个包下,只是放在了同一个文件夹,所以无法调用同一个包的东西,通这个例子,还解决了之前的一个疑惑,为何package cc.openhome下会有红线,因为没有放到包文件夹下。

  • 2.在编写接口时,出现如下图错误:

  • 3.在运行代码时,出现以下问题:

其他(感悟、思考等,可选)

学习Java已经四周了,很明显的感觉到了Java的优势,继承与多态、接口与多态这些内容,使用户使用时更加方便,也便于编程人员维护。但对于书上一些内容,我理解不够透彻,似懂非懂,还需多多看书,多多敲代码。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 15篇 400小时
第一周 30/30 1/2 20/20
第二周 50/80 1/3 10/30
第三周 130/210 1/4 30/60
第四周 300/510 1/5 30/90

代码托管截图:

参考资料

20145304 Java第四周学习报告的更多相关文章

  1. 20145304 Java第九周学习报告

    20145304<Java程序设计>第九周学习总结 教材学习内容总结 JDBC简介 JDBC全名Java DataBase Connectivity,是Java联机数据库的标准规范.定义了 ...

  2. 20165210 Java第四周学习总结

    20165210 Java第四周学习总结 教材学习内容 第五章学习总结 子类与父类: 子类: class 子类名 extends 父类名 { ... } 类的树形结构 子类的继承性: 子类和父类在同一 ...

  3. 20155327 java第四周学习笔记

    20155327 java第四周学习笔记 五六章知识整理 1子类与父类 父类是接口或者是抽象类,子类必须继承自父类. 2子类的继承性 在Java中,通过关键字extends继承一个已有的类,被继承的类 ...

  4. JAVA 第四周学习总结

    20175303 2018-2019-2 <Java程序设计>第四周学习总结 教材学习内容总结 •用extends来定义一个类的子类. •Object类是所有类的祖先类. •如果子类和父类 ...

  5. 20165326 java第四周学习笔记

    第四周学习笔记 ch5 子类和父类 子类只能有一个父类 使用关键字extendsyclass 子类 extends 父类 系统默认的祖先类Object(java.lang包中) 继承:子类继承父类的方 ...

  6. 2016-2017-2 20155309南皓芯java第四周学习总结

    教材内容总结 这次我们学习的还是两章的内容,学习任务量跟上次比的话大体上来讲是差不多的. 继承与多态 继承 继承也符合DRY(Don't Repeat Yourself)原则 Role role1 = ...

  7. java第四周学习总结

    学号20145336 <Java程序设计>第4周学习总结 教材学习内容总结 继承 继承符合(Don't Repeat Yourself)原则,即在自己的代码中不要重复自己编写的信息,这在多 ...

  8. java第四周学习

    这一周学习的还是面向对象的方法和应用 Java中方法的使用和注意事项 如果没有返回值,就不允许通过return关键字返回结果 方法中不允许嵌套使用 Return返回值只允许返回一个值,不允许返回多个 ...

  9. 201521123093 java 第四周学习总结

    1.平面作业 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 答:1.类与方法的注释 2.super关键字代表的是父类,super.方法表示调用的是父类 2. ...

随机推荐

  1. My97DatePicker日期范围限制

    1.动态时间范围限制: 可以通过系统给出的动态变量,如%y(当前年),%M(当前月)等来限制日期范围,还可以通过{}进行表达式运算,如:{%d+1}:表示明天. 格式 说明 %y  当前年 %M  当 ...

  2. C#的lock关键字

    using System; using System.Threading; namespace Test { class Program { //一.Lock定义 //lock 关键字可以用来确保代码 ...

  3. ASP.NET 客户端静态文件请求设置缓存(Client Cache)

    通常在服务器端大家都已经做了很多缓存的工作,ASP.NET CACHE也好MemeryCache也好却总是忽略了客户端缓存. 因为大家都知道不管哪个client都会缓存已经访问过的站点,但是浏览器缓存 ...

  4. 在线预览Office文件【效果类似百度文库】(转载)

    转载地址:http://www.cnblogs.com/sword-successful/p/4031823.html 引言 结合上个项目和目前做的这个项目,其中都用到了Office文件在线预览,目前 ...

  5. html5 方框内的小球

    html5 方框内的小球 版本一 <!DOCTYPE html> <html> <head lang="en"> <meta charse ...

  6. [JavaCore] 微信手机浏览器版本判断

    公司要做微支付,微信浏览器版本要大于5 package com.garinzhang.web.weixin; import org.apache.commons.lang.StringUtils; i ...

  7. 微软改名部再次大显神威——ASP.NET 5改名ASP.NET Core 1.0

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:在计算机科学领域只有两件难事:缓存不可用和命名.--Phil Karlton 今天,S ...

  8. jsp,图片显示

    问题:jsp中显示项目中image文件夹中的图片 1,项目中image文件夹中有对应的图片 2,<img ,src="/项目名/image/图片名.jpg">,用其他变 ...

  9. WPF中的依赖项属性

    Form cnblogs 桂素伟 随着WPF的推广,不得不重新拾起WPF来,因为这块的产品越来越多. 只能跟着MSDN来学了,所以想是在这里记录下学习的过程和对知识的理解. 先从最基本的吧,依赖项属性 ...

  10. 数据库是.frm,.myd,myi备份如何导入mysql (转)

    今天找了个案例,琢磨了半天,才分析大概出来,数据库是.frm,.myd,myi备份,不会导入mysql,到网上找了些资料,导入成功. 首先说一下这几种文件是干什么的,*.frm是描述了表的结构,*.M ...