JAVA基础之接口

接口

学习完框架之后,整合SSM过程中对于接口的认识加深了许多。根据《java核心技术》这本书进一步研究了一下。

1.概念

java核心技术是这样说的:“在Java程序设计中,接口不是类,而是对希望符合这个接口的类的一组需求”。

  • 首先:接口不是类;
  • 其次:接口是符合这个接口的类的一组需求;

第二点的意思就是说接口需要有一个实现类对它进行实现;

2.具体实现

  • 通过源码研究一下
public interface Comparable<T> {
    public int compareTo(T o);
}
    • 接口就是对需求的一个展示,谁使用谁就需要去重写一个方法;
    • 接口使用“interface”关键字代替“class”关键字。
    • 实际上接口中的所有方法都是公开,接口中的方法中的public可以不用书写,但是很多人为了代码结构的完整性都会加上。
  • 实现类

class Employee implements Comparable<Employee>{
	private String name;
	private double salary;
	
	public Employee(String name, double salary) {
		this.name = name;
		this.salary = salary;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	@Override
	public String toString() {
		return "Employee [name=" + name + ", salary=" + salary + "]";
	}
	@Override
	public int compareTo(Employee o) {
		// TODO Auto-generated method stub
		/*
		 * 按照价格排序
		 */
		return Double.compare(salary, o.salary);
	}	
}
    • 1.实现类必须继承接口的方法,参数,返回值必须保持一致;
    • 2.Arrays.sort(T)这个方法很重要,T这个对象必须实现Comparable接口才能使用,因为sort方法是通过Comparable接口中的comparaTo()进行比较的,具体情况看源码;
  • 具体使用

    public class EmployeeSortTest {
    
    	public static void main(String[] args) {
    		var staff = new Employee[3];
    		
    		staff[0] = new Employee("Harry Hacker",35000);
    		staff[1] = new Employee("Carl Cracker",75000);
    		staff[2] = new Employee("Tony Tester",38000);
    		
    		Arrays.sort(staff);
    		
    		for(Employee e:staff) {
    			System.out.println("name="+e.getName()+",salary="+e.getSalary());
    		}
    	}
    }
    

3.属性

  • 接口不是类,不能使用new 创建一个接口对象。但是:

    • 接口可以声明一个接口变量,而且可以通过一个实现类创建这个对象;

      Comparable x;
      x = new Emplyee();
      
  • 接口判断

    System.out.println(staff[2] instanceof Employee);
    System.out.println(staff[1] instanceof Comparable);
    
    • 使用”instanceof“关键字,就可以实现接口的判断;
  • 接口中不能包含实例字段,但是可以包含常量;

    public interface T {
    	
     void so();
     
     int account= 1;
    
    }
    
    • 接口中的字段总是public static final;

4.继承

  • 1.虽然每个类都只有一个父类,但是可以有多个接口;

  • 2.接口也可以继承;

    package com.sun.day01.Com;
    
    public interface Moveable {
    
    	void move(Integer x,Integer y);
    	
    }
    
    package com.sun.day01.Com;
    
    public interface LeftMoveable extends Moveable {
    
    	Integer move(int x,int y);
    }
    

5.接口的兼容性

  • 1.Java中的接口最初设计为抽象类型,可用于类型的多种继承。

  • 2.在Java 1.0中,接口定义只能包含两种成员:静态常量和抽象方法。

  • 3.java8之前,接口基本上没有多大变化;

public interface {
   void so();
   int account= 1;
}
  • 4.java8开始,接口开始发生重大变化,接口中出现了默认方法,接口中可以产生静态方法;

  • 5.Java 9以后的接口中受支持的成员有静态常量,抽象方法,默认方法,静态方法,私有方法,嵌套类,嵌套接口,嵌套枚举和嵌套批注。(还真不少以后慢慢学‘😎😎)

静态方法注意了!!!!

package com.sun.demo;

public interface demoI {

    void sort();

    default int accountSort(){
        return 0;
    }

}
package com.sun.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class demo1 implements demoI{
    public static  void main(String[] args){
        List<String> a = new ArrayList<String>();
        a.add("Libai");
        a.add("Tom");
        for (String adb:a) {
            System.out.println(adb);
        }
        a.remove("2");
        for (String a1:a) {
            System.out.println(a1);
        }
    }

    @Override
    public void sort() {
        System.out.println("没有默认方法");
    }

}

    • 这就极大的增加了代码的兼容性,在接口中增加默认方法部影响,使用过接口的实现类,同时通过默认方法可以规范,接口中需求的不足;
    • 其实,这也违背接口的初衷,但是也不断的让java更加全面;
Tags: