zoukankan      html  css  js  c++  java
  • Java类的特点——多态、抽象

      所谓多态,顾名思义,就是多种形式多种状态。多态可以说是面向对象编程的精髓所在。因此理解多态的含义对理解面向对象编程有特别重要的意义。Java之所以引入多态的概念,原因之一是它在类的继承问题上与C++不同,C++允许多继承,这确实给它带来了非常强大的功能,但是多继承必然会引起程序错综复杂,难于阅读理解。为了规避这种风险,java采取了单继承的方法,虽然这样使继承关系简单明了,但是同时也限制了其功能的实现。为了弥补这点不足,java引入了多态性的概念。

      多态有两种理解方式,第一种是对像的不同方法可以用相同的一个方法名,即重载。另一种是同一对象根据不同的消息执行相应的行为,也就是,发送一个消息给某一个对象,让对象自行选择哪种行为。由此可以将多态分为静态多态和动态多态

      静态多态指的是程序在编译时,系统就能决定调用哪个方法,所以也成为编译时多态。在java中实现静态多态的实现方式是方法重载。

      动态多态指在运行中系统才能动态确定方法所指的对象,所以也称为运行时多态。动态多态的实现方式是重写父类中的同名成员方法。动态多态主要是通过动态绑定和重写的机制来实现的。

    //定义一个shape类
    public class Shape {
      public void draw(){
        System.out.println("画一个图形");
      }
    }

    //定义一个多边形子类,继承Shape类
    public class Rectangle extends Shape{
      private int width;
      private int height;
      //with访问修改方法
      public int getWidth() {
        return width;
      }
      public void setWidth(int width) {
        if(width>=1&&width<=15){
        this.width = width;
        }
      }
      //height访问修改方法
      public int getHeight() {
        return height;
      }
      public void setHeight(int height) {
        if(height>=1&&height<=15){
        this.height = height;
        }
      }
      //重写父类draw方法
      public void draw(){
        System.out.println("******* * * *******");
      }
    }

    //定义一个多边形子类,继承Shape类
    public class Rectangle extends Shape{
      private int width;
      private int height;
      //with访问修改方法
      public int getWidth() {
        return width;
      }
      public void setWidth(int width) {
        if(width>=1&&width<=15){
          this.width = width;
        }
      }
      //height访问修改方法
      public int getHeight() {
        return height;
      }
      public void setHeight(int height) {
        if(height>=1&&height<=15){
        this.height = height;
        }
      }
      //重写父类draw方法
      public void draw(){
        System.out.println("******* * * *******");
      }
    }

    //定义一个Aritst类,将Shape类型的变量传给此类
    public class Artist{
      public void drawShape(Shape shape){
        shape.draw();
      }
    }

    //写一个main方法
    public class ArtistDemo {
      public static void main(String[] args){
        //建个Shape类对象
        Shape shape=new Shape();
        //建个Rectangle类对象
        Rectangle rectangle=new Rectangle();
        //建个RightTriangle对象
        RightTriangle rt=new RightTriangle();
        //建个Artist对象
        Artist artist=new Artist();

        artist.drawShape(shape);
        artist.drawShape(rectangle);
        artist.drawShape(rt);

      }
    }

    上面程序输出的结果是:

    画一个图形
    *******
    * *
    *******
    *
    ***
    *****
    *******

    由此可见动态多态在运行中系统才能动态确定方法所指的对象,传递不同的对象,只要在子类中有重写该方法就会执行子类的方法,没有重写时才会调用父类的方法。

      此外java类还有抽象这个特点,抽象用关键字abstract修饰。经过abstract修饰过的类称为抽象类,抽象类只可以用来继承,不可以用来产生对象。进过abstract修饰的方法称为抽象方法,一个类一旦有了抽象方法,那么这个类也要变成抽象类。在继承了一个有抽象方法的抽象类时,这个子类必须重写重新类中的抽象方法。这样就要求合理设计类与类之间的继承关系并且规范了子类。

    //定义一个静态类
    public abstract class Mammal {
      public void breathe(){
        System.out.println("Mammal is breathing");
      }
      //定义一个静态方法
      public abstract void nurse();
    }

    //定义一个鲸类,继承Mammal类
    public class Whale extends Mammal{
      public void breathe(){
        System.out.println("Whale is breathing");
        super.breathe();
      }
      //重写nurse静态方法
      public void nurse(){
        System.out.println("Whale is nursing");
      }
    }

    //定义一个Cat类
    public class Cat extends Mammal{
      public void breathe(){
        System.out.println("Cat");
      }
      //这里没有重写nurse静态方法,编译就要报错
      public void nurse(int t){
        System.out.println("cat nurse");
      }
    }

    public class TestMain {
      //定义一个main方法
      public static void main(String[] args){
        Mammal w=new Whale();
        w.breathe();
        w.nurse();
        Mammal m=w;
        m.breathe();
        m.nurse();
        System.out.println(m instanceof Whale);
        System.out.println(w instanceof Mammal);
        System.out.println(m instanceof Cat);
      }
    }

  • 相关阅读:
    User Get 'Access Denied' with Excel Service WebPart
    How To Search and Restore files from Site Collection Recycle Bin
    How To Collect ULS Log from SharePoint Farm
    How To Restart timer service on all servers in farm
    How to Operate SharePoint User Alerts with PowerShell
    How to get Timer Job History
    Synchronization Service Manager
    SharePoint 2007 Full Text Searching PowerShell and CS file content with SharePoint Search
    0x80040E14 Caused by Max Url Length bug
    SharePoint 2007 User Re-created in AD with new SID issue on MySite
  • 原文地址:https://www.cnblogs.com/leafde/p/3671764.html
Copyright © 2011-2022 走看看