多态

多态指的是同一个方法调用,由于对象不同可能会有不同的行为。现实生活中,同一个方法,具体实现会完全不同。

多态的要点:

1. 多态是方法的多态,不是属性的多态(多态与属性无关)。

2. 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象。

3. 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。

多态和类型转换测试

package cn.dym03;
class Animal{public void shout() {System.out.println("叫了一声!");}
}
class Dog extends Animal{public void shout() {System.out.println("汪汪汪!");}public void seeDoor() {System.out.println("看门中……");}
}
class Cat extends Animal{public void shout() {System.out.println("喵喵喵喵!");}
}
public class TestPolym {static void animalCry(Animal a) {a.shout();}public static void main(String[] args) {Animal a1=new Cat();animalCry(a1);Animal a2=new Dog();animalCry(a2);Dog dog=(Dog)a2;dog.seeDoor();}
}

多态最为多见的一种用法,即父类引用做方法的形参,实参可以是任意的子类对象,通过不同的子类对象实现不同的行为方式。

但是多态也有弊端,就是无法调用子类特有的功能 。比如,不能使用父类的引用变量调用Dog类特有的seeDoor()方法。

那如果就想使用子类特有的功能行不行呢?行!这就是:对象的转型


对象的转型(casting)

父类引用指向子类对象,我们称这个过程为向上转型,属于自动类型转换。

向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法。这时,我们就需要进行类型的强制转换,我们称之为向下转型!使用子类特有的功能

对象的转型

