java 判断 继承接口_java基础-接口、继承、多态
女神镇楼
1、类的继承
继承是面向对象中的一个非常重要的概念,是的整个程序具有一定的弹性,在程序中,复用一些已经定义的完善的类,不仅可以减少软件的开发周期,还可以提高软件的可维护性和可拓展性。
继承的基本思想是基于某个父类的拓展,制造出一个新的子类,子类可继承父类的属性和方法,也可以增加原父类不具备的属性和方法,或者重写父类中的某个方法。比如平行四边形继承了四边形类,这个时候,平行四边形类将所有四边形类中的属性和方法保留下来,并拓展了新的属于自己的属性和方法。
代码示例---父类:
public classTest {public Test(){ //构造方法//SomeSentence
}protected voiddoSomething(){//成员方法
}protectedTest dolt(){//方法返回值类型为Test类型
return newTest();
}
}
代码示例---子类:
public class Test2 extendsTest {publicTest2(){//构造方法
super(); //调用父类的构造方法
super.doSomething(); //调用父类的成员方法
}public voiddoSomethingNeW(){//新增方法
}public voiddoSomeThing(){//重写父类方法
}protectedTest2 dolt(){//重写父类方法,返回值类型为Test2类型
return newTest2();
}
}
实例说明:
实例中,Test类是Test2类的父类,Test2类是Test类的子类,在子类中连同初始化父类的构造方法来完成子类的初始化操作,即可以在子类的构造方法中使用super()语句调用父类的构造方法,也可以在子类中通过super关键字调用父类的成员方法。但是在子类中没有权限调用父类中使用private修饰的方法,只可以调用父类中修饰为public或者protected的成员方法。
继承不止可以拓展父类的功能,还可以对父类的方法进行重写,重写也可以成为覆盖,就是在子类中,将父类的成员方法的名称保留,重写成员方法实现的内容,可更改成员方法的储存权限,或者修改成员方法的返回值类型,还可以将权限修饰符修改为public。
继承中还有一种特殊的重写方式,子类与父类的成员方法的返回值、方法名称、参数类型及个数完全相同,唯一不同的是方法实现内容,这种特殊的重写方式称为重构。
在java中,一切都是一对象的形式进行处理,在继承机制中,创建一个子类对象,将包含一个父类子对象,这个对象与父类创建的对象是一样的,两者的区别就在于,后者来自于外部,而前者来自子类对象内部。当实例化子类对象时,父类对象也相应被实例化,也就是说,在实例化子类对象时,java编译器会在子类的构造方法中自动调用父类的无参构造方法。
代码示例:
public classParent {
Parent(){
System.out.println("调用父类的Parent()方法");
}
}
public class Subparent extends Parent { //继承Parent
Subparent(){
System.out.println("调用子类Subparent的构造方法");
}
}
public class Subbroutine extends Subparent { //继承 Subparent
Subbroutine(){
System.out.println("调用子类Subbroutine的方法。");
}public static voidmain(String[] args) {
Subbroutine s= newSubbroutine();
}
}
运行结果:
运行结果说明:
子类Subroutine的主方法中只调用子类的构造方法实例化子类对象,并且在子类的构造方法中没有调用父类构造方法的任何语句,但是在实例化子类对象时,他会相应的调用父类的构造方法,调用构造方法的顺序是:顶级父类==上一级父类==子类,也就是实例化子类对象时首先实例化父类对象,再实例化子类对象。在子类的构造方法访问父类的构造方法之前,已经完成了父类的实例化操作。
说明:
在实例化子类对象时,父类无参构造方法将会被自动调用,但是有参构造方法不能被自动调用,只能借用super关键字显式的调用父类方法。
如果使用finalize()方法对对象进行清理,需要确保子类的finalize()方法最后一个动作是调用父类的finalize()方法,用来保证垃圾回收对象所占用的内存时,对象所有部分都能被正常终止。
2、Object类
是什么===Object类是比较特殊的类,是所有类的父类,是java类层中的最高层类。创建一个类时,它总是在继承,除非某个类指定他从某个类继承,否则他就是从java.lang.Object类继承来。
Object类中的几个重要方法:
(1)getClass()方法
getClass()方法是Object类定义的方法,返回对象执行时的Class实例,然后用此实例调用getName()方法获取类的名称。
getClass().getname();
(2)toString()方法
toString方法功能是将一个对象返回字符串形式,返回一个String实例,在实际应用中,通常需要重写toString()方法,为对象提供一个特定的输出模式。当这个类转换为字符串或者字符串连接时,会自动重写toString()方法。
代码示例:
public classObjectInstance {publicString toString(){return "在"+getClass().getName()+"类中重写了toString方法";
}public static voidmain(String[] args) {
System.out.println(newObjectInstance());
}
}
(3)equal()方法 == 用来比较两个对象的实际内容,“==”是比较两个对象的引用是否相等
代码示例:
classV{}public classOverWhiteEqual {public static voidmain(String[] args) {
String s1= "123";
String s2= "123";
System.out.println(s1.equals(s2));
V v1= newV();
V v2= newV();
System.out.println(v1.equals(v2));
}
}
实例分析:
在自定义类中使用equals()方法进行比较时,返回false,因为equals()方法默认实现的是“==”比较两个对象的引用地址,而不是比较对象的内容,所以要想做到真正的比较两个对象的内容,需要在自定义类中重写equals()方法
3、对象的类型转换
(1)向上转型
代码示例:定义平行四边形类和四边形类
public class Quadrangle { //四边形类
public static void draw(Quadrangle q){ //四边形类中的方法
System.out.println("四边形类中输出!");
}
}
public class Parallelogram extendsQuadrangle {public static voidmain(String[] args) {
Parallelogram p= newParallelogram();
draw(p);
}
}
实例分析:
四边形类中有draw()方法,参数是Quadrangle(四边形类),在平行四边形类中调用的时候传的参数是Parallelogram(平行四边形类)。这里需要强调一下,平行四边形也是一种类型的四边形,所以平行四边形类的对象可以看做四边形类的对象,相当于“Quadrangle obj = new Parallelogram”,就是吧子类对象赋值给父类类型的变量,称之为向上转型。
(2)向下转型
向下转型是将较抽象类转换为较具体的类,可以说子类对象总是父类的一个实例,但父类对象不一定是子类的实例。
代码示例:
public class Quadrangle { //四边形类
public static void draw(Quadrangle q){ //四边形类中的方法
System.out.println("四边形类中输出!");
}
}
public class Parallelogram extendsQuadrangle {public static voidmain(String[] args) {
Parallelogram p= newParallelogram();
draw(p);//将平行四边形类对象看做四边形类对象,成为向上转型操作
Quadrangle q = newParallelogram();
Parallelogram p1=q;/*将父类对象赋给子类对象,这种写法是错误的*/
//将父类对象赋予子类对象,并强制转换为子类型。这种写法是正确的
Parallelogram p2 =(Parallelogram) q;
}
}
实例分析:
父类对象直接赋予子类,会发生编译器错误,因为父类不一定是子类的实例,越是具体的对象具有的特性越多,越是抽象的对象,具有的对象越少。在向下转型操作中,将特性范围小的对象转型为特性范围大的对象会出现问题。这时候父类对象强制转换为某个子类对象,称为显式类型转换。在程序中使用向下转型操作时,必须使用显式类型转换。
4、使用instanceof操作符判断对象类型
向下转型操作时,先判断父类对象是否是子类的实例,instanceof 操作符,可以判断一个引用指向的对象是否是某一个类型或者其子类, 是则返回true,否则返回false。
代码示例:
public classQuadrangle {public static voiddraw(Quadrangle q){
System.out.println("Quadrangle的draw方法");
}
}
public class Square extendsQuadrangle {//SomeSentence
}
public classAnything {//SomeSentence
}
public class Parallelogram extendsQuadrangle {public static voidmain(String[] args) {
Quadrangle q=new Quadrangle(); //实例化父类对象//判断父类对象是否是Parallelogram子类的一个实例 ,
if(q instanceofParallelogram){
Parallelogram p= (Parallelogram) q; //向下转型操作
}//判断父类对象是否是Square子类的一个实例
if(q instanceofSquare){
Square s= (Square) q; //向下转型操作
}//由于q对象不是Anything类的对象,所以这条语句是错误的//System.out.println(q instanceof Anything);
}
}
public class Parallelogram extendsQuadrangle {public static voidmain(String[] args) {
Quadrangle q=new Quadrangle(); //实例化父类对象//判断父类对象是否是Parallelogram子类的一个实例 ,
if(q instanceofParallelogram){
Parallelogram p= (Parallelogram) q; //向下转型操作
}//判断父类对象是否是Square子类的一个实例
if(q instanceofSquare){
Square s= (Square) q; //向下转型操作
}//由于q对象不是Anything类的对象,所以这条语句是错误的//System.out.println(q instanceof Anything);
}
}
5、方法的重载
构造方法的名称是由类名决定的,所以构造方法只有一个名称,如果希望不同的方式来实例化对象,就需要使用多个构造方法完成,为了让方法名相同而形参不同的构造方法同时存在, 就需要用到方法重载。
代码示例:
public classOverLoadTest {public static int add(int a, intb){return a+b;
}public static double add(double a, doubleb){return a+b;
}public static int add(inta){returna;
}public static int add(int a, doubleb){return 1;
}public static int add(double a, intb){return 1;
}public static voidmain(String[] args) {
System.out.println("调用add(int,int)方法:"+add(1,2));
System.out.println("调用add(double,double)方法:"+add(2.1,3.3));
System.out.println("调用add(int)方法:"+add(1));
}
}
以上构成重载的条件,可以总结出编译器是利用方法名、方法各参数类型、参数的个数、参数的顺序来判断类中的方法是否唯一。
6、多态
将父类对象应用于子类的特征就是多态,利用多态可以是程序具有良好的拓展性,并可以对所有类对象进行通用处理。
实例:一个四边形类,让它处理所有继承该类的对象,根据“向上转型”的原则,可以使每个继承这个四边形类的对象作为draw()方法的参数,然后在draw()方法中做出一些限制,就可以根据不同的图形类对象绘制不同的图像,这样就可以使用更为通用的四边形类取代具体的正方形类和平行四边形类,可以很好的解决代码冗余的问题,并且更易于维护。
代码示例:
public classQuadrangle {//实例化保存四边形对象的数组对象
private Quadrangle[] qtest = new Quadrangle[6];private int nextindex = 0;/*定义draw方法,参数是四边对象*/
public voiddraw(Quadrangle q){if(nextindex
qtest[nextindex]=q;
System.out.println("输出参数nextindex数值:"+nextindex);
nextindex++;
}
}public static voidmain(String[] args) {//实例化两个四边形对象,用来调用draw方法
Quadrangle q = newQuadrangle();
q.draw(new Square()); //以正方形对象为参数调用draw方法
q.draw(new Parallelogram()); //以平行四边形对象为参数调用draw方法
}
}
//定义一个正方形类继承自四边形类
public class Square extendsQuadrangle {//SomeSentence
publicSquare(){
System.out.println("正方形");
}
}
//定义一个平行四边形类继承自四边形类
public class Parallelogram extendsQuadrangle {publicParallelogram(){
System.out.println("平行四边形");
}
}
实例分析:
以不同的类对象为参数调用draw方法,可以处理不同的图形问题。
7、抽象类
在实际解决问题时,一般将父类定义为抽象类,需要使用这个父类进行继承和多态处理。继承树中,越上方的类,越是抽象。在多态机制中,不需要将父类初始化对象,我们需要的只是子类对象。
抽象类的语法如下:
public abstract classTest {abstract void testAbstract(); //定义抽象方法
}
其中,abstract是抽象类的关键字。
使用abstract关键字定义的类称之为抽象类,使用这个关键字定义的方法称为抽象方法,抽象方法没有具体的方法体,这个方法本身是没有意义的,除非他被重写,而承载这个抽象方法的抽象类必须被继承,实际上抽象类除了被继承之外没有任何意义。
只要类中有抽象方法,这个类必须被定义为抽象类。
抽象类被继承后需要实现其中所有的抽象方法。
8、接口
接口是抽象类的延伸,可以看作是纯粹的抽象类,接口中所有的方法都没有方法体。
接口使用interface关键字进行定义,语法如下:
public interfacedrawTest2 {void draw(); //接口中的方法省略abstract关键字
}
一个类实现一个接口可以使用implements关键字,语法如下:
public class Parallelogram extends Quadrangle implements drawTest2 {
public Parallelogram(){
System.out.println("平行四边形");
}
@Override
public void draw() {
}
}
接口中定义的方法必须被定义为public或者abstract形式,其他的修饰权限不被java编辑器认可。
实例代码:
//定义drawTest接口
public interfacedrawTest {voiddraw();
}
//定义四边形类
public classQuadrangleUseInterface {public voiddoAnything(){
}public static voidmain(String[] args) {
drawTest[] d={newSquareUseInterface(),newParallelogramgleUseInterface()
};for(int i = 0 ;i
d[i].draw();
}
}
}
//定义平行四边形类,继承了四边形类,并实现了drawTest接口
public class ParallelogramgleUseInterface extends QuadrangleUseInterface implementsdrawTest{
@Override//该类实现了接口,需要覆盖draw方法
public voiddraw() {
System.out.println("平行四边形draw()");
}public voiddoAnything(){//覆盖父类方法
}
}
//定义正方形类,继承自四边形类,实现draw接口
public class SquareUseInterface extends QuadrangleUseInterface implementsdrawTest{
@Overridepublic voiddraw() {
System.out.println("正方形的draw()方法");
}public voiddoAnything(){}
}
实例说明:
正方形类和平行四边形类分别继承自四边形类,并实现了接口drawTest,所以需要覆盖接口中的方法,在调用draw方法时,先将子类对象向上转型为drawTest接口形式。
9、接口与继承
在java中不允许多重继承,但是使用接口就可以实现多重继承,因为一个类可以同时实现多个接口,这样可以将所有需要实现的接口放在implements关键字后面用“,”隔开。
多重继承语法如下:
class 类名 implements 接口1,接口2,。。。,接口n
//>> TODO 接口也可以继承接口。接口可以继承多个接口,接口之间的继承要用extends//>> TODO 接口不可以继承类//>> TODO 继承的接口,可以有重复的方法,但是签名相同时,返回值必须完全一样,否则会有编译错误
public interface Intf3 extendsIntf1, Intf2{voidm3();
}
java 判断 继承接口_java基础-接口、继承、多态相关推荐
- java工厂到接口_Java基础——接口简单工厂
声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权:凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记. 一.接口 1.接口只做规范和声明不做实现: 2.java中类 ...
- java中定义坐标_Java 基础接口——坐标
定义一个"点"(Point)类用来表示三维空间中的点(有三个坐标).要求如下: (1)可以生成具有特定坐标的点对象. (2)提供可以设置三个坐标的方法. (3)提供可以计算该&qu ...
- java 判断object类型_Java学习-方法与多态的学习心得
一 1.什么是方法重写 方法的重写或方法的覆盖(overriding) 子类根据需求对从父类继承的方法进行重新编写 重写时,可以用super.方法的方式来保留父类的方法 构造方法不能被重写 2.方法重 ...
- java实验报告答案_Java实验报告--继承与接口
学院 专业 班.学号 姓名 教师评定_________________ 实验题目 继承与接口 一. 实验目的与要求 实验目的: 1.掌握类的继承关系. 2.掌握接口的定义与使用. 实验要求: 按下列要 ...
- java final 接口_Java自学-接口与继承 final
Java的修饰符final final修饰类,方法,基本类型变量,引用的时候分别有不同的意思. 示例 1 : final修饰类 当Hero被修饰成final的时候,表示Hero不能够被继承 其子类会出 ...
- java 判断object类型_Java 类继承机制
封装.继承.多态是面向对象的三大特征,"继承"最主要的目的是为了实现代码的可复用性.通过父类与子类的继承关系,子类继承了父类的成员函数和成员变量,提高了代码的重复利用率.同时,子类 ...
- java集合框架中抽象有序列表的接口是_JAVA基础接口集合框架
接口 -------------------------------------------------------------------------------- 一.接口(是一种规范) 1.接口 ...
- java throw 接口_Java基础系列-throw、throws关键字
一.概述 throw和throws就是异常相关的关键字,在java中异常机制是一个非常重要的机制,我们需要重点掌握. 既然说到了异常,简单描述下异常机制很有必要,这也对后文的讲述提供前提. 二.Jav ...
- ie 访问 java接口_Java基础面试题 库(1~10)
1.下列哪个说法是正确的() A ConcurrentHashMap使用synchronized关键字保证线程安全 B HashMap实现了Collction接口 C Array.a ...
- java类继承语法_java类的继承(基础)
---恢复内容开始--- 这篇随笔和大家讲讲java中类的继承是什么?希望对你们有所帮助. 目录 一.java继承是什么? 二.为什么使用java继承 三.java继承的实现 1.1 java继承的 ...
最新文章
- 使用UEFI模式安装win10中的格式化磁盘问题
- Merge into 详细介绍
- Chrome 开发者工具的各种骚技巧
- stm32c8t6的can通信实验代码_TCP的连接建立与关闭状态及数据传输通信过程【含有 PHP socket API 测试实验代码】...
- python【蓝桥杯vip练习题库】ALGO-71比较字符串
- jsp mysql demo_利用JSP+MYSQL实现注册+登入的demo----0001
- ie11 不能调试 因为 ie的bug
- 用户研究:如何做用户画像分析
- linux php oauth安装,Linux php 扩展安装 mongo ,redis ,soap,imap,pdo_mysql,oauth
- es管理器免root_OPPO手机免ROOT更换系统字体教程-适合大部分OPPO机型
- php远程文件无法编辑,“脚本编辑器”远程文件编辑漏洞
- 1.4 高并发之线程和进程
- 火灾报警(烟雾火焰检测)-STM8L
- SQL DELETE FROM的用法
- outlook邮箱备份步骤
- The Devil Wears Prada-16
- 使用laser_filters屏蔽车架
- 基于ArcGIS Pro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局
- css3旋转木马轮播图,3D旋转木马轮播图(原创)
- 怎么文字转语音?两分钟让你学会三种方法
热门文章
- 关于MSDTC - 与基础事务管理器的通信失败 错误解决的小备忘
- 详解FSMO的五种角色
- Emmet的简写演示
- css中的clip:rect() 只能在绝对定位的元素上使用
- 轻量级网页安全漏洞扫描工具-Wapiti
- python-16: time 模块 之一
- 【FZU 2277】Change
- [LeetCode]Palindrome Number 推断二进制和十进制是否为回文
- CSS之固定定位,绝对定位+负边距,双飞翼布局,属性选择器,伪类选择器补,状态伪类选择器,相邻全部兄弟选择器,取非选择器,em与rem,变形效果...
- 面试题38 数字在排序数组中出现的次数