zoukankan      html  css  js  c++  java
  • java-面向对象与接口

    继承

    继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。继承可以理解为一个对象从另一个对象获取属性的过程。
    继承中最常使用的两个关键字是extends和implements。
    这两个关键字的使用决定了一个对象和另一个对象是否是IS-A(是一个)关系。
    通过使用这两个关键字,我们能实现一个对象获取另一个对象的属性。
    所有java的类均是由java.lang.Object类继承而来的,所以Object是所有类的祖先类,而除了Object外,所有类必须有一个父类。
    继承两种方式:

    extends方式
    public class Animal(){}
    public class Dog extends Animal(){}
    通过使用关键字extends,子类可以继承父类的除private属性外所有的属性。
     
    implements方式
    public interface Animal(){}
    public class Dog implements Animal(){}
    Implements关键字使用在类继承接口的情况下, 这种情况不能使用关键字extends。

    可以使用 instanceof 运算符来检验dog对象是否是Animal类的一个实例。

    interface Animal{}
    public class Dog extends Mammal{
       public static void main(String args[]){
          Dog d = new Dog();
          System.out.println(d instanceof Animal);//true
       }
    }

    Java只支持单继承(继承基本类和抽象类),但是我们可以用接口来实现(多继承接口来实现),脚本结构如:

    public class Apple extends Fruit implements Fruit1, Fruit2{}

    一般我们继承基本类和抽象类用extends关键字,实现接口类的继承用implements关键字。

    重写

    重写是子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变。即外壳不变,核心重写!
    重写的好处在于子类可以根据需要,定义特定于自己的行为。
    也就是说子类能够根据需要实现父类的方法。
    在面向对象原则里,重写意味着可以重写任何现有方法。
    当需要在子类中调用父类的被重写方法时,要使用super关键字。

    实例:

    Dog类重写Animal的move方法
    class Animal{
       public void move(){
          System.out.println("动物可以移动");
       }
    }
     
    class Dog extends Animal{
       public void move(){
          System.out.println("狗可以跑和走");
       }
    }

    重写的规则

    参数列表必须完全与被重写方法的相同;
    返回类型必须完全与被重写方法的返回类型相同;
    访问权限不能比父类中被重写的方法的访问权限更高。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
    父类的成员方法只能被它的子类重写。
    声明为final的方法不能被重写。
    声明为static的方法不能被重写,但是能够被再次声明。
    如果一个方法不能被继承,那么该方法不能被重写。
    子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
    子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。
    重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
    构造方法不能被重写。
    如果不能继承一个方法,则不能重写这个方法。

    重载

    重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型呢?可以相同也可以不同。
    每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
    只能重载构造函数

    实例:

        public int test(){
            System.out.println("test1");
        }
        public void test(int a){
            System.out.println("test2");
        }

    重载规则

    被重载的方法必须改变参数列表;
    被重载的方法可以改变返回类型;
    被重载的方法可以改变访问修饰符;
    被重载的方法可以声明新的或更广的检查异常;
    方法能够在同一个类中或者在一个子类中被重载。
    重写与重载之间的区别

    区别点      重载方法      重写方法
    参数列表    必须修改    一定不能修改
    返回类型    可以修改    一定不能修改
    异常       可以修改    可以减少或删除,一定不能抛出新的或者更广的异常
    访问       可以修改    一定不能做更严格的限制(可以降低限制)

    多态

    多态是同一个行为具有多个不同表现形式或形态的能力。
    多态性是对象多种表现形式的体现。
    在Java中,所有的对象都具有多态性,因为任何对象都能通过IS-A测试的类型和Object类。
    如果A继承B,则A对象是B对象的一个分类,IS-A关系。
    访问一个对象的唯一方法就是通过引用型变量。
    引用型变量只能有一种类型,一旦被声明,引用型变量的类型就不能被改变了。
    引用型变量不仅能够被重置为其他对象,前提是这些对象没有被声明为final。还可以引用和它类型相同的或者相兼容的对象。它可以声明为类类型或者接口类型。

    public interface Vegetarian{}
    public class Animal{}
    public class Deer extends Animal implements Vegetarian{}
    public class Test {
    public static void main(String [] args){
    Deer d = new Deer();
    Animal a = d;
    Vegetarian v = d;
    Object o = d;
    }
    }
    所有的引用型变量d,a,v,o都指向堆中相同的Deer对象。

    抽象类

    在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
    抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
    由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
    父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
    在Java语言中使用abstract class来定义抽象类。如下实例:

    public abstract class Employee{}

    如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。
    abstract关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。
    抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。

    public abstract double computePay();

    声明抽象方法会造成以下两个结果:

    1、如果一个类包含抽象方法,那么该类必须是抽象类。
    2、任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
    继承抽象方法的子类必须重载该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。

    封装

    在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装、隐藏起来的方法。
    封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
    要访问该类的代码和数据,必须通过严格的接口控制。
    封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
    适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。

    实例

    private String name;
    public void setName(String newName){
        name = newName;
    }
    使用对象调用setName方法即可赋值,但无法直接访问name属性

    类属性被保护起来,不再让外界直接访问,而是提供一些列开放方法。
    通常情况下,这些方法被称为getter和setter方法。
    因此,任何要访问类中私有成员变量的类都要通过这些getter和setter方法。

    接口定义

    接口(英文:Interface),在java编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
    接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
    除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
    接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在Java中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。

    接口与类相似点:

    一个接口可以有多个方法。
    接口文件保存在.java结尾的文件中,文件名使用接口名。
    接口的字节码文件保存在.class结尾的文件中。
    接口相应的字节码文件必须在与包名称相匹配的目录结构中。

    接口与类的区别:

    接口不能用于实例化对象。
    接口没有构造方法。
    接口中所有的方法必须是抽象方法。
    接口不能包含成员变量,除了static和final变量。
    接口不是被类继承了,而是要被类实现。
    接口支持多重继承。

    声明与实现

    接口的声明语法格式如下:

    [可见度] interface 接口名称 [extends 其他的类名] {
            // 声明变量
            // 抽象方法
    }

    interface关键字用来声明一个接口。下面是接口声明的一个简单例子。

    import java.lang.*;
    public interface NameOfInterface
    {
       //任何类型 final, static 字段
       //抽象方法
    }

    接口有以下特性:

    接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
    接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键子。
    接口中的方法都是公有的。

    接口的实现:

    当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。
    类使用implements关键字实现接口。在类声明中,implements关键字放在class声明后面。

    实现一个接口的语法,可以使用这个公式:

    ... implements 接口名称[, 其他接口, 其他接口..., ...] ...

    实例:

    public class MammalInt implements Animal{}

    重写接口中声明的方法时,需要注意以下规则:

    类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。
    类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型。
    如果实现接口的类是抽象类,那么就没必要实现该接口的方法。

    在实现接口的时候,也要注意一些规则:

    一个类可以同时实现多个接口。
    一个类只能继承一个类,但是能实现多个接口。
    一个接口能继承另一个接口,这和类之间的继承比较相似。

    继承

    一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。 例:

    public interface Sports{}
    public interface Football extends Sports{}

    多重继承

    在Java中,类的多重继承是不合法,但接口允许多重继承,。
    在接口的多重继承中extends关键字只需要使用一次,在其后跟着继承接口。 如下所示:

    public interface Hockey extends Sports, Event

    以上的程序片段是合法定义的子接口,与类不同的是,接口允许多重继承,而 Sports及 Event 可能定义或是继承相同的方法

    标记接口

    标记接口 最常用的继承接口是没有包含任何方法的接口。
    标记接口是没有任何方法和属性的接口.它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。
    标记接口作用:简单形象的说就是给某个对象打个标(盖个戳),使对象拥有某个或某些特权。

    例如:java.awt.event包中的MouseListener接口继承的java.util.EventListener接口定义如下:

    package java.util;
    public interface EventListener
    {}

    没有任何方法的接口被称为标记接口。标记接口主要用于以下两种目的:
    1:建立一个公共的父接口: 正如EventListener接口,这是由几十个其他接口扩展的Java API,你可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。
    2:向一个类添加数据类型: 这种情况是标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过多态性变成一个接口类型。

  • 相关阅读:
    ColorPix——到目前为止最好用的屏幕取色器
    ES+VBA 实现批量添加网络图片
    SQL语句-delete语句
    Visual C++ 2013 and Visual C++ Redistributable Package 更新版官网下载地址
    centos长ping输出日志的脚本
    Centos 常用命令
    c#连接数据库
    C#窗体间的跳转传值
    c#邮件发送
    C#WIFI搜索与连接
  • 原文地址:https://www.cnblogs.com/lely/p/10175718.html
Copyright © 2011-2022 走看看