接口格式:
interface 接口名{
//成员变量
public static final int i=10;
//成员函数 接口的成员函数不能带有主体,也就是不能有{},也就是说这是个抽象函数
public abstract void print();
}
接口的注意事项:
1.接口是一个特殊的类
2.接口的成员变量默认的修饰符为 public static final 所以接口成员变量都是常量,必须赋值
3.接口中的方法都是抽象的方法,默认的修饰符为public abstract
4.接口不能创建对象,因为接口中的方法是抽象的方法
5.接口是没有构造方法的,抽象类可以有,是因为可以初始化父类的成员变量,而接口的成员变量都是常量
6.接口是给类去实现使用的,非抽象类实现一个接口的时候,必须要把接口中的所有方法全部实现
接口的作用:
1.拓展功能。
2.定义约束规范。
3.程序的解耦。(最重要最突出的作用、程序与程序之间要有低耦合)
类与接口之间的关系: 实现关系
类与接口要注意的事项:
1.非抽象类实现一个接口时,必须要把接口中的所有方法实现。
2.抽象类实现一个接口时,可以实现接口内的方法,也可以不实现
3.一个类可以实现多个接口
疑问:java为什么不支持多继承,而支持了多实现呢?????
答:多继承会产生一个问题,多个同名而不同内容的方法,编译器无法选择到底用哪个方法,这就产生了冲突,而接口可以多继承,因为接口的方法都为抽象方法,虽然同名,但是没有内容
接口与接口之间的关系: 继承关系
接口与接口之间要注意的事项:
一个接口是可以继承多个接口的
例:
interface A{
public static final int i=10;
public abstract void print();
}
class Demo7 implements A{//Demo7就实现了A接口
public static void main(String[] args){
Demo7 d=new Demo7();
d.print();
}
public void print(){
System.out.println("这个是接口中的print方法");
}
}
例:
//实现一个带橡皮的铅笔具有铅笔的write功能,也拥有橡皮的rasure功能(运用接口)
abstract class Pencil{ //抽象类铅笔,因使用抽象方法,所以必须是抽象类
String color; //成员变量 颜色
public Pencil(String color){ //构造函数
this.color=color; //将形参指向成员变量
}
public abstract void write(); //抽象方法,使子类都将写上该方法
}
interface Rubber{ //橡皮接口
public abstract void rasure(); //接口的成员方法,接口的成员方法必须是抽象方法
}
//新建带橡皮的铅笔类,继承铅笔类,实现橡皮接口
class PencilRubber extends Pencil implements Rubber{
//构造代码块,在新建对象时调用这两个方法,并且构造代码块需写在最上方
{
write();
rasure();
}
public PencilRubber(String color){ //构造函数
super(color); //super关键字,指向父类的成员变量
}
public void write(){ //铅笔类的方法
System.out.println(color+"的铅笔在沙沙的写字");
}
public void rasure(){ //橡皮接口的方法
System.out.println("橡皮在涂改");
}
}
class Demo1 {
public static void main(String[] args) {
PencilRubber p=new PencilRubber("蓝色"); //new一个带橡皮的铅笔,并赋予其值,通过构造代码块的功能输出该类功能
}
}
例2:
package Demo;
/*一个普通学生类,具备一个学习的功能,某些同学在学习之余还可以自己挣钱交学费
* interface定义接口
* implements实现接口
* 分析:普通的学生类、接口(挣钱属于拓展功能)、会挣钱的学生
*/
class Student{
String name;
public Student(String name){
this.name=name;
}
public void study(){
System.out.println(name+"好好学习,天天向上");
}
}
interface Money{
public void makeMoney();
}
class MoneyStudent extends Student implements Money{
public MoneyStudent(String name){
super(name);
}
public void makeMoney(){
System.out.println(name+"挣钱交学费");
}
}
class Demo2 {
public static void main(String[] args) {
Student s=new Student("狗娃");
s.study();
MoneyStudent m=new MoneyStudent("狗剩");
m.study();
m.makeMoney();
}
}
多态
概念:一个对象具备多种形态。(父类的引用类型变量指向了子类对象或者接口的引用类型变量指向了接口实现类的对象)
多态的前提:必须存在继承或者实现的关系
例:动物 a =new 狗();
多态要注意的细节:
1.多态的情况下,子父类存在同名的成员变量时,访问的是父类的成员变量
2.多态的情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数
3.多态的情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数
4.多态的情况下,不能访问子类特有的成员
总结:多态情况下,子父类存在同名成员时,访问的都是父类的成员,只有在同名的非静态函数时访问的是子类的成员
编译看左边,运行不一定看右边
编译看左边:java编译器在编译的时候,会检查引用类型变量所属的类是否具备指定的成员,如果不具备马上编译报错
多态的应用:
1.多态应用于形参类型的时候,可以接受更多类型的数据
多态的好处:调高了代码的拓展性
例:
//定义一个函数可以接受任意类型的图形对象,并且打印图形的面积和周长
abstract class MyShape{
public abstract void getArea();
public abstract void getLength();
}
class Circle extends MyShape{
public static final double PI=3.14;
double r;
public Circle(double r){
this.r=r;
}
public void getArea(){
System.out.println("该圆形的面积为:"+(PI*r*r));
}
public void getLength(){
System.out.println("该圆形的周长为:"+(2*PI*r));
}
}
class Rect extends MyShape{
int length;
int width;
public Rect(int length,int width){
this.length=length;
this.width=width;
}
public void getArea(){
System.out.println("该矩形的面积为:"+(length*width));
}
public void getLength(){
System.out.println("该矩形的周长为:"+(2*length+2*width));
}
}
class Demo3 {
public static void main(String[] args) {
/*
Circle c=new Circle(4.0);
Rect r=new Rect(3,4);
print(c);
print(r);
*/
//调用了getShape方法判断其为什么图形
MyShape m=getShape(1); //声明一个m图形,判断其为什么图形(调用了使用多态的方法,定义的变量类型要与返回值类型一致)
m.getArea(); //调用MyShape类中的方法
m.getLength();
}
//多态应用于形参类型的时候,可以接受更多类型的数据
public static void print(MyShape s){ //多态提高拓展性
s.getArea();
s.getLength();
}
//需求:定义一个函数可以返回任意类型的图形
public static MyShape getShape(int i){ //返回值为MyShape,形参用于判断
if(i==0){
return new Circle(4.0); //返回一个圆形
}else{
return new Rect(3,4); //返回一个矩形
}
}
}