zoukankan      html  css  js  c++  java
  • Java继承

    1.1 类与类之间的关系

    A:继承(extends)

    * 让类与类之间产生关系,子父类关系

    * 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

    特点:子类具有父类的所有属性和方法,并拥有自己的独有的属性和行为。

    B:继承案例演示:

    * 动物类,猫类,狗类

    * 定义两个属性(颜色,腿的个数)两个功能(吃饭,睡觉)

    代码:

    public class Demo1_extends {
    public static void main(String[] args) {
    Dog dog = new Dog();
    dog.eat();
    dog.sleep();
    }
    }

    /**
    * 1.创建动物类,也就是父类
    * 2.属性:动物的颜色,腿的的个数
    * 3. 方法:吃饭,睡觉
    */
    class Animal{
    String color;
    int leg;

    public void eat(){
    System.out.println("正在吃");
    }

    public void sleep(){
    System.out.println("睡觉");
    }
    }


    class Cat extends Animal{

    }

    class Dog extends Animal {

    }

    1.2继承的类型

    Java不支持多继承,但是支持多重继承

    继承的特性:

      1.子类拥有父类非private的成员属性、成员方法(不继承父类的构造方法)。

       2.子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。

       3.子类可以用自己的方式实现父类的方法。

      4.Java 的继承是单继承,但是可以多重继承。

      5.提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密, 代码独立性越差)。

    1.2继承的好处与弊端

    * A:继承的好处

    * a:提高了代码的复用性

    * b:提高了代码的维护性

    * c:让类与类之间产生了关系,是多态的前提

    * B:继承的弊端

      * 类的耦合性增强了。

      * 开发的原则:高内聚,低耦合。

      * 耦合:类与类的关系

      * 内聚:就是自己完成某件事情的能力

    1.3 Java中类的继承特点

    * A:Java中类的继承特点

    * a:Java只支持单继承,不支持多继承。(一个儿子只能有一个爹)

    * 有些语言是支持多继承,格式:extends 类1,类2,...

    * b:Java支持多层继承(继承体系)

    * B:案例演示

    * Java中类的继承特点

    * 如果想用这个体系的所有功能用最底层的类创建对象

    * 如果想看这个体系的共性功能,看最顶层的类

    代码:

    
    
    public class Demo2_extends {
    public static void main(String[] args) {
    Demo3 demo3 = new Demo3();
    demo3.print();
    demo3.method();
    demo3.show();
    System.out.println("----------------------");

    Demo1 demo1 = new Demo1();
    demo1.show();

    }
    }
    class Demo1 {
    public void show(){
    System.out.println("Demo1");
    }
    }

    class Demo2 extends Demo1{
    public void method(){
    System.out.println("Demo2");
    }
    }

    class Demo3 extends Demo2{ // 包含了最多功能
    public void print(){
    System.out.println("Demo3");
    }
    }
    
    

    1.4 Java中继承的注意事项

    * A:继承的注意事项

    * a:子类只能继承父类所有非私有的成员(成员方法和成员变量)

    * b:子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法。

    * c:不要为了部分功能而去继承

    * 项目经理 姓名 工号 工资 奖金

    * 程序员 姓名 工号 工资

    * B:什么时候使用继承

    * 继承其实体现的是一种关系:"is a"。

    Person

    Student

    Teacher

    水果

    苹果

    香蕉

    橘子

     

    采用假设法。

    如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。

    代码:
    public class Demo3_extends {
    public static void main(String[] args) {

    Programmer p = new Programmer();
    p.setEno("1001");
    p.setName("程序员");
    p.setSalary(10000);
    System.out.println(p.getEno() +"...." + p.getName() + "...." + p.getSalary());
    System.out.println("++++++++++++");
    ProjectManager pro = new ProjectManager();
    pro.setEno("0001");
    pro.setName("项目经理");
    pro.setSalary(20000);
    pro.setBonus(5000);
    System.out.println(pro.getEno() +"...." + pro.getName() + "...." +
    pro.getSalary() + "...." + pro.getBonus());

    }
    }
    class Person{
    private String name; // 员工的姓名
    private String eno; // 员工的编号
    private double salary; // 员工的工资

    // 无参数的构造方法
    public Person(){

    }
    // 有参数的构造方法
    public Person(String name, String eno, double salary){
    this.name = name;
    this.eno = eno;
    this.salary = salary;
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public String getEno() {
    return eno;
    }

    public void setEno(String eno) {
    this.eno = eno;
    }

    public double getSalary() {
    return salary;
    }

    public void setSalary(double salary) {
    this.salary = salary;
    }
    }

    class Programmer extends Person{

    }

    class ProjectManager extends Person{
    private double bonus;

    public double getBonus() {
    return bonus;
    }

    public void setBonus(double bonus) {
    this.bonus = bonus;
    }
    }
    
    

    1.5继承中成员变量的关系

    * A:案例演示

    * a:不同名的变量

    * b:同名的变量

    子父类出现同名的变量只是在讲课中举例子用,在开发中是不会出现这种情况的
    子类继承父类就是为了使用父类的成员,那么如果定义了同名的成员变量没有意义了
    
    

    2.1 继承中构造方法的关系

    * A:案例演示
        * 子类中所有的构造方法默认都会访问父类中空参数的构造方法
    * B:为什么呢?
        * 因为子类会继承父类中的数据,可能还会使用父类的数据。
        * 所以,子类初始化之前,一定要先完成父类数据的初始化。
        * 其实:
       * 每一个构造方法的第一条语句默认都是:super() Object类最顶层的父类。

    代码:
    public class Demo5_Extends {
    public static void main(String[] args) {
    /**
    * 1. 创建对象时,构造方法会自动执行
    * 2. 创建的是子类的对象,但是父类的构造方法先执行了。
    */
    Son2 son2 = new Son2();
    }
    }

    class Father2 {
    String name;
    public Father2() {
    System.out.println("Father 的构造方法");
    }
    }
    class Son2 extends Father2 {
    public Son2() {
    System.out.println("Son 的构造方法");
    }
    }
    
    

    2.2继承中构造方法的注意事项

    * A:案例演示

    * 父类没有无参构造方法,子类怎么办?

    * super解决

    * this解决

    * B:注意事项

    * super(…)或者this(….)必须出现在构造方法的第一条语句上

    代码:
    public class Demo6_Extends {
    public static void main(String[] args) {
    /**
    * 1. 创建一个子类的对象
    * 2. 调用子类的无参数的构造方法
    * 3. 调用super("张三"7)方法执行父类中有参数的构造方法
    * 4. 执行子类中的无参数的构造方法
    */
    SonOne s1 = new SonOne();
    System.out.println(s1.getName() + "..." + s1.getAge());
    System.out.println("--------------------");
    /**
    * 1. 调用子类的有参数的构造方法
    * 2. 调用super("李四"28)方法执行父类中有参数的构造方法
    * 3. 执行子类中有参数的构造方法
    */
    SonOne s2 = new SonOne("李四",28);
    System.out.println(s2.getName() + "..." + s2.getAge());
    }
    }

    class FatherOne{
    private String name; // 姓名
    private int age; // 年龄
    /*
    // 无参数的构造方法
    public FatherOne() {
    System.out.println("FatherOne: 空参构造方法");

    }*/

    // 有参数的构造方法
    public FatherOne(String name, int age){
    this.name = name;
    this.age = age;
    System.out.println("FatherOne: 有参数的构造方法");
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public int getAge() {
    return age;
    }

    public void setAge(int age) {
    this.age = age;
    }
    }

    class SonOne extends FatherOne{
    public SonOne() { //空参构造
    super("张三", 7); //无论写没写super() 方法,这一句话都会执行
    System.out.println("Son 空参构造");
    }
    public SonOne(String name,int age) { //有参构造
    super(name,age);
    System.out.println("Son 有参构造");
    }

    }

    public class Demo6_Extends {
        public static void main(String[] args) {
            /**
             * 1. 创建一个子类的对象
             * 2. 调用子类的无参数的构造方法
             * 3. 调用super("张三" 7)方法执行父类中有参数的构造方法
             * 4. 执行子类中的无参数的构造方法
             */
            SonOne s1 = new SonOne();
            System.out.println(s1.getName() + "..." + s1.getAge());
            System.out.println("--------------------");
            /**
             * 1. 调用子类的有参数的构造方法
             * 2. 调用super("李四" 28)方法执行父类中有参数的构造方法
             * 3. 执行子类中有参数的构造方法
             */
            SonOne s2 = new SonOne("李四",28);
            System.out.println(s2.getName() + "..." + s2.getAge());
        }
    }

    class FatherOne{
        private String name;  // 姓名
        private int age;      // 年龄
        /*
        // 无参数的构造方法
        public FatherOne() {
            System.out.println("FatherOne: 空参构造方法");

        }*/

        // 有参数的构造方法
        public FatherOne(String name, int age){
            this.name = name;
            this.age = age;
            System.out.println("FatherOne: 有参数的构造方法");
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }

    class SonOne extends FatherOne{
        public SonOne() {                 //空参构造
            super("张三", 7);   //无论写没写super() 方法,这一句话都会执行
            System.out.println("Son 空参构造");
        }
        public SonOne(String name,int age) {   //有参构造
            super(name,age);
            System.out.println("Son 有参构造");
        }

    }

  • 相关阅读:
    【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 15—Anomaly Detection异常检测
    【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 14—Dimensionality Reduction 降维
    【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 13—Clustering 聚类
    【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 12—Support Vector Machines 支持向量机
    【原】机器学习公开课 目录(课程笔记、测验习题答案、编程作业源码)...持续更新...
    【原】Coursera—Andrew Ng机器学习—Week 11 习题—Photo OCR
    【原】Coursera—Andrew Ng机器学习—Week 10 习题—大规模机器学习
    【原】Coursera—Andrew Ng机器学习—Week 9 习题—异常检测
    【原】Coursera—Andrew Ng机器学习—Week 8 习题—聚类 和 降维
    【原】Coursera—Andrew Ng机器学习—Week 7 习题—支持向量机SVM
  • 原文地址:https://www.cnblogs.com/LEPENGYANG/p/14990458.html
Copyright © 2011-2022 走看看