A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangjijin 中级黑马   /  2014-7-4 08:47  /  1164 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


1)        生活中的继承
a)        生活中,继承的例子随处可见

b)        分析生活中的继承:
1.        谁是父类?
2.        谁是子类?
3.        能说出继承的特点吗?
c)        分析:
1.        兔子和羊都是食草动物,它们都具有食草动物的基本特征和行为。如果把食草动物称为父类,兔子和羊就是食草动物的子类。
2.        由于豹子和狮子都具有食肉动物的基本特征和行为,可以说豹子和狮子都是食肉动物的子类
3.        食草动物和食肉动物都具有动物的基本特征和行为,所以它们都是动物的子类,而动物是它们的父类
4.        兔子的直接父类是食草动物,间接父类是动物
5.        动物、食草动物、兔子形成了一个继承树分支
d)        在上面的继承树分支中:
1.        位于下层的子类会继承上层所有直接或间接父类的特征和行为
2.        如果两个类不在同一个继承分支上,就不会存在继承关系
e)        继承特点:
1.        父类更通用、子类更具体
a)        父类具有更一般的特征和行为,而子类除了具有父类的特征和行为,还具有自己特殊的特征和行为
2.        继承需要符合的关系:is-a
a)        比如:兔子是食草动物,满足is-a的关系
b)        兔子不是老虎,所以兔子和老虎不存在继承关系
f)        再分析以下示例:

g)        请问:出租车包含哪些属性和行为呢?
1.        出租车是汽车的子类,继承了父类的属性和行为,又具有自身特殊的属性和行为,所以出租车有4个属性和3种行为
a)        属性:所属公司、最大载客数量、引擎数量、外观颜色
b)        行为:打发票、刹车、加速
h)        需要注意的是:
1.        在继承的表述中,父类和子类、超类和子类、基类和派生类,表达的意思是一样的。
2)        什么是继承
a)        概念
1.        提供子类可以沿用父类的某些行为和特征的一种方式。
b)        在程序中使用继承,有利于程序的扩展
c)        在Java程序中为什么需要继承呢
d)        通过以下示例进行分析
1.        建立一个Person类,其中Person分为:教师,学生,要求如下:
a)        Teacher类的属性:name,address;方法:sayHai
b)        Student类的属性:name,address;方法: sayHai
e)        代码示例:

f)        以上代码中:代码存在重复,违背了“write once, only once”的原则
1.        即没有做到代码只在一个地方写一次的原则
g)        如何改进?有没有可能建立继承关系,让子类自动继承父类的属性和方法?
h)        而继承就是将程序中共同的特征和行为抽取出来建立一个新的类,使其他类可以沿用此类中的属性和方法。
i)        这样不仅可以减少程序中的重复代码,而且易于程序扩展
                        以下就来实现继承
3)        如何实现继承
a)        分析两个类的特点:

b)        将所有子类中相同的代码都抽取到父类(Person类)中,代码如下:
public class NewPerson {
        private String name;
        private String address;
        public NewPerson(String name, String address) {
                this.name = name;
                this.address = address;
        }
        public void sayHai() {
                System.out.println("hello!我是来自于:" + address + "的" + name);
        }
}
c)        在子类中,使用继承,可以有效实现代码复用
d)        子类自动继承父类的属性和方法,子类中不再存在重复代码
1.        代码示例如下:
class Teacher extends NewPerson {
        public Teacher(String name, String address) {
                super(name, address);
        }
        public void sayHai() {
                super.sayHai();
                System.out.println("我的工作是教学工作!");
        }
}
class Student extends NewPerson {
        public Student(String name, String address) {
                super(name, address);
        }
        public void sayHai() {
                super.sayHai();
                System.out.println("我的工作是学习知识!");
        }
}
e)        在Java语言中,用extends关键字来表示一个类继承了另一个类
f)        在父类中只定义一些通用的属性与方法
g)        子类自动继承父类的属性和方法,子类中可以定义子类特有的属性和方法
4)        继承的特点
a)        继承具有单根性:即一个子类不允许有多个父类
b)        在实现时:extends关键字后面不允许有两个类的名字
c)        例如:虽然门也实现了报警器的功能,但是门不是报警器:即:门的主要功能不是报警。

d)        继承具有传递性,即一个类可以即是某个类的子类,同时又是另一个类的父类

e)        代码示例:
/*
* Person类
*/
class Person07 {
        public int age;
        public String sex;
}
// Man是Person的子类,同时又是Father的父类
class Man extends Person07 {
        public boolean marrired;
}
/*
* Father类
*/
class Father extends Man {
        public String address;

