Java接口与多态
接口
可以理解为一种特殊的类,里面全部是由全局常量(static final)和公共的抽象方法所组成
接口的定义格式
接口的数据成员,只允许被public, static, final修饰。 接口的方法成员,只允许被public, abstract修饰。
Interface 接口名称{
private static final int var1=1; //error
public static final int var2 = 2;
public abstract void fun1();
private abstract int fun2(); //error.
}
接口中的数据成员都为static final类型,必须进行初始化,且接口的数据成员的值不能被修改,允许省略static, final关键字。 接口中的方法必须是“抽象方法”,不能有方法体,允许省略public及abstract关键字
public interface A{
int num; //error. 没初始化
String name = “test”;
public void getName( ) {……} //error.不允许定义方法体
}
接口的实现 接口不能用new运算符直接产生对象,必须利用其特性设计新的类,再用新类来创建对象 与抽象类一样,接口要使用也必须通过子类,子类通过implements关键字实现接口。 实现格式: class 子类名称 implements 接口A, 接口B,….{ //子类成员声明 } 接口的使用必须通过子类,子类必须覆写全部抽象方法。一个子类虽然只能继承于一个父类,但可以同时实现多个接口。
interface A{
public String name = “小明”;
public void print();
public String getName();
}
interface B{
public void setName();
}
class C implements A, B{
public void print( ) { ……};
public String getName( ) {……};
public void setName( ) {……};
}
必须实现接口中的所有方法,否则,实现接口的类将带有抽象方法,因此成为抽象类。 在覆写来自接口的方法时,必须声明成public。
class C implements A, B{
//public void print( ) { ……}; //没覆写print方法,编译不过。
public String getName( ) {……};
public void setName( ) {……};
}
对象转型
对象可以被转型为其所属类实现的接口类型。 接口不可通过new实例化,但可以声明接口变量。
public class Test implements A{
intidx = 1;
public void print(){
System.out.println(“”)
}
public String getName(){ }
public static void main(String []agrs){
Test test = new Test();
A a = (A)test; //对象转型为接口类型
System.out.println(a.name); //输出name的值
a.idx = 2; //error. idx属于test,在接口A中不存在
a.print(); //执行Test的print方法。
}
}
继承抽象类实现接口
一个子类可以同时继承抽象类和实现接口 格式如下: class 子类 extends 抽象类 implements 接口A,接口B,……{ }
接口的继承
接口不能继承一个抽象类,却可以通过extends同时继承于多个接口。
public abstract class base {……}
interface B {……}
interface C{……} i
nterface A extends base{……} //错误
interface A extends B, C{ ……} //正确
接口与继承的区别
No.
区别
抽象类
接口
1.定义:
以abstract声明,抽象方法可有可无。
以interface声明,由静态常量和抽象方法组成。
2.组成:
构造方法、抽象方法、普通方法、常量、变量。
静态常量、抽象方法。
3.使用:
子类继承抽象类(extends)。
子类实现接口(implements)。
4.关系:
抽象类可以实现多个接口。
接口不能继承抽象类,但允许继承多个接口。
5.对象:
都通过对象的多态性产生实例化对象。
6.局限:
抽象类有单继承的局限。
接口可以实现多重继承。
7.选择:
如果抽象类和接口都可以使用的话,优先使用接口,可以避免单继承的局限。
多态
是指不同类型的对象可以响应相同的消息,从相同的基类派生出来的多个类型可被当作同一种类型对待,可对这些不同的类型进行同样的处理,由于多态性,这些不同派生类对象响应同一方法时的行为是有所差别的 ◦
例如
所有的Object类的对象都响应toString()方法
多态性在java中主要有以下两种体现:
方法的重载与覆写。
对象的多态性。
对象的多态性
对象的多态性主要分为以下两种类型:
1.向上转型:子类对象->父类对象
对于向上转型,程序会自动完成。
//BaseClass为父类,DerivedClass为BaseClass的派生类
BaseClass bc = new DerivedClass(); //隐式转型。
2.向下转型:父类对象->子类对象
对于向下转型,必须明确指明要转型的子类类型。
BaseClass bc = new DerivedClass(); //先向上转型
DerivedClass dc = (DerivedClass)bc;
public class A{
String name = “A”;
public void fun1(){
System.out.println(“A->fun1”);
}
public void fun2(){
System.out.println(“A->fun2”);
}
}
public class B extends A{
String name = “B”;
public void fun1(){
System.out.println(“B->fun1”);
}
public void fun3(){
System.out.println(“B->fun3”);
}
}
向上转型:
public class Demo{
public static void main(String args[]){
A a = new B( );
a.fun1(); //输出什么? B->fun1
a.fun2(); //输出什么? A->fun2
a.fun3(); //error. A中没定义fun3方法
System.out.println(a.name); //输出什么?
}
}
向下转型
public class Demo{
public static void main(String args[]){
//B b = (B)new A( ); //强制转型,运行后抛出异常
A a = new B();
B b = (B)a; //向下转型
b.fun1(); //输出什么? A->fun1
b.fun2(); //输出什么? A->fun2
b.fun3(); //输出什么? B->fun3
}
}
要想产生对象的向下转型,则必须先产生一个向上的转型关系, A a = new B(); 表示建立关系。
多态的目的
所有的对象都可被转型为相同的类型,响应相同的消息 使代码变得简单且容易理解 使程序具有很好的“扩展性”
应用实例
技术基础 ◦向上转型:一个父类的引用变量可以指向不同的子类对象。 ◦动态绑定:运行时根据父类引用变量所指对象的实际类型执行相应的子类方法,从而实现多态性。 例子1:司机开车 public abstract class Driver{
public Driver( ) { }
public abstract void drives( );
}
public class FemaleDriver extends Driver {
public FemaleDriver( ) { }
public void drives( ) {
System.out.println("A Female driver drives a vehicle.");
}
}
public class MaleDriver extends Driver {
public MaleDriver( ) { }
public void drives( ) {
System.out.println("A Male driver drives a vehicle.");
}
}
public class Test{
public static void main(String [ ] args){
Driver a = new FemaleDriver( );
Driver b = new MaleDriver( );
a.drives( );
b.drives( );
}
}
输出结果:A Female driver drives a vehicle.
A Male driver drives a vehicle.
例子2——司机开什么车 不利用对象多态性的做法
public class MaleDriver extends Driver {
public MaleDriver( ) { }
public void drivesBus( ) {
System.out.println("A Male driver drives a bus.");
}
public void drivesCar( ){
System.out.println("A Male driver drives a car.");
}
public void drivesTruck( ){
System.out.println("A Male driver drives a truck.");
}
……
}
利用对象多态性的做法
public abstract class Vehicle{
public void drivedByFemale( );
public void drivedByMale();
}
public class Bus extends Vehicle{
public void drivedByFemale( ){
System.out.println("A Female driver drives a bus.");
}
public void drivedByMale(){
System.out.println("A Male driver drives a bus.");
}
}
public class MaleDriver extends Driver {
public void drives(Vehicle v){
v. drivedByMale();
}
}
public class Test{
public static void main(){
Vehicle bus = new Bus();
Driver male = new MaleDriver();
male.drives(bus);
}
}
输出结果: A Male driver drives a bus
Java接口与多态的更多相关文章
- Java 接口和多态
接口 1.1 接口的概述 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样 ...
- java 接口实现多态
package unit4; import java.awt.Graphics; public interface Shape { void drowme(Graphics g); double ar ...
- Java 接口和多态练习
我们鼠标和键盘实现USB接口,那么我们鼠标和键盘就变成了USB设备,这时候我们就可以把它放到笔记本电脑里面去用 package com.biggw.day10.demo07; /** * @autho ...
- Java基础学习笔记八 Java基础语法之接口和多态
接口 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”.接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义 ...
- Java开发知识之Java的继承多态跟接口*
Java开发知识之Java的继承多态跟接口 一丶继承 1.继承的写法 在Java中继承的 关键字是 extends 代表一个类继承另一个类. 继承的含义以及作用: 继承就是基于某个父类的扩展.制定出来 ...
- Java 基础 接口和多态
接口 接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的 ...
- Java 面向对象之接口、多态
01接口的概念 A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成 ...
- Java学习笔记——继承、接口、多态
浮点数的运算需要注意的问题: BigDecimal operand1 = new BigDecimal("1.0"); BigDecimal operand2 = new BigD ...
- java抽象类、多态、接口
抽象类 抽象类的产生 当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的功能具体实现方式,那么这些方法都有具体的方法体. 但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但 ...
随机推荐
- SpringCloud---API网关服务---Spring Cloud Zuul
1.概述 1.1 微服务架构出现的问题 及 解决: 1.1.1 前言 每个微服务应用都提供对外的Restful API服务,它通过F5.Nginx等网络设备或工具软件实现对各个微服务的路由与负载 ...
- 解决执行maven项目出现 SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”. error
最近再弄maven项目,运行起来没有问题,但是Console控制台会报错,比如说如下的问题异常提示: 由此我们可以看出,报出错误的地方主要是slf4j的jar包,而故障码中“Failed to loa ...
- gcd函数两种实现(参考)
注意: %a= a%-----溢出 递归: #include<stdio.h> int gcd(m,n) { int g; ) g=m; else g=gcd(n,m%n) return ...
- .netCore2.0 配置文件
之前的asp.net 的配置文件都是xml格式,而.netCore的配置文件则采用Json键值对的格式来存储,具体获取如下 var config = new ConfigurationBuilder( ...
- mysql服务器运维简单命令介绍
1.mysql>show processlist; 此处关注查询时间,关注谁锁住了表,谁最多: 2.查看开启的日志 mysql>show global variables like '%l ...
- Web后台模拟前端post(带NTLM验证)
using System.Data; using System.Net; using System.IO; using System.Net.Http; using System.Web; using ...
- 一:Shiro知识整理
一:springboot快速入门: 1.建立Maven项目,导入springboot父工程 <!-- 继承springboot默认父工程 --> <parent> <gr ...
- Gradle sync failed: Cause: org.gradle.logging.StyledTextOutput$Style Consult IDE log for more details
环境 Android studio 3.0 导入开源中国: ... dependencies { //noinspection GradleDependency classpath 'com.andr ...
- Spring Security +Oauth2 +Spring boot 动态定义权限
Oauth2介绍:Oauth2是为用户资源的授权定义了一个安全.开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息,并且这是安全的. 简单的来说,当用户登陆网站的时候,需要账号 ...
- Spring 中的scope
scope有Singleton.Prototype.request.session.global session.其中主要的是singleton和prototype. singleton指的是IOC容 ...