在之前的学习中,父类其实就是子类的抽象了,比如老虎和兔子都可以被抽象成动物。抽象类是更进一步的抽象,而接口是在抽象类的基础上又抽象了一层。
一、抽象类和抽象方法
1.抽象方法只有方法名,没有方法体。
//抽象类
public abstract class Person {
//无参构造函数
public Person(){
}
//有参构造函数
public Person(String name){
}
//抽象方法
public abstract void run();
//非抽象方法
public void sayHello(){
System.out.println("hello,the last day of June");
}
}
2.抽象类里可以没有抽象方法,但是只要该类包含一个抽象方法,那么这个类就是抽象类(that is to say,抽象类里可以有非抽象方法)。
3. 抽象类存在构造器(构造函数)吗?
有,并且有参无参都可以有。因为其子类实例化的时候要先调用父类的构造函数,也就是抽象类的构造函数,所以抽象类是有构造函数的。
4. 抽象类不能被实例化(虽然它有构造方法),只能作为其他类的父类
5. 但是由于类只能单继承的局限性,抽象类用的没有接口多(接口可以实现多继承)。
6. 子类实现抽象类依然是extends关键字,如果子类不加abstract关键字必须实现抽象类的所有抽象方法,如果子类加了abstract那么可以一个都不实现。
二、接口
1. 重要理解,接口实现的是can-do
2. 接口只能写“规范”,都是抽象方法,无法写具体的实现(不能出现非抽象的方法)(新版JDK可以在接口里写方法体了!)。
2. 接口内的方法默认都是被“public abstract”修饰,可以不写;接口的属性默认都是被“public static final”修饰。but在抽象的时候一般只抽象方法,不会在接口里写属性。
3. 实现类用implements关键字,必须实现接口规定的所有方法(但是新版JDK可以不实现所有方法了!。
4. 接口没有构造函数,自然无法实例化(抽象类有构造函数,也不能实例化)。
5. 利用接口实现多继承。在下例中,当前类必须要实现UserService和TimeService的所有方法。
面试题:使用extends和implements的区别
1)extends只能单继承,implements可以实现多继承
2)extends子类不用重写所有的抽象方法,implements子类要重写所有的抽象方法。
面试题:java 实现多个implements,但是有同名方法怎么办?
经过我的测试
当两个方法返回值相同,参数也相同时,编译器会当做一个方法,实现类只需要重写一次就行,并且不会出错当参数相同,返回值不同时,编译器报错(我猜编译器去匹配应该调用哪个方法的时候,只看方法名和参数类型及个数,根本不看返回值。也就是说如下图所示,如果我们在程序里写了new Test.same(),编译器会犯嘀咕,到底应该调用返回值是void的方法还是调用返回值是int的方法呢?程序员也没说明白啊。所以直接报错,交给程序员自己去解释清楚!重写也是这样,返回值不同的不叫重写!)
当参数不同,返回值相同时,当做两个方法,分别重写当参数和返回值都不同时,当做两个方法,分别重写
根本就和返回值类型没关系:
- 当参数相同时,当做同一个方法
- 当参数不同(形参个数不同或者个数相同类型不同)时,当做两个方法
但是考虑一种情况:
- 当参数相同,返回值不同时,报错!
三、内部类
为什么这个类要放在内部?因为就外部那个类自己用,别的类都不用。
概念不用硬记,可以后续慢慢了解
1. 成员内部类
1)内部类如何实例化?
2)内部类可以获得外部类的private属性
2. 静态内部类
静态内部类不能获得外部类的private成员,因为静态类加载的时候id还没加载。
3. 局部内部类
在方法中的类