zoukankan      html  css  js  c++  java
  • 面向对象(继承与抽象)

    继承:

       继承的好处:提高了代码的复用性,让类与类之间产生了关系,将对象中的共性内容不断的向上抽取,就形成了关系,然后就有了继承,有了子类父类,提高了代码的复用。

      继承的特点:1、java中只能单继承,单继承是一个类只能有一个父类。但是java不能支持多继承是因为会产生调用的不确定性,但是java支持多层继承。

      如何使用一个继承体系中的成员呢?1、查阅该顶中的顶层类的内容,因为通过该类可以了解该体系的基本功能。2、创建最子类的对象,即可以调用共性的基本内容,也可以使用子类的特有功能。简单说:看父类内容,建立子类对象使用。

      关于什么时候定义继承?必须是事物之间存在着所属关系的时候才能定义继承。误区:不要仅仅为了提高复用,为了方便获取其他类中的内容而去继承。

      继承中成员的特点:1、成员变量2、成员函数3、构造函数。super代表父类用法和this相似,this代表对本类对象的引用,super代表父类所属空间。注意:子父类中通常不会出现同名的属性。子类只能直接继承父类中的非私有属性。

       继承中成员函数的特点:当子父类中出现一模一样的方法的时候,会发生一个函数的特性:覆盖(override)

        

    package com_package1;
    
    public class Fu {
        void show()
        {
            System.out.println("fu run");
        }
    
    }
    package com_package1;
    
    public class Zi extends Fu {
         void show()
         {
             System.out.println("zi run");
             
         }
    }
    package com_package1;
    
    public class ExtendsDemo {
        public static void main(String[]args)
        {
            Zi z = new Zi();
            z.show();
            
        }
    
    }

    zi run//子类中有这个方法何必去父类中寻找

     

    父类中:子父类中通常不会出现同名的属性。父类中既然定义了某个属性,那么子类其实就没有必要在定义该属性了。

    继承中成员函数的特点:

        当子父类中出现一模一样的方法的时候,会发生一个函数的特性:覆盖。覆盖注意事项:1、子类覆盖父类的时候,必须要保证方法的权限大于等于被覆盖的方法的权限。2、覆盖方法有静态修饰时,静态只能覆盖静态,或者被静态覆盖。

         继承了父类中的功能后,想要对已有的功能进行内容的改变,意味着功能的声明不变,将内容在子类中进行自定义,这种定义就是覆盖

        

    package com_package1;
    
    public class Phone {
        void show()
        {
           System.out.println("number");    
        }
    
    }
    package com_package1;
    
    import javax.sound.midi.SysexMessage;
    
    public class NewPhone extends Phone {
        void show()
        {
            
            //System.out.println("name");
            super.show();
            System.out.println("name");
        }
         
        
    
    }
    package com_package1;
    
    public class NewPhoneDemo {
        public static void main(String[]args)
        {
            NewPhone np = new NewPhone();
            np.show();
            
        }
    
    }

    number
    name

     

    继承中的构造函数:

       子类实例化过程:其实在子类的所有构造函数中的第一行默认有一条隐式语句就是super(),也就是说子类的构造函数默认都会访问父类中空参数的构造函数。

        为什么子类的构造函数都要去访问父类额构造函数呢?因为子类继承了父类,可以访问父类中已有的属性,在子类进行实例化的时候必须要为费中的属性分配空间,并要进行初始化,所以必须要访问一次父类的构造函数,看看父类是如何堆属性进行初始化 额,所以子类要实例化对象的时候必须要先看父类的初始化过程。

      结论:父类的构造函数,既可以给本类进行初始化,又可以给子类对象初始化

    package com_package1;
    
    public class Phone {
        void show()
        {
           System.out.println("number");    
        }
    
    }
    package com_package1;
    
    public class NewPhone extends Phone {
        void show()
        {   
            //super();
    
            //System.out.println("name");
            super.show();
            System.out.println("name");
        }
         
        
    
    }

        

    注意,如果父类中没有空参数的构造函数,子类的构造函数中必须手动用super来指定要访问的父类中的构造函数。

    比如:

    package com_package1;
    
    public class Fu1 {
        //Fu1()
        //{
        //    System.out.println("fu kong");
        //}
        Fu1(int x)
        {
            
            System.out.println("x"+x);
        }
    
    }
    package com_package1;
    
    public class Zi1 extends Fu1 {
        Zi1()
        {
            super(3);
            System.out.println("Zi kong");
        }
        Zi1(int x)
        {
            super(6);
            System.out.println(x);
        }
    
    }
    package com_package1;
    
    public class Zi1Demo {
        public static void main(String[]args)
        {
            Zi1  z = new Zi1(6);
            System.out.println(z);
            
        }
    
    }

    x6
    6
    com_package1.Zi1@1fc4bec

     

    注意:如果父类中没有空参数的构造函数,子类的构造函数中必须手动用super来指定要访问的父类中的构造函数,或者用this来指定访问的本类中的构造函数,this 和super调用构造函数只能定义构造函数的第一行,不能同时出现。

      关于子类继承父类的某些属性以及改写某些属性的方法:

    package com_package1;
    
    public class Person1 {
        private String name;
        private int age;
        Person1(String name,int age)
        {
            this.name =name;
            this.age = age;
        }
        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;
        }
        
    
    }
    package com_package1;
    
    public class Student1 extends Person1{
    
        Student1(String name, int age) {
            super(name, age);
            // TODO Auto-generated constructor stub
        }
    
    }
    package com_package1;
    
    public class Student1Demo {
        
        public static void main(String[]args)
        {
            Student1 st = new Student1("kaka", 23);
            System.out.println(st.getName());
            System.out.println(st.getAge());
            
        }
    
    }
  • 相关阅读:
    单片机I/O口推挽与开漏输出详解(力荐)
    wifi
    SDIO总线协议
    [hi3521] nand flash 的 boot 启动模式的区别?
    常见SOC启动流程分析
    PWM通过RC低通滤波器模拟DAC
    海思 core 电压动态调整
    USB线上/串口/I2C引脚串联电阻的作用
    几种flash存储芯片的用途和分类
    示波器分析I2C时序波形图
  • 原文地址:https://www.cnblogs.com/mmlovejj/p/4473937.html
Copyright © 2011-2022 走看看