一、继承(Inheritance)属性和行为:通过一个已有的类来创建一个新的类,新类继承了已有类的属性和行为,这种方式称为继承。新的类叫做子类,已有被扩展的类叫做父类。一个类使用关键字extends继承其他类,关键字extends出现在类声明时的类名后,extends后面跟着的是要继承的类的名称,extends实现了继承。在Java中的类只能继承一个类。
下面是举例说明:
1、父类
public class A {
final String name="A";
void A1(){
System.out.println("wo shi fu lei !");
}
}
2、子类
public class AA extends A {
String name = "AA";
void AA1() {
System.out.println("wo shi zi lei !");
}
public static void main(String[] args) {
A a = new AA();
System.out.println(a.name);
AA aa = new AA();
System.out.println(aa.name);
}
}
输出结果
A
AA
父类和子类中均定义了
name属性,同样实例化子类,
a是父类引用
aa是子类引用
定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。
怎么使用子类强大的功能呢?就是子类重写父类定义的方法,然后自己在扩展
所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;
同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;
public static void main(String[] args) {
A a = new AA();
System.out.println(a.name);
a.A1();
AA aa = new AA();
System.out.println(aa.name);
aa.A1();
aa.AA1();
}
A1方法在A中,A的子类AA没有重写A1方法,所以,可以访问a可以访问A1。
对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。
public class A {
final String name="A";
void A1(){
System.out.println("A A1()");
}
}
public class AA extends A{
String name="AA";
void AA1(){
System.out.println("AA AA1()");
}
@Override
void A1() {
// TODO Auto-generated method stub
//super.A1();
System.out.println("AA A1()");
}
public static void main(String[] args) {
A a = new AA();
System.out.println(a.name);
a.A1();
}
}
输出结果
A
AA A1()
没有执行父类的A1,如果要执行父类的A1,则需要
super.A1();
这正是我们需要的。
一个简单的例子
1、创建一个动物的父类,
abstract public class Animal {
abstract void run();
public void stop() {
System.out.println("ting");
}
}
2、cat类
public class Cat extends Animal {
@Override
void run() {
System.out.println("Cat run()");
}
@Override
public void stop() {
System.out.println("Cat stop()");
}
}
3、dog类
public class Dog extends Animal {
@Override
void run() {
System.out.println("Dog run()");
}
@Override
public void stop() {
System.out.println("Dog stop");
}
}
4、测试类
public class Test extends TestCase {
public void testAnimal() {
Animal ss = new Cat();
ss.run();
ss.stop();
Animal br = new Dog();
br.run();
br.stop();
}
}