java学习
一.接口
1.介绍
定义接口需要使用到关键字interface去定义接口。
格式如下:
类与接口的关系不是继承,而是实现,用关键字 implements ,格式如下:
这个类去实现接口,其中的关系就相当于,接口是类的“干爹”,因为类可以实现多个接口,而继承虽然可以多层继承,但是父类只能有一个,而接口作为“干爹”的关系可以有很多个。
一个类可以同时继承父类,也可以同时实现多个接口。
但是要分清楚主次关系,当亲爹与干爹有相同的方法名时,调用子类的方法会优先调用亲爹的方法。
public class test {public static void main(String[] args) {B.run();}
}interface A {
static void run(){System.out.println("我是干爹");
}
}class D{static void run(){System.out.println("我是亲爹");}
}class B extends com.learn.java.D implements A{}
2.特点
接口里面不能有成员变量,它会默认加上 public static final。
我们在定义的时候一定要赋初值,不然会报错。
在JDK7.0版本及其之前版本中,接口中仅支持公有的抽象方法:
public abstract 返回值类型 方法名();
Δ事实上,接口中的方法默认就是公有抽象方法,因此在接口中定义抽象方法时,可以省略掉abstract关键字。
从JDK8.0开始,接口中可以由默认方法和静态方法:
默认方法——public default 返回值类型 方法名() {
}
静态方法——public static 返回值类型 方法名() {
}
需要注意的是,想定义默认方法必须在前面添加default关键字,因为接口中的方法如果你什么都不写,默认是公有的抽象的方法。默认方法可以有方法体,且不需要实现类去实现,其实就是我们平时见到的普通的成员方法。但是默认方法是可以被实现类重写的。default关键字只能在接口中使用,就算实现类要重写默认方法,实现类中重写后的方法也不能添加default修饰符,不然IDEA报错。
JDK9.0以后,接口中可以有私有方法 :
private 返回值类型 方法名() {
}
注意:接口不能被实例化,也就是不能创建对象。
接口的子类可以是抽象类,也可以是普通类(需要实现接口的所有方法)。
二.泛型
定义:泛型是Java编程语言中的一个特性,它允许在编写类、接口和方法时使用参数化类型。通过使用泛型,可以使得代码更加灵活、可重用,并提高类型安全性。
如果不使用泛型,集合可以加入任意类型的数据。
ArrayList k=new ArrayList();k.add("12");k.add("1212");k.add(new Student());k.add(12);
并且不会报错,但是我们在处理数据时,有时需要将数据统一类型,在输出时。
虽然在写代码时没有报错,但是在运行会出现错误,所以我们需要给集合定义一个我们需要的泛型
这时就会在外面写代码的时候就发现错误。
总之,泛型是Java编程语言中的一项重要特性,它提供了一种灵活、类型安全的方式来处理不同类型的数据,并提高了代码的可重用性和可读性。
下面是泛型的一些特点:
-
参数化类型:泛型允许在类、接口或方法中使用参数,这些参数可以用于定义类型。这样一来,类、接口或方法可以与不同的数据类型进行交互。
-
类型安全:泛型在编译时提供类型检查,确保类型的一致性。这可以在编译时捕获一些类型错误,而不是在运行时出现异常。
-
代码重用:泛型提供了一种通用的方法来编写代码,可以在不同类型之间进行重用。这使得代码更加模块化和可维护。
-
减少类型转换:使用泛型可以减少代码中的类型转换,因为编译器会确保类型的一致性,不再需要手动转换类型。
-
提高可读性:泛型使得代码更加清晰易懂,因为可以直观地看出代码中使用的数据类型。
-
集合框架支持:Java集合框架中的大部分类都使用了泛型,例如
ArrayList<T>
、HashMap<K, V>
等。这使得集合中存储的元素类型更加明确,提高了代码的安全性和可读性。 -
自定义泛型类、接口和方法:除了使用Java标准库中提供的泛型类型外,开发人员还可以创建自己的泛型类、接口和方法,以满足特定需求。