JAVASE之接口,匿名对象和多态

JAVA接口:

Java语言的继承是单一继承,一个子类只能有一个父类(单一继承)

Java语言给我们提供了一种机制,用于处理继承单一的局限性的,接口;

接口:是一个比抽象类还抽象的类,接口里所有的方法全是抽象方法,接口和类的关系是实现,关键字是implements

接口是功能的集合,同样可以看作是一种数据类型,是比抽象类更为抽象的”类”.

接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样是将功能的定义与实现分离,优化了程序设计.

格式:接口定义时需要使用interface关键字.

定义接口所在的仍为.java文件,虽然声明时使用的为interface关键字的编译后仍然会产生.class文件.这点额可以让我们将接口看作是一种只包含了功能声明的特殊类.

Public interface 接口名{
抽象方法1;
抽象方法2;
抽象方法3;
}


接口的应用场景:

接口中的方法诠释抽象方法,直接new接口来调用方法没有意义.java也不允许这样干.

类与接口的关系为实现关系,即类实现接口.实现的动作类似继承,只是关键字不同.继承是extends,实现是implements.

其他类(实现类)实现接口后,就相当于声明:我应该具备这个接口中的功能.实现类仍然需要重写方法以实现具体的功能.

格式:

Class implements 接口{

重写接口中的方法;

}

在类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要重写该抽象方法,完成具体的逻辑.

接口中成员的特点:

接口中可以定义变量,但是变量必须有国定的修饰符修饰,public static final.所以接口中的变量也称之为常量,其值不能改变.

接口中可以定义方法,方法也有固定的修饰符 public abstract

接口中可以定义方法.方法也有固定的修饰符,public abstract.

接口中不可以创建对象

子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化.否则子类是一个抽象类.

接口与类之间的关系

类与类之间:继承关系,一个类只能继承一个父类,但是支持多重继承

类与接口之间:只有实现关系,一个类可以实现多个接口

接口与接口之间:只用继承关系,一个接口可以继承多个接口,implements后使用,分割

 

类与接口的关系是实现关系,一个类实现了一个接口,就要实现该接口中所有的方法.

接口优点:

接口是对外暴露的规则

类与接口的关系是实现

接口的出现降低耦合性.(实现了模块化开发,定义好规则,每个人实现自己的模块,大大提高了开发效率)

接口和抽象类的异同

:

都位于继承的顶端,用于被其他类实现或继承

都不能直接实例化对象

都包含抽象方法,其子类都必须复写这些抽象方法.

:

一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口(接口弥补了java的单继承)  单继承多实现

成员变量: 抽象类既可以有常量也可以有变量,接口只能有常量

成员方法: 抽象类既可以有抽象方法也可以有非抽象方法

接口只能有抽象方法

构造方法: 抽象类有构造方法,子类通过super语句调用.接口没有构造方法

 

匿名对象

匿名对象即无名对象,直接使用new关键字来创建对象.

应用场景:

当方法只调用一次的时候可以使用匿名对象

可以当作参数进行传递,但是无法在传参之前做其他的事情.

Note:匿名对象可以调用成员变量并赋值,但是无法在传参之前做其他的事情.

 

示例:

public class demo{
public static void main(String[] args ){
method(new Student());
}
public void method(Student s){
s.study();//输出”学生学习了”
}
}
class Student{
private String name;
private int age;
public void study(){
System.out.println(“学生学习了”);
}
}


JAVA多态

多态是继封装.继承之后,面向对象的第三大特性.

多态的前提:

字符类的继承关系

方法的重写

父类引用指向子类对象

动态绑定:运行期间调用的方法,是根据其具体的类型.

现实事物经常会体现多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态.

Java作为面向对象的语言,同样可以描述一个事物的多种形态.Student类继承了Person,一个Student的对象便既是Student,又是Person.

多态的定义格式:就是父类的引用变量指向子类对象.

父类类型 变量名 = new 子类类型();

变量名.方法名();

Abstract class Fu{
Public abstract void method();
}
Class Zi extends Fu{
Public void method(){
System.out.println(“重写父类抽象方法”);
}
}
//类的多态使用
Fu fu = new Zi();

 

普通类多态定义的格式:

父类 变量名 = new 子类();
如: class Fu{ }
Class Zi extends Fu{}
//类的多态使用
Fu f= new Zi();


抽象类多态定义的格式


接口多态定义的格式

接口 变量名 = new 接口实现类();
如: interface Fu{
Public abstract void method();
}
Class Zi implements Fu{
Public void method(){
System.out.println(“重写接口抽象方法”);
}
}
//接口的多态使用:
Fu fu = new Zi();


多态的成员特点:

当子父类中出现同名的成员变量时,多态调用该变量时:

编译时期:参考的是引用型变量所属的类中是否有被调用的成员变量.没有,编译失败.

运行时期:也是调用引用型变量所属的类中的成员变量.

简单记:编译和运行都参考等号的左边.编译运行看左边.

多态成员方法:

编译时期:参考引用变量所属的类,如果没有类中没有调用的方法,编译失败

运行时期:参考引用变量所指的对象所属的类,并运行对象所属类中的成员方法

简而言之:编译看左边,运行看右边.

Note:

多态的成员特点:

成员变量: 编译时看的是左边,运行时看的是左边

成员方法: 编译时看的是左边,运行时看右边

静态方法: 编译时看的是左边,运行时看的也是左边.

编译时看的都是左边,运行时成员方法看的是右边,其他(成员变量和静态的方法)看的都是左边.

 

多态的向上转型和向下转型

向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程. 由小到大(子类型转换为父类型)

向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型.如果是直接创建父类对象.是无法向下转型的.由大到小(强转)

 

多态的优缺点:

优点:可以提高可维护性(多态前提所保证的),提高代码的可扩展性

缺点:无法直接访问子类特有的成员.

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值