栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

面向对象之继承、多态、接口

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

面向对象之继承、多态、接口

一.继承

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

1.继承的格式

class 父类 {
}

class 子类 extends 父类 {
}

2.继承的特点与好处

        特点:只支持单继承,不支持多继承,但支持多重继承。

        好处:提高了代码的复用性,提高了代码的维护性

3.super与this关键字的特点

        super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

        this关键字:指向自己的引用。

class Animal {
  void eat() {
    System.out.println("animal : eat");
  }
}

class Dog extends Animal {
  void eat() {
    System.out.println("dog : eat");
  }
  void eatTest() {
    this.eat();   // this 调用自己的方法
    super.eat();  // super 调用父类方法
  }
}

public class Test {
  public static void main(String[] args) {
    Animal a = new Animal();
    a.eat();
    Dog d = new Dog();
    d.eatTest();
  }
}

4.final

        final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:

//声明类
final class 类名 {//类体}

//声明方法
修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}

5.继承中构造方法的访问

        1)子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。

        2)如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

二.方法的重载与重写

1.重写(Override)

重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!

重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。

class Animal{
   public void move(){
      System.out.println("动物可以移动");
   }
}

class Dog extends Animal{
   public void move(){
      System.out.println("狗可以跑和走");
   }
}

public class TestDog{
   public static void main(String args[]){
      Animal a = new Animal(); // Animal 对象
      Animal b = new Dog(); // Dog 对象

      a.move();// 执行 Animal 类的方法

      b.move();//执行 Dog 类的方法
   }
}

2.重载(Overload)

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

public class Overloading {
    public int test(){
        System.out.println("test1");
        return 1;
    }

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

    //以下两个参数类型顺序不同
    public String test(int a,String s){
        System.out.println("test3");
        return "returntest3";
    }   

    public String test(String s,int a){
        System.out.println("test4");
        return "returntest4";
    }   

    public static void main(String[] args){
        Overloading o = new Overloading();
        System.out.println(o.test());
        o.test(1);
        System.out.println(o.test(1,"test3"));
        System.out.println(o.test("test4",1));
    }
}
三.多态

多态是同一个行为具有多个不同表现形式或形态的能力。

1.前提条件

        1)需要存在继承关系

        2)存在方法重写,子类继承父类,将部分功能进行重写

        3)必须存在:父类引用指向子类对象:向上转型

2.格式

        父类名  对象名  =  new  子类名( ) ;

3.多态的成员访问特点

        成员变量

                编译看左,运行看左

        成员方法

                编译看左,运行看右  (因为存在方法重写,所以子类的功能将父类的功能覆盖了)

        静态方法

                编译看左,运行看左  (不属于方法超重写,可以用类名直接访问)

        构造方法

                有参方法/无参方法

4.多态的好处与弊端

好处

        1).提高代码的复用性

        2).提高代码的扩展性

四.抽象类

如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类不能直接实例化,但是可以通过具体的子类进行实例化,抽象类多态;

1.格式

        抽象的父类名  对象名  =  new  具体的子类名 ()  ;

2.声明抽象方法

  • 如果一个类包含抽象方法,那么该类必须是抽象类。
  • 任何子类必须重写父类的抽象方法,或者声明自身为抽象类。

3.抽象方法

Abstract 关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。

public abstract class Employee {
   private String name;
   private String address;
   private int number;

   public abstract double computePay();

   //其余代码
}

4.抽象类总结

  • 抽象类不能被实例化,如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
  • 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
  • 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
  • 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
  • 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类
五.接口

接口(Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

1.接口的特性

  • 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
  • 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
  • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

2.接口的声明

        1)声明语法格式

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

        2)implements:实现关系

import java.lang.*;
//引入包

public interface NameOfInterface {
   //任何类型 final, static 字段
   //抽象方法
}

3.接口的实现

public class MammalInt implements Animal{

   public void eat(){
      System.out.println("Mammal eats");
   }

   public void travel(){
      System.out.println("Mammal travels");
   } 

   public int noOfLegs(){
      return 0;
   }

   public static void main(String args[]){
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
}

   4.接口的继承

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

// 文件名: Sports.java
public interface Sports {
   public void setHomeTeam(String name);
   public void setVisitingTeam(String name);
}

// 文件名: Football.java
public interface Football extends Sports {
   public void homeTeamScored(int points);
   public void visitingTeamScored(int points);
   public void endOfQuarter(int quarter);
}

// 文件名: Hockey.java
public interface Hockey extends Sports {
   public void homeGoalScored();
   public void visitingGoalScored();
   public void endOfPeriod(int period);
   public void overtimePeriod(int ot);
}
 六.内部类    

1.什么是内部类

        在一个类中定义另一个类;

2.内部类的分类

        成员内部类:在外部类的成员位置中定义
        局部内部类:在外部类的局部位置中定义(方法定义中)

3.内部类特点

        都可以直接访问外部类的成员,包括私有!

4.访问成员内部类格式

        外部类名.内部类名 对象名 = 外部类对象.内部类对象;

5.访问静态成员内部类格式

        外部类名.内部类名 对象名  = new 外部类名.内部类名() ;

6.匿名内部类格式

new 类名(抽象类)/接口名(){
		重写抽象方法	
	};
七.局部变量和成员变量的区别?

1).位置不同
    局部变量:在方法定义中或者方法声明上
    成员变量:在类中,方法外
2).作用位置不同
    局部变量:在栈内存中
    成员变量:在堆内存中
3).生命周期不同
    局部变量:随着方法的调用而存在,随着方法调用结束而消失
    成员变量:随着对象的创建而存在,随着对象的创建完毕等待垃圾回收器回收而消失
4).初始化不用
    局部变量:在使用之前必须将其初始化;
    成员变量:可以不初始化,系统会给出默认的值

八.成员变量和静态变量有什么区别?

1).数据存储位置不同
    静态变量:方法区中的静态区域
    成员变量:在堆中
2).别名不同
    静态变量;跟类有关
    成员变量:跟对象有关
3).生命周期不同
    静态变量:随着类的加载而加载
    成员变量;随着对象的创建而存在
4).调用方式不同
    静态变量:使用对象名访问
    成员变量:通过对象访问

九.抽象类和接口的区别?

1).成员区别
    抽象类:成员变量:可以是常量,也可以是变量
                成员方法:可以是抽象方法,也可以是非抽象方法
                构造方法:无参构造,有参构造方法都有
    接  口:  成员变量:只能是常量
                成员方法:只能是抽象方法
                构造方法:没有构造方法
2).关系区别
        类与类之间的继承关系,只能单继承,不能多继承,可以多层继承
        类与接口之间用implements实现,一个类继承另一个类时可以实现多个接口
        接口与接口的关系是继承extends
3).设计理念不同
        抽象类;存在继承关系,体现is a
        接口:接口体现的一种事物本身之外的额外功能,和类时一种实现关系

        

  

        

        

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/327867.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号