黑马程序员——面向对象---继承

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

1.什么是继承

把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系,
   这多个类就具备了这些内容。这个关系叫继承。

2.Java中如何表示继承呢?格式是什么呢?

    A:用关键字extends表示
    B:格式:
        class 子类名 extends 父类名 {}
/*
  继承由来
    多个类中,出现了相同的成员,代码重复就很高
    以下程序代码重复过多,将相同的内容抽取来,形成另外的一个类,人类
    让老师类,和学生类,都是使用人类中的成员,减少代码

    老师类和学生类都使用人类中的成员,类与类之间产生关系才行
    继承关系  extends

    //class Teacher extends Person
    老师类,继承自人类
    Teacher类,成为是Person的孩子,子类
    Person类,成为是Teacher的父亲,父类,超类,基类

    子类就可以直接使用父类的成员,不是全部

    继承好处:
      代码少了,减少编写量
      子类可以扩展父类的功能
      继承使类与类产生了关系,有了这个关系导致了面向对象第三个特征多态
*/

//共性抽取出一个类 ,人类
class Person
{
    String name;
    int age;
    public void eat(){}
}
class Teacher extends Person
{
    public void teacher(){}
}

class Student extends Person
{
    public void study(){}
}

class ExtendsDemo 
{
    public static void main(String[] args) 
    {
        Teacher t = new Teacher();
        System.out.println(t.name);
    }
}

3.继承的好处:

    A:提高了代码的复用性
    B:提高了代码的维护性
    C:让类与类产生了一个关系,是多态的前提

4.继承的弊端:

    A:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类。
        原则:低耦合,高内聚。
        耦合:类与类的关系
        内聚:自己完成某件事情的能力
    B:打破了封装性

5.Java中继承的特点

    A:Java中类只支持单继承
/*
  java中继承特点
   class Demo{}
   class Demo1 extends Demo{} 
   class Demo2 extends Demo{}
   单继承,一个类只能同时继承一个父类,不能同时继承多个类
   一个孩子,父亲只能有一个
   一个父类,可以有多个子类

   单继承为什么要这样设计:避免程序的安全问题
   如果多继承,父类中出现了相同方法,子类中不能判断调用的是谁
   Java设计的时候,取消了多继承
*/
class Fu
{
    public void show(){
       System.out.println("fu...show");
    }
}
class Fu2
{
    public void show(){
       System.out.println("fu2...show");
    }
}
class Zi extends Fu
{
}
class Zi2 extends Fu
{
}

class ExtendsDemo1 
{
    public static void main(String[] args) 
    {
        new Zi2().show();
        //System.out.println("Hello World!");
    }
}
    B:Java中可以多层(重)继承(继承体系)
/*
  java中继承特点,多层继承,多重继承,不等于多继承
  类和类之间可以进行层层继承

  A 是 B的父类,B是C的父类 C是D的父类

  父类是子类共性抽取出来的,A类是整个4个类中,最共性的类
*/
class A
{
    public void show(){}
}
class B extends A
{
    public void b(){}
}
class C extends B
{
}
class D extends C
{
}
class ExtendsDemo2 
{
    public static void main(String[] args) 
    {
        new D().show();
        System.out.println("Hello World!");
    }
}

6.继承的注意事项:

    A:子类不能继承父类的私有成员
    B:子类不能继承父类的构造方法,但是可以通过super去访问
    C:不要为了部分功能而去继承

7.什么时候使用继承呢?

    A:继承体现的是:is a的关系。
    B:采用假设法

8.Java继承中的成员关系

    A:成员变量
        a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单
        b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢?
            子类的方法访问变量的查找顺序:
                在子类方法的局部范围找,有就使用。
                在子类的成员范围找,有就使用。
                在父类的成员范围找,有就使用。
                找不到,就报错。
    B:构造方法
        a:子类的构造方法默认会去访问父类的无参构造方法
            是为了子类访问父类数据的初始化
        b:父类中如果没有无参构造方法,怎么办?
            子类通过super去明确调用带参构造
            子类通过this调用本身的其他构造,但是一定会有一个去访问了父类的构造
            让父类提供无参构造
    C:成员方法
        a:子类的成员方法和父类中的成员方法名称不一样,这个太简单
        b:子类的成员方法和父类中的成员方法名称一样,这个怎么访问呢?
            通过子类对象访问一个方法的查找顺序:
                在子类中找,有就使用
                在父类中找,有就使用
                找不到,就报错

9.注意:

    A:Override和Overload的区别?Overload是否可以改变返回值类型?
      方法重写:
        在子类中出现了和父类一模一样的方法声明的现象。
      方法重载:
        在同一个类中出现的方法名相同,方法参数列表不同的现象。
        方法重载能改变返回值类型,因为它和返回值类型无关。
      Override:方法重写
      Overload:方法重载 

    B:this和super的区别和各自的作用?
      this:当前类的对象的引用
      super:代表父类存储空间的标识(也可以理解为父类的引用,通过这个东西可以仿佛父类的成员)。

10.案例:

    学生和老师案例
/*
  学生类和老师类
    共性,抽取形成一个父类,父类中的成员变量,私有的

    代码.
*/
//将老师和学生类的共性抽取,一个父类
class Person
{
    private String name;
    private int age;

    public void setName(String name){this.name = name;}
    public void setAge(int age){this.age = age;}
    public String getName(){return name;}
    public int getAge(){return age;}
}
//定义老师类,姓名,年龄,上课方法
class Teacher extends Person
{
    public void teacher(){
        //老师的上课方法,输出姓名和年龄
        System.out.println(getName()+getAge());
    }
}

//定义学生类,姓名,年龄,学习方法
class Student extends Person
{
    public void study(){
        //学生的学习方法,输出姓名和年龄
        System.out.println(getName()+getAge());
    }
}

class ExtendsTest1 
{
    public static void main(String[] args) 
    {
        //创建老师类和学生类对象
        Teacher t = new Teacher();
        Student s = new Student();
        //调用对象set方法赋值
        t.setName("张三");
        t.setAge(20);

        s.setName("李四");
        s.setAge(18);

        t.teacher();
        s.study();
    }
}

你可能感兴趣的:(extends)