《Java程序设计》第4周学习总结
20145318 《Java程序设计》第4周学习总结
教材学习内容总结
继承与多态
继承
- 继承避免多个类间重复定义共同行为。即当多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承单独的那个类即可。我们也把单独抽取出来的那个类称为父类,其他的多个类称为子类。
在Java中,通过extends关键字让类与类之间产生继承关系。
public class SwordsMan extends Role
{
public void fight()
{
System.out.println("挥剑攻击");
}
}
- SwordsMan是子类,Role就是父类。
- 子类可以直接访问父类中的非私有的属性和行为,而对于private成员也会被继承,只不过子类无法直接存取,必须通过父类提供的方法来存取(如果父类愿意提供方法的话)。
- 定义继承需要注意:类与类之间要有所属( "is a" )关系,以前面范例来说,SwordsMan继承了Role,所以SwordsMan is a Role。例如Role role=new SwordsMan();可以编译,
而SwordsMan swordsMan= new Role();是不行的,没有搞清楚谁是谁的父类。 - Java只支持单继承,不支持多继承。一个类只能有一个父类,不可以有多个父类。
重新定义行为
在继承父类之后,定义与父类中相同的方法部署,但执行内容不同,这称为重新定义。
public class Magician extends Role3
{
public void fight()
{
System.out.println("魔法攻击");
}
}
抽象方法、抽象类
- 抽象类:Java中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。
- 抽象方法的由来:多个对象都具备相同的功能,但是功能具体内容有所不同,那么在抽取过程中,只抽取了功能定义,并未抽取功能主体,那么只有功能声明,没有功能主体的方法称为抽象方法。
- 抽象类和抽象方法必须用abstract关键字来修饰。
继承语法
protected成员
public class SwordsMan5 extends Role5
{
public void fight()
{
System.out.println("挥剑攻击");
}
public String toString()
{
return String.format("剑士 (%s, %d %d)",this.name,this.level,this.blood);
}
重新定义
对于父类中的方法权限,只能扩大但不能缩小。若原来成员public,子类中重新定义时不可为private或protected。
public abstract class Role6
{
public String toString()
{
return String.format("(%s, %d, %d)",this.name,this.level,this.blood);
}
}
final
- final可以修饰类,方法,变量。
- final修饰的类不可以被继承。final修饰的方法不可以被覆盖。
- final修饰的变量是一个常量,只能被赋值一次。
- 内部类只能访问被final修饰的局部变量。
java.lang.Object
-
在Java中,子类只能继承一个父类,如果定义类时没有使用extends关键字指定继承任何类,那一定是继承java.lang.Object。
-
操作接口会有“拥有行为”关系,而继承是“是一种”的关系,对于接口多态语法的判断,方式是“右边是不是拥有左边的行为”,或者“右边对象是不是操作了左边接口”。
-
类可以操作两个以上的类,可以同时继承某个类,并操作某些接口,接口的出现将“多继承”通过另一种形式体现出来,即“多实现”。
接口语法
-
使用interface来定义抽象的行为外观,方法要声明为public abstract,无须且不能有操作。为了方便,也可以省略public abstract,编译程序会协助补齐。可以使用接口枚举常数,只能定义为public static final。为了方便,也可以省略public static final。
-
接口可以继承别的接口,也可以同时继承两个以上的接口,也是使用extends关键字。
-
enum语法可用于定义枚举常数,enum实际上定义了类,而enum中列举的常数实际上是public static final,无法撰写程序直接实例化枚举类型,因为构造函数权限设定为private,只有类中才可以实例化。
接口与多态
接口
接口定义行为
接口的出现将“多继承”通过另一种形式体现出来,即 “多实现”。
接口是程序的功能扩展。
接口可以用来多实现。
类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口。
接口与接口之间可以有继承关系。
public interface Swimmer
{
public abstract void swim();
}
行为的多态
public class Ocean{
public static void main(String[] args)
{
doSwim(new Anemonsfish("尼莫"));
doSwim(new Shark("兰尼"));
doSwim(new Human("贾斯汀"));
doSwim(new Submarine("黄色一号"));
}
static void doSwim(Swimmer swimmer){
swimmer.swim();
}
}
解决需求变化
写程序时,如果增加新的需求,可使原有的程序无需修改,只针对新需求撰写程序。
public interface Flyer
{
public abstract void fly();
}
代码调试中的问题和解决过程
import static java.lang.System.out;
public class Game2{
public static void main(String[] args){
play(Action.RIGHT);
play(Action.UP);
}
public static void play(Action action){
switch(action){
case STOP:
out.println("播放停止动画");
break;
case RIGHT:
out.println("播放向右动画");
break;
case LEFT:
out.println("播放向左动画");
break;
case UP:
out.println("播放向上动画");
break;
case DOWN:
out.println("播放向下动画");
break;
}
}
}
public class Multichat{
public static void main(String[] args){
Client c1=new Client("127.0.0.1","Caterpillar");
Client c1=new Client("192.168.0.2","Justin");
ClientQueue queue=new ClientQueue();
queue.addClientListener(new ClientListener(){
@Override
public void clientAdded(ClientEvent event){
System.out.printf("%s cong %s lianji%n",
event.getGame(),event.getIp());
}
@Override
public void clientRemoved(ClientEvent event){
System.out.printf("%s cong %s tuoji%n",
event.getGame(),event.getIp());
}
}
);
queue.add(c1);
queue.add(c2);
queue.remove(c1);
queue.remove(c1);
}
}
本周代码托管截图
其他(感悟、思考等,可选)
这周学习进度非常紧,内容比较多比较难于理解,加上计算机二级考试的复习和其他科目逐渐加大难度,感觉时间有些不够用。
学习进度条
参考资料
posted on 2016-03-27 23:31 20145318赵一 阅读(136) 评论(1) 编辑 收藏 举报