继承和接口
2020-10-18 本文已影响0人
山不转人自转
继承(class 子类 extends 父类)
Override:方法重写只改动方法体。
继承不能继承父类私有属性及私有方法,构造方法(构造方法的名字和类名一样所以无法继承)。
但是在继承父类后子类 子类的构造方法都有一句默认的super();
super和this的含义:
super:为父类的引用
this:为当前对象的引用
java的继承只能继承一个,但接口可以接好多个(可以理解为被继承的是亲爹,被实现的接口就是干爹)。
所有类默认继承Object。
抽象类(abstract):抽象方法是不含方法体的。
如果继承的父类是抽象类,必须重写所有抽象方法,否则我,该子类必须定义为抽象类。
我们把重写抽象类的过程称为实现方法。
接口:
public interface 接口名称 {
抽象方法
abstract void 抽象方法名;
默认方法
public default void method() { }
静态方法
public static void method2() { }
私有方法
private void method(){ }
}
子类实现接口:class 类名 implements 接口名
方法和变量都是遵守接近原则。
与类继承不同 ,一个接口可以继承多个接口。
接口中只能定义常量不能定义其他变量;
public static final int num=10;
接口中默认加上了public static final修饰;
所以int num=10;就行了。
多态
父类类型 变量名 = new 子类对象; 变量名.方法名();
注意:如果子类要调用的方法有而父类没有则需要向下转型:如:
Animal a = new Cat();
Cat c =(Cat) a;
final 关键字:常量
类:被修饰的类,不能被继承。
方法:被修饰的方法,不能被重写。
变量:被修饰的变量,不能被重新赋值。
权限修饰符:
public>protected>default>private
匿名内部类
前提:匿名内部类必须继承一个父类或者实现一个父接口。
格式:
new 父类名或者接口名(){
// 方法重写
@Override
public void method() {
方法体
}
};
当接口做为方法参数和返回类型时
//随便获取一个可以游泳的对象即可
public static Swimable getSwimableObj(){
SwimStudent ss=new SwimStudent();
SwimTeacher st=new SwimTeacher();
//返回的是SwimTeacher 的对象
return st;
}
Lambda表达式:
面向对象的思想:
做一件事情,找一个能解决这个事情的对象,调用对象的方法,完成事情.
//正常写法
Comparator<Person> comp = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() ‐ o2.getAge();
}
};
Arrays.sort(array, comp); // 第二个参数为排序规则,即Comparator接口实例
//Lambda
Arrays.sort(array, (Person a, Person b) ‐> {
return a.getAge() ‐ b.getAge();
});
Lambda省略规则
- 小括号内参数的类型可以省略;
- 如果小括号内有且仅有一个参,则小括号可以省略;
- 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号。
如 invokeCook(() ‐> System.out.println("吃饭啦!"));
匿名内部类
new Start(new Task() {
@Override
public void task() {
System.out.println("开启任务啦!");
}
}).run();
转换为:Lambda
new Start(() ‐> System.out.println("使用lambda表达式开启任务!")
).run();