zoukankan      html  css  js  c++  java
  • Java OOP——第二章 继承

    1、 继承:

    继承是面向对象的三大特征之一,是JAVA实现代码重用的重要手段之一;

    继承是代码重用的一种方式,将子类共有的属性和行为放到父类中;

    JAVA只支持单继承,即每一个类只有一个父类,继承表达的是:子类与父类是is-a关系;

    在JAVA中,所有的JAVA类都直接或间接的继承了java.lang..Object类。Object类是所有JAVA类的祖先;

    在定义一个类时如果没有使用extends关键字,那么这个类直接继承Object类;

    继承可以解决代码复用,让我们的编程更加靠近人类思维。当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类(比如刚才的Student),

    在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends语句来声明继承父类:

    方便修改代码、减少代码

    语法:class 子类 extends 父类

      ★子类就会自动拥有父类定义的某些属性和方法。

      ★不能被继承的父类成员:

        ●private成员

        ●子类与父类不在同包,使用默认访问权限的成员

        ●构造方法

            

            

    父类:

     

    狗类(子类(两种输出方式)):

     

    企鹅类(子类(两种输出方式))

      

    测试类:

     

    第一中输出方式:super.

        

    第二种输出方式:

         

    第三种输出方式:

           

    2、访问:

    子类访问父类成员:

       使用super关键字来访问父类的成员,super代表父类对象

            super只能出现在子类的方法和构造方法中,而不是其他位置;

            可以访问父类的成员,如父类的属性、方法、构造函数;

           ◆ super调用构造方法时,只能是第一句

            注意访问的权限的限制,如super不能访问父类的private成员

         

        

        

     

    访问修饰符

    本类

    同包

    子类          

    其他

    private

     

     

     

    默认(friendly)

     

     

    protected

     

    public

      子类可以从父类继承

        ◆父类的public修饰符的属性和方法;无论父类和子类是否在同一个包;

        ◆protected修饰符的属性和方法;无论父类和子类是否在同一个包;

        ◆默认修饰符属性和方法被子类继承了,子类和父类必须在同一个包;

      子类不可以从父类继承:

        ★父类的private修饰符的属性和方法不能被子类继承。

        ★无法继承父类的构造方法;

    多重继承关系的初始化顺序:

     

    继承条件下构造方法的调用规则:

      ◆如果子类的构造方法中没有通过super显示调用父类的有参构造方法,也没有通过this显示调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,有没有super(); 语句的效果是一样的;

      ◆如果子类的构造方法中通过super显示调用父类的有参构造函数,则执行父类相应的构造方法,而不执行父类无参构造函数;

      ◆如果子类的构造函数中通过this显示调用自身的其他构造方法,则在相应构造方法中应用以上两条规则;

      ◆如果存在多级继承关系,则在创建子对象时,以上规则会多次向更高一级父类应用,一直执行到顶级父类Object类的无参构造方法为止;

    注意:

      在构造方法中如果有this语句或者super语句出现,则只能是第一条语句;

      在一个构造方法中不允许同时出现使用this和super语句调用构造方法(否则就有两条第一条语句);

      在类方法中不允许出现this或super关键字;

      在实例方法中,thgis和super语句不要求是第一条语句,可以共存;

    3、重写(overriding):在子类中可以根据需求对从父类继承的方法进行重新编写,成为方法的重写或方法的覆盖;

    使用继承后效果:

    使用重写效果:

     

    方法重写的规则:

      方法名相同;

      参数列表相同;

      返回值类型相同或者是其子类;

      访问权限不能严于父类;

    方法重载与方法重写:

     

    位置

    方法名

    参数表

    返回值

    访问修饰符

    方法重写

    子类

    相同

    相同

    相同或是其子类

    不能比父类更严格

    方法重载

    同类

    相同

    不相同

    无关

    无关

      注:构造方法不能被继承,因此不能重写;

    重载与重写:

       重载涉及同一个类中的同名方法,要求方法名相同,参数列表不同,与返回值类型,访问修饰符无关;

         方法重载简单的说:方法重载就是在类的同一种功能的多种实现方式,到底采用哪种方式,取决于调用者给出的参数。

        注意事项:

          1、方法名相同

          2、方法的参数类型,个数,顺序至少有一项不同

          3、方法返回类型可以不同(只是返回类型不一样,不能构成重载)

          4、方法的修饰符可以不同(只是控制访问修饰符不同,不能构成重载)

         重写涉及的是子类和父类之间的同名方法,要求方法名相同、参数列表相同、返回值类型相同(或是其子类)、访问修饰符不能严于父类;

    4、抽象类:

    abstract也可用于方法——抽象方法

      eg:

      public abstract void print();

     注

      抽象方法没有方法体

      抽象方法必须在抽象类里

      抽象方法必须在子类中被实现,除非子类是抽象类

     

     每个子类的实现也不同:

    public abstract class Pet {

           public void print() {

                   //…

           }

    }

    抽象类是java中一个比较重要的类。

      1、用abstract关键字来修饰一个类时,这个类就是抽象类。

      2、用abstract关键字来修饰一个方法时,这个方法就是抽象方法。

      3、abstract抽象类中的abstract抽象方法是不允许在抽象类中实现的,一旦实现就不是抽象方法和抽象类了。abstract抽象方法只能在子类中实现。

      4、抽象类中可以拥有实现方法。

    抽象类--注意事项

      1、抽象类不能被实例化

      2、抽象类不一定要包含abstract方法。也就是说,抽象类可以没有abstract抽象方法。

      3、一旦类包含了abstract抽象方法,则这个类必须声明为abstract抽象类。

      4、当一个子类继承的父类是abstract抽象类的话,需要把抽象类的抽象方法全部实现。

      5、可以有0~多个抽象方法;

      6、非抽象类必须重写父类的所有抽象方法;

      7、抽象方法不能有主体。

                正确的抽象方法例:abstract void abc();

                错误的抽象方法例:abstract void abc(){}

    父类:

        

    狗类(子类):@override用于检测是否为重写

               

    测试类:

         

    输出结果:

         

    5、final关键字:final:最后的,最终的。final可以修饰变量或者方法。

    1、当不希望父类的某个方法被子类覆盖(override)时,可以用final关键字修饰。

    2、当不希望类的某个变量的值被修改,可以用final修饰。如果一个变量是final,则必须赋初值,否则编译出错。

    3、当不希望类被继承时,可以用final修饰。

    注:

    1、final修饰的变量又叫常量,一般用XX_XX_XX来命名。(带下划线)

    2、final修饰的变量在定义时,必须赋值,并且以后不能再赋值。

                final float reate_1=3.1415926f  //圆周率不让修改,带有final修饰的变量命名时应有_下划线来区分表示

                final float reate_1=3.1415926f;//使用final可以保证,需要强制不被修改的数据一定要用final锁定

                final int b=0;  //定义类型后应赋值,使用final定义变量时一定要赋初值否则报错。

                final public void sendMes(){}//给成员方法用final来修饰则表示不可以被修改,不可被覆盖。

        final class Bbb extends Aaa{}//定义类前加final表示该类不允许被继承

    Penguin类不再被其他类继承

     //最终版的类

    public final class Penguin extends Pet {

          //…

    }

    方法不被重写

    //最终版的方法

    public final void print () {

          //…

    }

    属性值不被修改

     //最终版的属性值

    public class Penguin {

           final String  home ="南极";// 居住地

           public void setHome(String name){

           this.home=home; //错误,不可再赋值

        }

    }

    错误示例://使用final修饰引用型变量,变量的值是固定不变的,而变量所指向的对象的属性值是可变的

    class Dog {

        String name;

        public Dog(String name) {

            this.name = name;

        }

    }

    class Test {

        public static void main(String[] args) {

            final Dog dog = new Dog("欧欧");

            dog.name = "美美";

            dog = new Dog("亚亚");   //使用final修饰引用型变量,变量不可以再指向另外的对象

        }

    }

    6附加1:包

    包--三大作用

    1、区分相同名字的类

    2、当类很多时,可以很好的管理类

    3、控制访问范围

    包--换包命令

    package com.自定义名字;

    注意:打包命令一般放在文件开始处。

    包--如何引入包

    语法:import 包;

    包--命名规范

    小写字母

    比如 com.sina.shunping

     

    包--常用的包

    一个包下,包含很多的类,java中常用的包有:

    java.lang.* 包      自动引入

    java.util.* 工具包

    java.net.* 包      网络开发包 

    java.awt.* 包 窗口工具包

      附加2:

    ●方法重写是在两个类存在继承关系时,子类可以重写父类中的同名方法,要求参数列表相同,访问权限不能严于父类,返回值类型与被重写方法相同或是其子类;

    ●java.lang包中Object的equals方法将比较两个对象是否相等,如果相等则返回true.

      1.==是判断两个变量或实例是不是指向同一个内存空间

         equals是判断两个变量或实例所指向的内存空间的值是不是相同

      2.==是指对内存地址进行比较

         equals()是对字符串的内容进行比较

      3.==指引用是否相同

         equals()指的是值是否相同

    注意:默认(friendly)访问修饰符的反访问范围是本来和同包中访问。

    JAVA只支持单继承,并且子类无法继承父类的构造方法;

    ●static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:

    类名.静态方法名(参数列表...)

    类名.静态变量名

    ●eg:

     

    分析:

    面向对象三个特性是封装、继承、多态,其中,java的类是单继承的,不支持多继承,

    即extends关键字后只能有一个类名称,即直接父类。

    继承是is-a的相互关系,将子类转换成父类,在继承关系上面是向上移动的,所以一般称之为向上转型。

    由于向上转型是从一个叫专用类型向较通用类型转换,所以它总是安全的,

    第2和3行都是向上转型(即可以子类对象赋给父类类型变量,反之,则不对),第1行创建自己类型的对象,自然也是正确的

    ●父类如果写了有参数构造而没写无参构造,默认无参构造将无法调用,这时子类构造也就无法调用父类无参构造

    (子类无参构造默认调用super()且写在第一行。);

    ●抽象类可以有子类,抽象类不能被实例化,抽象类中除了有抽象方法外,也可以有普通实例方法,声明抽象类和抽象方法都要使用abstract关键字

    ●抽象类不能使用私有访问修饰符修饰(即不能用private修饰);

    抽象方法不能使用final进行修饰(final和abstract不能同时修饰一个方法);

    抽象方法不能有实现。

    抽象类不能创建对象,

    抽象类的引用可以指向实现其抽象方法的子类的对象。

    定义抽象类时,abstract关键字放在class之前;

    ●abstract是用来修饰抽象类的(abstract修饰符可修饰类和方法,不能修饰属性;)。

                        abstract型方法用于被子类实现,所以只能是public、protected关键字所修饰;

    抽象类中可以同时存在抽象方法和非抽象方法,需要注意的是有抽象方法的类一定是抽象类。

    static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块;

    final修饰类中的属性或者变量,无论属性是基本类型还是引用类型,final所起的作用都是变量里面存放的“值”不能变。

    final修饰类中的方法,作用:可以被继承,但继承后不能被重写。final修饰类,作用:类不可以被继承。

    interface关键字是用来定义修饰接口的。与抽象想法不同的是,接口里的方法全都是抽象方法。

    ●抽象类和接口的区别:

     

    ●JAVA方法的特点:抽象、继承、多态;

     

    ●使用super可以调用父类的公有方法,调用父类的属性及父类的构造方法。并且,子类构造方法调用父类构造方法时,必须放在第一行;

    ●super明确显式地指出一个类可以它父类的构造函数、方法和变量;

    调用父类的属性,一个类中如果有int x属性,如果其子类中也定义了int x属性的话,

    在子类中调用父类的x属性时应用super.x,表示该x是引用的父类的属性,

    而要表示子类中的x属性的话,使用this.x。调用父类方法也可以通过该关键字实现;

    ●如果没有使用super显示调用父类的构造函数,将自动调用默认构造函数;

     ●super关键字,在子类对象内部指代其父类对象的引用,可以用来调用父类中的成员。但是不能够直接将super输出。

    ●main方法的格式讲解public static void main(String[] args){}

    public:公共的,访问权限最大的,由于main方法是被jvm调用的,所以权限要够大

    static:静态的,不需要创建对象,通过类名就可以,方便jvm的调用

    void:方法的返回值是返回给调用者,而main方法是被jvm调用,你返回内容jvm调用,你返回内容给jvm没有意义

    main:是一个常见的方法入口,语言都是以main作为入口

    String[] args:这是一个字符串数组,值去哪里了?这个东西早起是为了接受键盘录入的数据的。

    ●public:所有的类都可以访问。

    private:只有在同一个类中才可以访问。

    protected:同一个类中、同一个包中、子类中都可以访问,包类型的。

    默认类型:同一个类中、同一个包中可以访问到

    ●final修改的类不能是抽象的,abstract修饰的方法要求子类中必须重写,final修饰的方法要求不能重写可以重载,

    可以被static修饰,final和static可以同时去修饰类、变量和类的方法,顺序没有要求;

    Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。

    final修饰的为基本类型的,变量将变成常量。必须要在常量声明时对其进行初始化,常量名一般使用大写字母来表示,

    字符常量使用单引号括起来,字符串常量使用双引号;

    使用final关键字修饰一个变量为引用类型,是指引用地址不能变,引用变量所指向的对象中的内容还是可以改变的;

    ●final类不能被继承,没有子类,final类中的方法默认是final的。

    final方法不能被子类的方法覆盖,但可以被继承。

    final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

    final不能用于修饰构造方法。

     

  • 相关阅读:
    【pytorch】torch.manual_seed()用法详解
    【python】具体能做些什么?(有哪些应用领域)
    【python】函数参数前加*星号的含义
    【python】Keyword-Only Arguments(强制关键字参数)
    【python】字符串find()方法
    碧蓝航线内部表情包(有爱自取)
    【python】60行代码实现给头像戴上圣诞帽(opencv)
    【python】30行代码实现视频中的动漫人脸检测(opencv)
    Linux supervisord配置使用 ubuntu
    BananaPi python-Mysql 操作库
  • 原文地址:https://www.cnblogs.com/HQING/p/9497362.html
Copyright © 2011-2022 走看看