抽象类,接口(interface)与匿名对象
目录
抽象类
abstract:修饰方法和类
- 抽象方法:不同类的方法相似,但具体内容不太一样,抽取它的声明,没有具体方法体的方法.
- 抽象类:有抽象方法的类必须是抽象类
- 注意:一个类继承了抽象类需要重写他所有的抽象方法,否则这个类就得是抽象类
抽象方法特点
- 抽象方法只能在抽象类中
- 抽象类和抽象方法必须被abstract修饰
- 抽象类不能创建对象(不能实例化)
- 抽象类中可以有非抽象的方法
- 抽象类和类的关系也是继承,一个类继承抽象类,要么本身定义为抽象类,要么重写所有抽象方法
抽象类成员特点
- 可以有成员变量 ,可以有常量
- 成员方法:可以有抽象方法,非抽象方法
- 可以有构造方法,对抽象类成员变量初始化
抽象类的一些细节
- 抽象类关键字abstract不能和final共存,因为其定义的成员变量不能被子类继承改写,不能与private共存,因为其修饰的成员变量不能被子类访问
- 抽象类不能创建对象实例化,但是其本身具有构造函数,因为其本身具有成员变量并需要初始化,抽象类本身作为一个类需要被子类继承,过程需要调用父类构造
- 抽象类必须含有抽象方法
接口
继承的特性是单一继承,接口可以实现多个继承,接口里的所有方法全是抽象方法,接口和类的关系是实现,implements
格式: interface 接口名{ }
接口成员特点
- 接口中只能有抽象方法,只能有常量
- 默认且只能使用 public&abstract修饰方法 (建议主动加上默认修饰符)
- 默认使用public static final 修饰成员变量
注意:接口不能创建对象(不能实例化)
类与接口的关系是实现关系,一个类实现一个接口必须实现它的所有方法
接口与类的关系
- 类与类:继承关系,单一继承,多层继承
- 类与接口:实现关系,多实现 (接口中都是抽象方法,可以同时被多个子类实现)
- 接口与接口关系: 继承关系,多层继承
优点: 打破了继承的局限性
对外提供规范(规则)
降低了程序的耦合性 (实现模块化开发,定义好规则后每个人实现自己的模块,提高开发效率)
接口与抽象类区别
区别: Ⅰ与类的关系:
- 接口与类的关系:实现关系,且是多实现,一个类可以对接多个接口
- 抽象类与类关系:继承关系,且java中的继承是单一继承,多层继承,一个类只能有一个父类
Ⅱ 成员变量:
- 接口只能有常量
- 抽象类可以有成员变量,可以有常量
成员方法:
- 接口只能有抽象方法,且方法有默认修饰符 public abstract
- 抽象类可以有抽象方法,可以有非抽象方法
构造方法
- 接口没有构造方法
- 抽象类有构造方法
共性:不断抽取出抽象的概念
例子
package CeShi;
/**
* @author Lzy
* @creat 2021-01-17-20:36
*/
public class InterfaceTest {
public static void main(String[] args) {
//创建软件系学生对象
SoftWare sw = new SoftWare();
sw.name = "小李";
sw.age = 20;
sw.gender = "男";
sw.eat();//继承父类student类继承的Person类实现 eat sleep 方法
sw.sleep();
sw.study();// 继承student实现study
sw.speak();//实现SpeakEnglish接口
System.out.println("--------------");
//创建医学教师
DoctorTeacher ct = new DoctorTeacher();
ct.name = "大刘";
ct.age = 50;
ct.gender = "女";
ct.eat();//继承Teacher类继承的 Person类实现 eat sleep 方法
ct.sleep();
ct.teach();//继承Teacher类实现 teach 方法
}
}
class Person{
String name;//姓名
int age;//年龄
String gender;//性别
//无参构造
public Person(){}
//有参构造
public Person(String name,int age,String gender){
this.name = name;
this.age = age;
this.gender = gender;
}
//吃
public void eat(){
System.out.println("吃饭饭");
}
//睡
public void sleep(){
System.out.println("睡觉觉");
}
}
//学生 继承Person类
abstract class Student extends Person{
//学习
public abstract void study();
}
//老师 继承Person类
abstract class Teacher extends Person{
public abstract void teach();
}
//软件系 继承Student类 实现SpeakEnglish接口
class SoftWare extends Student implements SpeakEnglish{
@Override
public void study(){
System.out.println("学编程");
}
@Override
public void speak(){
System.out.println("说英语");
}
}
//医学系 继承Student类
class Doctor extends Student{
@Override
public void study(){
System.out.println("学医");
}
}
//说英语
interface SpeakEnglish{
public abstract void speak();
}
//软件老师 继承Teacher类 实现SpeakEnglish接口
class SoftWareTeacher extends Teacher implements SpeakEnglish{
@Override
public void teach(){
System.out.println("教编程");
}
@Override
public void speak(){
System.out.println("说英语");
}
}
//医学老师 继承Teacher类
class DoctorTeacher extends Teacher{
@Override
public void teach(){
System.out.println("教医学");
}
}
匿名对象
没有变量引用的对象,用于不需要创建变量直接调用对象的场景
应用场景:当方法只调用一次时候可以使用
package CeShi;
/**
* @author Lzy
* @creat 2021-01-18-10:14
*/
public class Name {
public static void main(String[] args) {
//常规调用方法
Students s = new Students();
s.study();
//匿名对象是没有变量引用的对象
new Students().study();
}
}
class Students{
String name;
int age;
public void study(){
System.out.println("学习");
}
}
可以当作参数进行传递,但无法在传参之前做其他事情
package CeShi;
/**
* @author Lzy
* @creat 2021-01-18-10:14
*/
public class Name {
public static void main(String[] args) {
//常规调用方法,可以对成员变量赋值并调用方法
Students s = new Students();
s.name = "比奇古";
s.age = 18;
method(s);
System.out.println("---------");
//匿名对象 无法在传参之前做其他事情
method(new Students());
}
public static void method(Students s){
}
}
class Students{
String name;
int age;
}
注意:匿名对象可以调用成员变量赋值,但赋值没有意义,因为赋值本身没有调用