今天读到Java编程思想的接口这一章,我用的是jdk1.8,发现Java接口中有default这个关键字,马上上网一查,原来是Java8中的新特性,然后就开始研究一下,写下一点感悟。
package Dome01;
import org.junit.Test;
public class Domestically {
@Test
public void test(){
//1.不能生成一个抽象类的对象
// Gcenr g = new Gcenr();
Dmeno d = new Dmeno();
//11.实现该接口的类,会自动继承接口中的默认方法(default),如同继承其他类一样
// d.dd();
d.qq();
d.ww();
}
}
//2.如果一个类继承了一个抽象类,必须把抽象类中的抽象方法重写
//3.如果子类继承了抽象类,并没有把抽象方法重写成普通方法,那么子类也是一个抽象类,需要加abstract修饰符
/*6.接口也一样,需要把所有的抽象方法实现一遍;那么问题来了:如果抽象类中的抽象方法也存在于接口中,分三种情况;
* 一是两个抽象方法参数值,返回值一样,那么就会按照接口来,因为子类实现接口的抽象方法,要大于接口的权限修饰符,只能是public;
* 二是两个抽象方法返回值不同,参数相同,那么编译器就会报错,因为不知道调用哪一个方法来实现;(因为还达不到重载的条件)
* 三是两个抽象方法参数不同,这样的情况该调用谁的方法,就调用谁的方法,相当于重载
* */
//12.接口中的static方法的调用:接口名.方法名
//14.default,static方法不强制实现,因为已经是一个完整的方法了;
//
/**
* 15.Java8默认方法引出来的问题:
* 1.一个类实现了多个接口,而多个接口中都有相同的default方法,又回到6中提到的问题了,
* (1).两个抽象方法参数值,返回值一样,那么必须要重写这个方法,在方法里面再调用各自的方法,调用方式为:Ftecr.super.ww();
* (2).两个抽象方法返回值不同,参数相同,那么编译器就会报错,因为不知道调用哪一个方法来实现;(与6 同样的道理)
* (3).两个抽象方法参数不同,这样的情况该调用谁的方法,就调用谁的方法,两个方法相当于重载
* 2.一个类实现了一个接口,同时继承了一个抽象类,接口中的default方法同时存在于抽象类中,
* 这里分两大情况:1.抽象类中的方法没有实现,是抽象方法,那么跟上面的一样;
* 2.抽象类中实现了这个方法,这种情况下多出一种
* (1).两个抽象方法参数值,返回值一样,不必重写方法,因为继承抽象类自带;相当于重写
* (2).两个抽象方法返回值不同,参数相同,那么编译器就会报错,因为不知道调用哪一个方法来实现;
* (3).两个抽象方法参数不同,这样的情况该用谁的方法,就用谁的方法,两个方法不相同
* (4).两个抽象方法参数值,返回值一样,但是抽象类中的实现方法不是public修饰,会报错,因为对于接口来说修饰权限不够
*
* 对于static方法,因为调用它要用接口名.方法名,所以不存在这种问题
* */
class Dmeno extends Gcenr implements Ftecr,Fteted{
@Override
public void f() {
// TODO Auto-generated method stub
System.out.println("ffffff");
}
@Override
public void ss() {
// TODO Auto-generated method stub
}
@Override
void z() {
// TODO Auto-generated method stub
};
//7.实现的抽象方法要比接口的抽象方法权限大,所以要用public;
@Override
public void jj() {
// TODO Auto-generated method stub
}
@Override
public void f(String d) {
// TODO Auto-generated method stub
}
@Override
public void ww() {
// TODO Auto-generated method stub
Ftecr.super.ww();
Fteted.super.ww();
}
}
//4.抽象类中不一定有抽象方法,但有抽象方法的一定是抽象类;
//5.抽象类中可以有普通方法;
abstract class Gcenr{
abstract void f();
abstract void z();
void qq(){
System.out.println("qq");
}
//这里用public
public void ww1(){
System.out.println("Gcenr-ww");
};
}
//接口
interface Ftecr{
abstract void f(String d);
abstract void ss();
//8.java8中的新特性,接口可以创建普通方法,但是要用default或者static修饰,而且只能用于接口中;
//9.可以有多个default,static修饰的方法;
//10.在接口中由default,static修饰的方法必须有完整的实现
//13.default,static修饰的方法相当于一个抽象类了,间接实现多继承
public default void ww() {
System.out.println("Ftecr-ww");
}
public default void ww1() {
System.out.println("Ftecr-ww1");
}
public static void dd(){
}
public static void dd1(){
}
}
interface Fteted{
abstract void jj();
abstract void ss();
public default void ww(){
System.out.println("Fteted-ww");
}
public static void dd1(){
}
}
//接口不能实现接口,但是可以继承另一个接口,接口的超类只能是接口,类的超类只能是类
interface Fteted01 extends Fteted{
// abstract void jj();
abstract void qss();
// public default void ww(){
// System.out.println("Fteted-ww");
// }
}
古人学问无遗力,少壮工夫老始成。
纸上得来终觉浅,绝知此事要躬行。——陆游