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

教材学习内容总结

封装、继承、多态

封装:封装类私有数据,让用户无法直接存取。
继承:

定义:避免多个类间重复定义共同行为,就是相同的代码提升为父类,java中只能继承一个父类。用继承的方式编写代码可以提高代码的弹性。

关键字extends:j继承父类的行为并扩充原本没有的行为。

语法细节:protected:用protected定义的成员,相同包中的类可以直接存取,不同包中的类可以在继承后的子类中直接存取。

java中所有对象一定“是一种”object。如果定义类没有使用extends关键字指定继承任何类,那么一定是继承java.lang.Object。

权限(由小到大):private ->无关键字 ->protected ->public。

多态:

is-a:子类与父类之间是is-a(是一种)关系,编写代码时可以使用is-a检查语法的逻辑是否正确:从=右边往左读,看右边是不是左边的子类。当右边不是左边的子类的时候,程序编译错误,也可能存在检查为右边可能是左边子类的不确定的结果,这时可以执行(Cast)叫程序住嘴语法,错误时抛出ClassCastException.

多态:单一接口操作多种类型的对象。

关系:

封装私有数据使用户不能直接存取,程序代码的相同代码可以定义在父类中,子类可以继承使用,一个父类中的同一个操作接口可能有多个子类使用,子类中的操作内容可以待到父类中调用,同一操作接口操作多个操作内容,称为多态。

重新定义

定义:

在继承父类之后,定义与父类中相同的部署,但是执行的内容不同,操作接口相同,只是方法操作内容不同。

super:

想取得父类中的方法定义,可以在调用方法前,加上super关键字,使用它调用的父类方法不能定义为private。

  • 注意:重新定义对于父类中的方法权限,只能扩大不能缩小,并且其他部分必须与父类中方法签署完全一致。

抽象类与接口

抽象类

1.方法区块中没有任何程序代码操作,使用abstract标示该方法为抽象方法,,类中若有方法没有操作,并且标示为abstract,表示类定义不完整,称为抽象类。

2.java中可以使用interface来定义抽象的行为和外观。

3.子类继承抽象类的两种做法:继续标示该方法或者操作抽象方法。

4.为了工作的合理和编写的方便,写程序是可以先创建实例,然后执行go()方法过程中调用抽象方法。

接口

1.implements关键字:类要操作接口,必须使用implements关键字。

  1. 接口定义方法:操作接口定义的方法或者将该方法标示为abstract.

3.类可以操作两个以上的接口。

4.语法细节:接口的方法没有操作时,一定得是公开且抽象,为方便可省略public abstract.

final关键字

  1. 定义:限定不想再改变的指定变量值,如果被声明的final没有明确用=指定值,表示延迟对象成员指定。

2.class前用final关键字定义,表示这个类是最后一个了,不再有子类也不能被继承。

equals()

1.equals()方法是Object类有定义的方法,程序代码:

    `public boolean equals(Object obj){

     return (this==obj);
      }`

2.instanceof运算符:判断对象是否由某个类创建,左操作数是对象,右操作数十类。

enum枚举常数

enum可用于定义枚举常数。enum定义了特殊类,继承自java.lang.Enum,由编译程序处理,直接撰写会被拒绝。

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

问题一:

重新定义的意义是什么,既然在父类中定义了操作接口,还需要在子类中定义操作内容,也就是说父类中不定义操作接口,子类中直接定义也可以执行,那么为什么还要在父类中定义呢,这不是与代码实行继承的初衷违背了吗?
解决:没有什么比较清楚的解释,大致书上的意思可能只是说可以把它提上去,没说必须把它提上去。

问题二:

在编译教材P187页Inheritance ConsoleGame.java时因为误把return scanner.nextInt();写成了return Scanner.nextInt();导致编译错误,但是之前说加上@override就不用担心打错字的问题,这是为什么呢?
解释:大致应该跟偷懒是一种,他只是对比之前能读懂那种常见的书写错误,但scanner是关键字,大小写区分不考虑为打错字的范围。

问题三:

编译错误和执行错误到底是什么区别,怎么判断,弄不清。
解决:编译错误差不多就是语法不对,比如你写String str='str'编译就会出错。运行错误是指语法没问题,当时逻辑错误,比如一个方法传进一个String类型的变量str,方法体中有类似于str.equals("str");的语句,但是传进的是一个null,那么这一句就相当于null.equals("str");这肯定会抛空指针异常。

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

1.

错误:java:找不到符号
类型:SwordsMan()
错误:package jdy.cls

解决:上周的问题又犯了,对文件进行了打包,把编译生成的文件和.java文件分类存放了,使得程序调用时找不到相应的文件。

2.
  	`public class MultiChat {
    public static void main(String[] args) {
    Client c1=new Client ("127.0.0.1","Caterpillar");
    Client c2=new Client ("193.168.0.2","Justin");

    	ClientQueue queue=new ClientQueue();
    queue.addClientListener(new ClientListener(){
        @Override
        public void clientAdded(ClientEvent event){
            System.out.printf("%s 从 %s 联机%n",
                    event.getName(),event.getIp());
        }
        @Override
        public void clientRemoved(ClientEvent event){
            System.out.printf("%s 从 %s 脱机%n",
                    event.getName(),event.getIp());
        }
    });
    queue.add(c1);
    queue.add(c2);
    queue.remove(c1);
    queue.remove(c2);
}
}

`
错误:(10, 14) java: 找不到符号
符号: 方法 addClientListener(<匿名ClientListener>)
位置: 类型为ClientQueue的变量 queue

解决:还是大小写啊

3.
import java.util.Scanner;
public class ConsoleGame extends GuessGame {
private Scanner scanner=new Scanner (System.in);

@Override
public void print(String text){
    System.out.print(text);
}
@Override
public void println(String text){
    System.out.println(text);
}
@Override
public int nextInt() {
    return Scanner.nextInt();
}
}
 错误:java: 无法从静态上下文中引用非静态 方法 nextInt()
 解决:把return canner.nextInt();改成return sScanner.nextInt(); Scanner是一种方法,对输入的数扫描的动作,而scanner是对输出的数显示。

本周代码托管截图



学习感悟

之前一直就觉得java是一门理论学习可,但是现在越来越感觉到这是一门语言,就像和韩国人讲韩语一样,我们也是通过java语言和计算机进行交流,把自己的思想通过代码告诉计算机,计算机也会像人一样工作,掌握好java语言,可以让我们的思想得以具体实现。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 50/50 2/2 20/20 实现“HelloWorld”
第二周 100/150 2/4 20/20 学会用IDEA编写代码
第三周 100/250 2/6 20/20 掌握更多的语法知识
第四周 150/400 2/8 20/20 学会用Git托管代码

参考资料

  • [Java学习笔记(第8版
  • [《Java学习笔记(第8版)》学习指导]
posted @ 2016-03-27 20:55  20145329吉东云  阅读(200)  评论(4编辑  收藏  举报