1.封装:隐藏事物细节,提供对外访问接口.作用:简化代码,实现代码复用;保护数据安全性.
对功能的封装:将实现特定功能的代码段封装成一个方法.作用:简化代码,实现代码复用
对属性的封装:私有化属性,给属性提供获得属性和设置属性公有方法.作用:保护数据安全性.
自动封装属性:
eg:/**
* 私有化属性
*/
private int tage;
/**
* 给年龄属性设置的方法
* @param tage 年龄
*/
public void setTage(int tage) {
if(tage>0&&tage<=200) {
this.tage=tage;
}else {
System.out.println("你输入的年龄有误!");
}
}
/**
* 获得年龄属性
* @return int 年龄属性
*/
public int getTage() {
return tage;
}
继承:满足is-a关系或功能复用就可以用继承.
2.1:继承的作用:简化代码,实现代码复用.
2.2:继承的关键字:extends
4.方法重写:
4.1:适用场景:当子类继承父类的方法后,继承过来的方法无法满足子类的需求时,就可以在子类 中重写从父类继承过来的方法.
4.2:方法重写条件:
4.2.1:有方法重写就一定有继承关系.
4.2.2:子类中重写的方法的方法名和形参列表与父类中被重写方法的方法名和形参列表相 同.
方法重写 VS 方法重载
1 :适用场景不同:方法重写是用于当子类继承父类的方法后,继承过来的方法无法满足子类的 需求时才用的;方法重载是用于在同一类中解决功能相同的方法的命名和调 用问题.
2:条件不同:方法重写的条件是:有方法重写一定有继承关系,且子类重写的方法与父类被重写 的方法名和形参列表相同,返回值类型相同或兼容,访问修饰符相同或范围更大;
方法重载的条件是:同一个类中,方法名相同,参数列表不同;
.3:检查不同:方法重写可以用@Override注解自动判断是否是方法重写;方法重载只有开发人 员根据条件人为判断
super:指代父类对象的引用.
1:用super调用父类属性:super.属性名;
.2:用super调用父类方法:super.方法名([参数1,参数2...]);
3:用super调用父类构造方法,只能写在构造方法的第一行:super([参数1,参数2...])
多态:有多态一定有继承和方法重写.
1:多态的概念:
生活中多态:同一种事件在不同情况下有不同状态.
程序中多态:用父类或父接口作为数据类型,指向不同的子类对象,调用相同的方法,执行的 却是不同操作.
eg:public class Feeder {
/**
* 喂食
* 多态的第二种应用:用父类或父接口作为方法形参,实参传子类对象,调用相同的方法,执行不同操作
* @param t1
*/
public void feedAnimal(Animal t1) {
System.out.println("饲养员在喂食");
t1.eat();
}
}
public static void main(String[] args) {
/*多成的第二种应用:用父类作方法形参数据类型,实参传子类对象,调用相同方法,执行不同操作*/
//创建对象
Feeder f=new Feeder();
Tigger a1=new Tigger();
Rabbit a2=new Rabbit();
//用对象调用方法
f.feedAnimal(a1);
f.feedAnimal(a2);
}
static:静态的,扩展修饰符.可以修饰成员变量(属性)和方法.
.1:静态变量(静态属性):用static修饰成员变量叫静态变量.静态变量属于类,耗内存.
注意:静态方法中不可以使用this和super关键字,原因是静态方法属于类,可以用类名调 用,所以静态方法中this和super无法指代,不可以使用.
静态方法可以被子类继承和调用,但是不能被子类重写.
final:最终的,扩展修饰符.可以修饰类,变量,方法.
3.1:最终类(断子绝孙类):用final修饰的类叫最终类.最终类不能被继承.
3.2:最终方法:用final修饰的方法叫最终方法.最终方法不能被重写.
3.3:常量:用final修饰的变量叫常量.常量一生只赋一次值,一但赋值不可更改.
成员常量:在类中直接声明的常量叫成员常量.成员常量只能在声明时同时赋值或者在动态 代码块中赋值或者在构造方法中赋值,但是要确保当前类中所有构造都给常
接口:是一种特殊抽象类.
1.1:接口的本质:是一种规范,也是一种约定,是一种扩展功能.
接口的特征:
1.3.1:接口不能实例化(不能创建对象).且接口中没有构造方法.
1.3.2:接口中变量默认全是静态常量,所以接口中变量前面默认会
加public static final修饰;
/**
* 游泳的接口
* @author sx
* @version 2021年8月10日
*/
public interface Swimming {
/**
* 接口中变量默认全是静态常量,因此系统会在接口中变量前面默认加public static final修饰
*/
int NUM=1;
/**
* 接口中方法默认全是抽象方法,因此系统会在接口中方法前面默认加public abstrack修饰
*/
void show1();
/**
* 在jdk1.8之后,接口中还可以有静态方法
*/
public static void show2() {
System.out.println("这是接口中静态方法show2");
}
/**
* 在jdk1.8之后,接口中还可以有扩展方法
*/
public default void show3() {
System.out.println("这是接口中扩展方法show3");
}
}
/**
* 飞的接口,接口可以继承其他接口
* @author sx
* @version 2021年8月10日
*/
public interface Fly extends Swimming{
}
/**
* 宠物抽象类
* @author sx
* @version 2021年8月10日
*/
public abstract class Pet {
public String nickName;
public char sex;
}
/**
* 猫类,实现接口
* @author sx
* @version 2021年8月10日
*/
public class Cat extends Pet implements Swimming,Fly {
/**
* 重写父接口中抽象方法
*/
@Override
public void show1() {
System.out.println("猫类重写的父接口中抽象方法show1");
}
}
抽象类 VS 接口
3.1:相同点
3.1.1:都不能实例化(都不能创建对象).
3.1.2:抽象类和接口中抽象方法都要求子类必须重写,除非子类也是抽象的.
3.1.3:抽象类和接口中都可以声明静态常量.
3.1.4:抽象类和接口中都可以有抽象方法和静态方法.
3.1.5:抽象类和接口都可以生成.class(字节码)文件
3.1.6:抽象类和接口都是一种引用数据类型.
不同点:
3.2.1:作用不同:抽象类作用让子类去继承,实现代码复用和规定子类必须拥有的行为;
接口的作用提高程序可扩展性和可维护性.
3.2.2:适用场景不同:抽象类的适用场景是当一个类创建对象没有任何意义或都这个类有一 个方法为抽象方法,这个类就可以声明抽象类;
接口的适用场景是当一个类有一个可有可无的扩展功能,那么扩展功 能就可以声明在接口中,那么这个类需要这个功能就实现接口,不 需要就可以不实现.
3.2.3:构造方法不同:抽象类中有构造方法,它的作用供子类调用;
接口中没有构造方法;
3.2.4:方法不同:抽象类中既可以有普通方法也可以有抽象方法;
接口中默认所有方法全是抽象方法,只是jdk1.8后,接口中还可以有静态 方法和扩展方法.
3.2.5:变量不同:抽象类中既然可以有成员变量,也可以有静态常量;
接口中默认全是静态常量.
3.2.6:一个类只能继承一个抽象类,一个类却可以实现多个接口.
3.2.7:抽象类中可以有代码块;接口中不能有代码块;
4.接口回调:先有接口的使用者,再有接口的实现者.
5.(扩展)JDK1.8后,接口中可以静态方法和扩展方法.
5.1:接口中静态方法增加程序灵活性.
5.2:接口中扩展方法增加程序可维护性.
5.3:当一个类的父类和父接口中拥有相同的方法时,这个类是继承了父类的方法.
(父类与父接口拥有相同的方法时,类优先)
5.4:当一个类有两个及以上父接口,且这多个父接口中拥有相同的方法时,子类会因冲突而报错;
解决冲突方法是,让子类重写父接口中相同方法.