理解:接口是一套公共的规范标准
public:修饰的方法–>该方法可以被跨包访问
protected:修饰的方法–>该方法可以被子类访问
private:修饰的方法–>该方法只能被其所在类中的其他方法访问
接口的定义格式
public interface 接口名{ //1.定义抽象方法:默认被public abstract修饰 【可以省略public abstract】 //2.定义默认方法:需要被public和 default(是关键词要写出来和抽象类中的普通方法一样只是通过default关键字做标记) 【可以省略public】 //3.定义静态方法:需要被public和static修饰 【直接接口名调用】 //4.定义私有方法:被private修饰的方法 【只能在本接口中使用】 //5.定义常量: 默认被public static final修饰【public static final可以省略】 }
接口的实现:
public class 类名 implements 接口名{ //1.接口中的抽象方法:必须在其实现类中被重写(复写) //2.接口中的默认方法:可选复写(可写可不写) }
接口的使用:
1.接口不能直接使用,必须有个【实现类】来【实现】该接口
2.接口的实现类必须覆盖重写(实现)接口中的所有抽象方法。
3.创建实现类的对象,进行使用。
接口和抽象类的比较:
抽象类与接口对比的图解:
类与类、类与接口、接口与接口
类与类:单一的继承关系(抽象类也是这样)–>儿子只能有一个亲爹
类与接口:多实现关系 -->儿子可以有多个干爹
接口与接口:多继承关系
抽象类和普通父类都是属于类的概念,只能被单继承,二者不能被同时继承,但是可以分别和接口一同实现–>子类可以继承父类(或抽象类)同时还可以实现接口
接口和抽象类都不能直接被创建对象所以没有构造器
接口与抽象类的使用
抽象类:抽取子类的共性内容–>(和子类的关系是纵向的)
接口:给类做功能扩展–>(和实现类(类似于子类为了区分才叫实现类以及用implements关键字修饰)的关系是横向的)
接口和抽象类是一种互补关系,在开发中根据实际需求合理运用
抽象类中抽象方法的定义方式:
public abstract 返回值类型 方法名称(参数列表);
注意:
1、接口当中的抽象方法,修饰符必须是两个固定的关键字:public abstract
理解:
一个对象有多种数据类型;
多态体现的就是一种子类和父类的可以灵活转换关系,所以多态的实现要基于继承;
多态就是去调用子类的重写的方法(不是变量)体现不同的结果这就是多态。
多态的特性使得方法的调用变得更加灵活,这也是面向对象概念(面向对象的程序设计思想)的核心体现
这么做的核心目的:
就是为了简化代码,提高程序的复用性,性能,效率,可维护性
实现多态的前提:
1、类与类之间存在子-父类关系
2、子类中重写父类的方法
3、父类接收子类的对象
多态成员的访问特点:
1、成员变量:只看父类,父类没有就报错
2、成员方法:如果子类中有方法的重写,就优先执行子类的重写的方法,否则就看父类,父类有就执行,父类没有就报错
小结:有方法的重写才执行子类,没有重写都执行父类
多态的好处:
把父类/接口,作为方法的参数,调用方法的时候可以传递任意的子类/实现类的对象。
小记:
1、工具类里的方法都是静态方法,只含静态方法的类就是工具类;
2、被static关键字修饰的方法不能有this关键字,存在先后关系——因为static修饰的方法是类的方法可以被该类的所有对象调用,随着类被加载而被加载,this关键字是属于对象的,哪个对象调用这个方法,那么这个方法就是属于被这个对象调用
3、成员变量不能被覆盖重写,只有方法才可以
4、Java中的任何一个类(包括自定义的类),默认extends Object,直接或间接是Object类的子类,(object类是根类)
5、常量池中常量的存储也是基于数组实现的
6、接口也可以作为多态体现
方法的重写和方法的重载比较:
1、方法的重写也就是子类重写了父类中的方法(纵向关系)
2、方法的重载就是同一类中同名,而参数列表不同的方法(横向关系)
(方法之间的是否重载,只看方法名是否相同参数列表是否不同–>有无参数,参数个数,参数类型)
与方法的返回值类型,或权限修饰符无关
访问成员变量的两种方式:
1、直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找。
2、间接通过成员方法访问成员变量:看该方法属于谁,优先用谁,没有则向上找。
final(最终的):可以修饰类、方法、变量
1、final关键字用来修饰一个类–>表明该类没有子类(或者不能用final修饰的类作为父类)所以其中的所有方法都不能被重写,当然在final修饰的类中可以重写其父类的方法;
2、final修饰方法–>该方法不能被重写;
final和abstract不能共存(final修饰的方法是不能被重写,而abstract修饰的方法必须要被重写,所以二者冲突)
当final关键字用来修饰一个方法时,这个方法不能被覆盖重写。
修饰符 final 返回值类型 方法名称(参数列表){ //方法体 } 注意: 对于类,方法来说,abstract和final不能同时使用。
final修饰变量
1).final修饰局部变量:被final修饰的变量,只能被赋值一次,不可再被更改
final int num = 10;//num的值固定为10,不能被再次更改
修饰引用变量–>其存储的指向对象的地址不可更改,但对象里面的属性可(成员变量)以更改。
2).final修饰成员变量:成员变量都有默认的值,但是被final关键字修饰的成员变量,没有默认值,必须手动赋值:
1、直接使用=赋值
2、没有直接赋值,可以在构造方法中赋值。
对于成员变量来说,如果用final修饰,这个变量也不可变。
1、由于成员变量具有默认值,所以用了final之后必须手动赋值,不会再给默认值。
2、对于final的成员变量,要么使用直接赋值,要么通过构造方法赋值。二选一
3、必须保证类当中所有重载的构造方法,都最终会对
final的成员变量赋值。