zoukankan      html  css  js  c++  java
  • 2018-07-23接口基础知识+多态

    Java接口:

    示例代码:

    package com.oracle.demo01;

    //class改成interface,把类变成接口:

    //接口中的所有方法都必须是public abstract修饰的,如果不声明,默认就是public abstract(且必须是public abstract)!

    //在接口中所有的成员变量都是常量,默认修饰符public static final!

    //static:利用类名.成员去调用!

    //final:这个修饰符声明的变量是常量!

    public interface MyInterface {

         public abstract void method1();

        

         //试着写一个非抽象方法:

         /*public void method2(){

             //成员方法会报错!

         }*/

        

         public static final int num1=321; //蓝色变量为常量!

    }

    接口概念:可以理解为一个特殊的抽象类!接口是功能的集合,接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成!这样将功能的定义与实现分离,优化了程序设计!

    //接口定义:

    与定义类的class不同,接口定义时需要使用interface关键字!定义接口所在的仍为.java文件,虽然声明时使用的为interface关键字的编译后仍然会产生.class文件!这点可以让我们将接口看做是一种只包含了功能声明的特殊类!

    //格式:

    public interface 接口名 {

    抽象方法1;

    抽象方法2;

    抽象方法3;

    }

    注意:

    ①   接口中的方法均为公共访问的抽象方法!

    ②   接口中无法定义成员变量/成员方法!

    //接口的实现(类似抽象类的继承关系):

    class 类 implements 接口 {

         重写接口中方法

    }

    //强调:

    在类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要重写该抽象方法,完成具体的逻辑!

    ①   接口具有定义功能,需要具有该功能时,可以让类实现该接口,只声明了应该具备该方法,是功能的声明!

    ②   在具体实现类中重写方法,实现功能,是方法的具体实现!

    ③   接口中可以定义变量,但是变量必须有固定的修饰符修饰,public static final即常量,其值不能改变!

    ④   接口中可以定义方法,方法也有固定的修饰符,public abstract(抽象方法)!

    ⑤   接口不可以创建对象(因为没有方法体,创建对象无意义,需要通过“子类”在重写所有抽象方法后再通过子类创建对象)!

    ⑥   子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化,否则子类是一个抽象类!

    接口的重要作用:解决了子类只能继承一个父类的弊端!

    示例代码:

    interface Fu1

    {

         void show1();

    }

    interface Fu2

    {

         void show2();

    }

    class Zi implements Fu1,Fu2 // 多实现,同时实现多个接口!

    {

         public void show1(){}

         public void show2(){}

    }

    //弊端:多继承时,当多个父类中有相同功能时,子类调用会产生不确定性!其实核心原因就是在于多继承父类中功能有主体,而导致调用运行时,不确定运行哪个主体内容(当不同的父类接口具有方法名和参数列表完全一样的方法时,如果返回数据类型不同,会导致子类在重写时造成方法的重新定义,所以方法取名要有实际含义)!

    //子类可以同时继承类和多个接口!

    示例代码:

    class Fu {

         public void show(){}

    }

    interface Inter {

         pulbic abstract void show1();

    }

    class Zi extends Fu implements Inter {

         public void show1() {

         }

    }

    //接口之间的多继承:

    示例代码:

    interface Fu1{

         void show();

    }

    interface Fu2{

         void show1();

    }

    interface Fu3{

         void show2();

    }

    interface Zi extends Fu1,Fu2,Fu3{

         void show3();

    }

    //强调:

    ①   类继承抽象类用extends!

    ②   类继承接口用implements!

    ③   接口继承接口用extends!

    多态:

         把子类对象赋值给父类引用变量!

    前提:必须有继承关系+父类中有该方法,且子类中重写该方法!

    在多态中成员方法的特点:如果子类和父类有同名的方法,则调用子类重写后的方法!

    如果父类中没有同名的方法,那么该对象不能调用子类独有的方法!

    如果父类中有,而子类没有,那么调用父类的方法!

    在多态中成员变量的特点:如果子类和父类有同名的成员变量,则调用时访问的是父类的成员变量!

    如果父类中没有同名的成员变量,则该对象不能调用子类独有的成员变量!

    如果父类中有,而子类没有的成员变量,那么调用父类的成员变量!

    向上转型:子类对象-->父类类型

    向下转型:父类引用变量-->子类引用

    Java中多态的代码体现在一个子类对象(实现类对象)既可以给这个子类(实现类对象)引用变量赋值,又可以给这个子类(实现类对象)的父类(接口)变量赋值!

    基本特点为:

    父类引用变量可以指向子类对象!

    多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态!在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法!

    多态定义与使用格式:

    父类类型 变量名=new 子类类型();

    变量名.方法名();

    抽象类 变量名 = new 抽象类子类();

    接口 变量名 = new 接口实现类();

    通过instanceof关键字来判断某个对象是否属于某种数据类型:

    boolean  b = 对象  instanceof  数据类型;

    多态向上转型(自动):

    父类类型  变量名 = new 子类类型();

    多态向下转型:

    子类类型 变量名=(子类类型) 父类类型的变量;

    当父类的引用指向子类对象时,就发生了向上转型,即把子类类型对象转成了父类类型!向上转型的好处是隐藏了子类类型,提高了代码的扩展性!但向上转型也有弊端,只能使用父类和子类共有的内容,而无法使用子类特有功能,功能有限制!

    向下转型容易出现“ClassCastException”的错误,所以需要instanceof判断一下!

  • 相关阅读:
    HDU 1058 Humble Numbers
    HDU 1160 FatMouse's Speed
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1003 Max Sum
    HDU 1297 Children’s Queue
    UVA1584环状序列 Circular Sequence
    UVA442 矩阵链乘 Matrix Chain Multiplication
    DjangoModels修改后出现You are trying to add a non-nullable field 'download' to book without a default; we can't do that (the database needs something to populate existing rows). Please select a fix:
    opencv做的简单播放器
    c++文件流输入输出
  • 原文地址:https://www.cnblogs.com/postgredingdangniu/p/9355726.html
Copyright © 2011-2022 走看看