        public void getInfo() {
                System.out.println("this is a father");
        }
}
5)        一切的类的“祖先”——Object
a)        在Java 中,所有的Java类都直接或间接地继承了java.lang.Object类
b)        定义一个类时,如果没有使用extends关键字,那么该类实际上隐式继承了Object


c)        Object类

6)        继承中父子类关系
a)        父类的引用可以指向子类的对象
b)        父类对象不能够强制类型转换成子类对象;子类的对象可以转换成父类的对象
/*
* Person类
*/
class Person08 {
        public String name = "person";
        public void printInfo() {
                System.out.println("this is a person");
        }
}
/*
* 子类
*/
public class Child08 extends Person08 {
        public void printInfo() {
                System.out.println("this is a child");
        }
        public static void main(String args[]) {
                Person08 person = new Child08(); // 父类引用指向子类对象
// 调用子类中的方法,因为是子类的对象,所以调用的是子类的方法,
//但在父类中必须定义这个方法
                person.printInfo();
//父类对象不能够强制类型转换成子类对象
                // Child child = (Child)new Person();
        }
}
7)        小结
a)        在继承关系中,父类更通用、子类更具体
b)        父类具有更一般的特征和行为。而子类除了具有父类的特征和行为,还具有一些自己特殊的特征和行为
c)        在继承关系中,父类和子类需要满足is-a 的关系
d)        使用继承可以有效实现代码复用
e)        如果在子类中定义的一个方法,其名称、返回类型及参数列表正好与父类中的某个方法的名称、返回类型及参数列表相匹配,那么就说明:子类的方法重写了父类的方法。
f)        编程:
1.        请编码实现动物世界的继承关系:
a)        动物(Animal)具有行为:吃(eat)、睡觉(sleep)
b)        动物包括:兔子(Rabbit),老虎(Tiger)
c)        这些动物吃的行为各不相同(兔子吃草,老虎吃肉);但睡觉的行为是一致的
2.        请通过继承实现以上需求,并编写测试类AnimalTest进行测试
g)        代码示例:
public class AnimalTest {
        public static void main(String[] args) {
                // 创建兔子对象
                Animal a1 = new Rabbit();
                a1.eat();
                // 创建老虎对象
                Animal a2 = new Tiger();
                a2.eat();
        }
}
/*
* 动物类
*/
class Animal {
        public void eat() {
                System.out.println("动物在吃东西!");
        }
}
// 兔子类
class Rabbit extends Animal {
        public void eat() {
                System.out.println("兔子吃草!");
        }
}
// 老虎类
class Tiger extends Animal {
        public void eat() {
                System.out.println("老虎吃肉!");
        }
}

8)        final关键字
a)        在Java中final是修饰符,可以修饰类、方法和属性
b)        final修饰的类是终态类,其修饰方法为最终方法,final修饰的变量是常量
c)        终态类不能被继承,最终方法不能被重写(下一讲讲解),常量必须赋初值同时不允许被修改
d)        用final修饰常量必须赋初值,且不可以重新赋值
final class Base {
        /*
         * 常量必须赋初值,且不可以重新赋值
         */
        public final int age;
        public void getInfo() {
                System.out.println("这是父类");
        }
}
/*
* 类型 Student 不能成为终态类 Base 的子类
*/
class Student extends Base {
        private String name;
}
public class Demo008 {
        public static void main(String[] args) {
        }
}
9)        super与this关键字
a)        在继承关系中super和this是两个经常使用的关键字
1.        this:表示当前对象本身的引用
2.        super:表示对父类或者超类的引用
b)        如果子类中定义了与父类中同名的属性和方法,此时要调用子类中的属性和方法需使用this,要调用父类中的属性和方法需使用super
c)        代码示例:
class Person09 {
        public String name = "张三";
        public int age = 0;
}

public class Child09 extends Person09 {
        public String sex;
        public int age = 2;
        /*
         * 用super访问父类对象
         * 用this访问本类对象
         */
        public void getInfo() {
                System.out.println("父类中的年龄是: " + super.age);
                System.out.println("本类中的年龄是: " + this.age);
        }
        public static void main(String args[]) {
                Child09 child = new Child09();
                child.getInfo();
        }
}
d)        输出结果:

e)        在使用 super和this时我们需要注意以下4个方面
1.        每个子类构造方法中首先会隐含地调用super(),然后执行自身构造方法中的代码
2.        super()和this()均需放在构造方法内第一行
3.        this和super不能同时出现在一个构造函数中
4.        this()和super()均不可以在static环境中使用。包括static方法、static语句块

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马