继承作为面向对象的第二大特征,基本上就是避免多个类间重复定义共同行为。即当多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承单独的那个类即可。从而简化了程序,并且减少了冲突错误。 在Java中,通过extends关键字让类与类之间产生继承关系。子类可以直接访问父类中的非私有的属性和行为,而对于private成员也会被继承,只不过子类无法直接存取,必须通过父类提供的方法来存取 继承的特点:继承的出现提高了代码的复用性,也让类与类之间产生了关系,提供了多态的前提。
在Java中,继承时使用extends关键字,private成员也会被继承,只不过子类无法直接存取,必须通过父类提供的方法来存取(如果父类愿意提供访问方法的话)。如下面这个例子:
public class RPG1
{
public static void main(String[] args)
{
demoSwordsMan1();
demoMagician1();
}
static void demoSwordsMan1()
{
SwordsMan1 swordsMan1 = new SwordsMan1();
swordsMan1.setName("Justin");
swordsMan1.setLevel(1);
swordsMan1.setBlood(200);
System.out.printf("剑士:(%s,%d,%d)%n",swordsMan1.getName(),swordsMan1.getLevel(),swordsMan1.getBlood());
}
static void demoMagician1()
{
Magician1 magician1 = new Magician1();
magician1.setName("Monica");
magician1.setLevel(1);
magician1.setBlood(100);
System.out.printf("魔法师:(%s,%d,%d)%n",magician1.getName(),magician1.getLevel(),magician1.getBlood());
}
}
继承的好处:若你要将name、level、blood改为其他名称,那就只要修改Role.java就可以了,只要是继承Role的子类都无须修改。
在Java中,子类只能继承一个父类,继承有个重要的关系,就是子类与父类间会有is-a的关系,中文称为“是一种”的关系。
父类:
public class Role3
{
...
public void fight()
{
//子类要重新定义fight的实际行为
}
}
子类:
public class SwordsMan3 extends Role3
{
public void fight()
{
System.out.println("挥剑攻击");
}
}
如果某方法区块中真的没有任何程序中代码操作,可以使用abstract标示该方法为抽象方法,该方法不用撰写{}区块,直接“;”结束即可。
子类如果继承抽象类,对于抽象方法有两种做法: 一种做法是继续标示该方法为abstract;另一种做法就是操作抽象方法。
protected成员:被声明为protected的成员,相同包中的类可以直接存取,不同包中的类可以在继承后的子类直接存取。例如下面的例子:假如只想让子类可以直接存取name、level、与blood,就可以定义他们为protected。
如果想取得父类中的方法定义,可以在调用方法前,加上super关键字,重新定义的时候要注意,对于父类中的方法权限,只能扩大不能缩小。如果想执行父类中某构造函数,可以使用super()指定,但要注意的是,this()和super()只能选择其中之一调用,并且一定要在构造函数第一行执行。 如果class前使用了final关键字定义,那么表示这个类是最后一个,不会再有子类,即不能被继承。如果定义类时没有使用extends关键字指定继承任何类,那一定是继承java.lang.Object,在Java中,最上层的父类就是java.lang.Object。
在Java中,如果想取得父类中的方法定义,可以在调用方法前,加上super关键字。如:
public class SwordsMan6 extends Role6
{
...
@Override
public String toString()
{
return "剑士" + super.toString();
}
}
public abstract class Fish1 implements Swimmer1
{
protected String name;
public Fish1(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
@Override
public abstract void swim();
}
public class Seaplane3 implements Swimmer1,Flyer3
{
private String name;
public Seaplane3(String name)
{
this.name = name;
}
@Override
{
System.out.printf("海上飞机 %s 在飞%n",name);
}
@Override
public void swim()
{
System.out.printf("海上飞机 %s 航行海绵%n",name);
}
}
public class FlyingFish3 extends Fish1 implements Flyer3
{
public FlyingFish3(String name)
{
super(name);
}
@Override
public void swim()
{
System.out.println("飞鱼游泳");
}
@Override
public void fly()
{
System.out.println("飞鱼会飞");
}
}
import static java.lang.System.out;
public class EnumGame
{
public static void main(String[] args)
{
play(EnumAction.RIGHT);
play(EnumAction.UP);
}
public static void play(EnumAction 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;
}
}
}
问题: 运行代码时出现下面这一问题
解决方法: 发现没有对Scanner这一变量进行定义,import之后成功运行。
我慢慢的感觉学习Java已经变成了每天的一项日常,会不知不觉的在空闲的时候学习一会Java,慢慢的也体会到了Java的乐趣,我相信我会带着这种乐趣一直坚持下去。
代码行数(新增/积累) | 博客量(新增/积累 | 学习时间(新增/累积) | |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
第一周 | 16/16 | 1/1 | 8/8 |
第二周 | 120/120 | 2/2 | 12/12 |
第三周 | 130/150 | 1/1 | 9/9 |
第四周 | 180/200 | 1/1 | 15/15 |
20155208徐子涵 2016-2017-2 《Java程序设计》第4周学习总结
原文:http://www.cnblogs.com/xuzihan/p/6582952.html