package cn.dym04;public class TestCasting {public static void main(String [] args) {Object obj=new String("代止兮欢迎你!");  //向上可以自动转型//obj.charAt(0)  无法调用。 编译器认为obj是object类型而不是String类型//编写程序时,如果想调用运行时类型的方法,只能进行强制类型的转换  //否则通不过编译器的检查String str=(String)obj;System.out.println(str.charAt(0));System.out.println(obj==str);}
}

在向下转型过程中,必须将引用变量转成真实的子类类型(运行时类型)否则会出现类型转换异常ClassCastException。

类型转换异常

package cn.dym04;public class TestCasting2 {public static void main(String[] args) {Object obj=new String("代止兮欢迎您!");//真实的子类类型是String,但是此处向下转型为StringBufferStringBuffer str=(StringBuffer)obj;System.out.println(str.charAt(0));}
}

为了避免出现这种异常,我们可以使用instanceof运算符进行判断

向下转型中使用instanceof

package cn.dym04;public class TestCasting3 {public static void main(String[] args) {Object obj=new String("代止兮欢迎您!");if(obj instanceof String) {String str=(String)obj;System.out.println(str.charAt(0));}else if(obj instanceof StringBuffer) {StringBuffer str=(StringBuffer)obj;System.out.println(str.charAt(0));}}
}


final关键字

final关键字的作用: 1. 修饰变量: 被他修饰的变量不可改变。一旦赋了初值,就不能被重新赋值。

2. 修饰方法:该方法不可被子类重写。但是可以被重载!

3. 修饰类: 修饰的类不能被继承。比如:Math、String等。


抽象方法和抽象类

·抽象方法

使用abstract修饰的方法,没有方法体,只有声明。定义的是一种“规范”,就是告诉子类必须要给抽象方法提供具体的实现。

·抽象类

包含抽象方法的类就是抽象类。通过abstract方法定义规范,然后要求子类必须定义具体实现。通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。

抽象类和抽象方法的基本用法

package cn.dym04;
abstract class Animal{abstract public void shout();//抽象方法
}
class Dog extends Animal{//子类必须实现父类的抽象方法,否则编译错误public void shout() {System.out.println("汪汪汪!");}public void seeDoor() {System.out.println("看门中……");}
}
public class TestAbstractClass {public static void main(String[] args) {Dog a=new Dog();a.shout();a.seeDoor();}
}

抽象类的使用要点:

1. 有抽象方法的类只能定义成抽象类

2. 抽象类不能实例化,即不能用new来实例化抽象类。

3. 抽象类可以包含属性、方法、构造方法。但是构造方法不能用来new实例,只能用来被子类调用。

4. 抽象类只能用来被继承。

5. 抽象方法必须被子类实现。


接口的作用

为什么需要接口?接口和抽象类的区别?

接口就是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束。全面地专业地实现了:规范和具体实现的分离。

抽象类还提供某些具体实现,接口不提供任何实现,接口中所有方法都是抽象方法。接口是完全面向规范的,规定了一批类具有的公共方法规范。做系统时往往就是使用“面向接口”的思想来设计系统。接口就是规范

面向对象的精髓,是对对象的抽象,最能体现这一点的就是接口。


如何定义和使用接口?

定义接口的详细说明:

1. 访问修饰符:只能是public或默认。

2. 接口名:和类名采用相同命名机制。

3. extends:接口可以多继承。

4. 常量:接口中的属性只能是常量,总是:public static final 修饰。不写也是。

5. 方法:接口中的方法只能是:public abstract。 省略的话,也是public abstract。

要点

1. 子类通过implements来实现接口中的规范。

2. 接口不能创建实例,但是可用于声明引用变量类型。

3. 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的。

4. JDK1.7之前,接口中只能包含静态常量、抽象方法,不能有普通属性、构造方法、普通方法。

5. JDK1.8后,接口中包含普通的静态方法。

接口的使用

package cn.dym04;
//飞机接口
interface Volant{int FLY_HIGHT=100;void fly();
}
//善良接口
interface Honest{void helpOther();
}
class Angel implements Volant,Honest{public void fly() {System.out.println("我是天使,飞起来啦!");}public void helpOther() {System.out.println("扶老奶奶过马路!");}
}
class GoodMan implements Honest{public void helpOther() {System.out.println("扶老爷爷过马路!");}
}
class BirdMan implements Volant{public void fly() {System.out.println("我是鸟人,正在飞!");}
}public class TestInterface {public static void main(String [] args) {Volant volant=new Angel();volant.fly();System.out.println(volant.FLY_HIGHT);Honest honest=new GoodMan();honest.helpOther();}
}


接口的多继承

接口完全支持多继承。和类的继承类似,子接口扩展某个父接口,将会获得父接口中所定义的一切。

package cn.dym04;
interface A{void testa();
}
interface B{void testb();
}
interface C extends A,B{void testc();
}
public class Test implements C {public void testc() {System.out.println("1");}public void testa() {System.out.println("2");}public void testb() {System.out.println("3");}public static void main(String [] args) {Test t=new Test();t.testa();}
}

面向接口编程

面向接口编程是面向对象编程的一部分。

通过面向接口编程,而不是面向实现类编程,可以大大降低程序模块间的耦合性,提高整个系统的可扩展性和和可维护性。

java的知识点13——多态、对象的转型(casting)、final关键字、抽象方法和抽象类、接口的作用、如何定义和使用接口?、接口的多继承、面向接口编程相关推荐

  1. Java面试知识点:多态、内部类

    问题:Java面试知识点:多态.内部类 答案:  多态中成员访问特点 • 构造方法:同继承一样,子类会通过super访问父类构造方法 • 成员变量:编译看左边(父类),执行看左边(父类) • 成员方 ...

  2. php 抽象对象,PHP5.0对象模型探索之抽象方法和抽象类

    面向对象程序通过类的分层结构构建起来,在单重继承语言如PHP中,类的继承是树状的. 一个根类有一个或更多的子类,再从每个子类继承出一个或更多下一级子类.当然,可能存在多个根类,用来实现不同的功能.在一 ...

  3. Java并发工具学习(五)——CAS和final关键字

    文章目录 前言 CAS 什么是CAS 简单的模拟 缺点 final关键字 final修饰变量 普通的类属性 类的静态变量 普通方法中的变量 final修饰方法 final修饰类 不变性 一个面试题 总 ...

  4. Java基础知识点7,JDK 和 JRE 、final 与 static 、堆和栈

  5. 阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第5节 final关键字_5_final关键字用于修饰成员变量...

    直接这么修饰成员变量就会报错.这里必须要手动赋值,因为string name这里的默认是值null.一但默认值以后就不能后续再赋值了.所以这里强制你必须要手动赋值. 给name赋值后.后面所有的代码 ...

  6. 阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第5节 final关键字_1_final关键字概念与四种用法...

    英文的含义和程序中的含义是相同的.最终的,不可改变的 转载于:https://www.cnblogs.com/wangjunwei/p/11221646.html

  7. 常见的java面试知识点

    一.大厂常见问题 (1).写视频点播网站文件下载接口 (2).基础变量/数组写出模拟maven导入包过程 (3).写出新变脸内存分配,模拟垃圾回收过程 (4).50个白球50个红球,两个盒子,怎么放让 ...

  8. Java常见知识点汇总

    Java常见知识点汇总 基础概念与常识 1.Java 语言有哪些特点? 2.JVM vs JDK vs JRE 3.什么是字节码?采用字节码的好处是什么? 4.为什么不全部使用 AOT 呢? 5.为什 ...

  9. java基础知识点_「Java面试题/知识点精华集」20000+字的Java基础知识篇(2020最新版) !

    " 本文已经收录进我的 79K Star 的 Java 开源项目 JavaGuide:https://github.com/Snailclimb/JavaGuide (「Java学习+面试指 ...

最新文章

  1. usaco Canada Tour
  2. yii2.0错误:Exception yii\base\InvalidConfigException with message
  3. 四. python的time和datetime 模块
  4. Python【每日一问】08
  5. 华为帐号忘记显示服务器繁忙,显示云服务器繁忙怎么操作
  6. 设计模式学习笔记六:.NET反射工厂
  7. JAVA入门级教学之(浮点型数据类型)
  8. 17.合并两个排序的链表
  9. mysql 只有 .ibd_mysql数据库被破坏,只剩下ibd文件时如何恢复
  10. delphi 发送网络消息_分布式系统与消息的投递
  11. java后端AppV3版本微信支付CV大法2021-11-12
  12. Micropython八位共阴数码管驱动模块分享
  13. python 切片器_Excel中如何使用切片器,这个太高大上了
  14. CDH Parcel包starrocks集成cloudera Manager
  15. 听说你还在纠结自己没访问量?成不了“博客专家”?
  16. ae导出html,动画还原100%-AE一键导出
  17. paraview(三)运行和查看Paraview官方案例
  18. bili—Excel零基础入门进阶到函数
  19. Python将字符串转换成dataframe
  20. although 与 though 的区别

热门文章

  1. .NET: 使用.NET Core CLI开发应用程序
  2. java笔试之字符串反转
  3. 15、Cocos2dx 3.0游戏开发找小三之Sprite:每一个精灵都是上辈子折翼的天使
  4. [Window] .MUS 0x80070422 Error
  5. 移动、联通、电信7模4G全网通
  6. android 填满手机磁盘空间方法
  7. 是啥意思_227大团结是什么梗啥意思 微博227大团结事件始末介绍
  8. 苹果xsmax怎么开机_苹果XSMAX进水不开机维修
  9. 手机端系统提交数据的创建时间验证的问题
  10. haproxy调度web案例