怎么做网站源码,上海网站建设推,扬州建设信用网站,网站开发软文Java题集练习3
1 什么时候用instanceof
instanceOf关键字主要用于判断一个对象是否为某个类的子类或是接口的实例#xff0c;通常用于类型转换和运行时类型判断的场景#xff0c;比如继承和多态中。比如#xff0c;创建一个Animal类及其子类Cat和Cat子类Hat#xff0c;可…Java题集练习3
1 什么时候用instanceof
instanceOf关键字主要用于判断一个对象是否为某个类的子类或是接口的实例通常用于类型转换和运行时类型判断的场景比如继承和多态中。比如创建一个Animal类及其子类Cat和Cat子类Hat可以使用instanceOf判断
public static void main(String[] args) {Cat cat new Cat();Hat hat new Hat();boolean b1 hat instanceof Animal;System.out.println(b1);//trueboolean b2 cat instanceof Animal;System.out.println(b2);//trueboolean b3 cat instanceof Hat;System.out.println(b3);//false}b1判断的是Hat类对象是否是Animal的子类由于Hat是Cat的子类Cat是Animal类的子类所以Hat是Animal的子类
b2不难看出Cat类是Animal类的直属子类
由于Cat是Hat的父类所以它不属于Hat类的子类由此得到b3的结果
2 动态绑定和静态绑定
首先我们要对程序绑定有一个初步的概念
绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说绑定分为静态绑定和动态绑定或者叫做前期绑定和后期绑定.
静态绑定 在程序执行前方法已经被绑定也就是说在编译过程中就已经知道这个方法到底是哪个类中的方法此时由 编译器或其它连接程序实现。例如Java。 针对java简单的可以理解为程序编译期的绑定这里特别说明一点java当中的方法只有finalstaticprivate和构造方法是前期绑定
动态绑定 后期绑定 在运行时根据具体对象的类型进行绑定。 若一种语言实现了后期绑定同时必须提供一些机制可在运行期间判断对象的类型并分别调用适当的方法。也就是说 编译器此时依然不知道对象的类型但方法调用机制能自己去调查找到正确的方法主体。不同的语言对后期绑定的实现方法是有所区别的。但我们至少可以这样认为它们都要在对象中安插某些特殊类型的信息。 动态绑定的过程 虚拟机提取对象的实际类型的方法表 虚拟机搜索方法签名 调用方法。
为什么说java中finalstaticprivate和构造方法是前期绑定呢
我们知道final修饰的类不能被继承static修饰的方法不可以被子类重写但可以被子类隐藏也就是说如果子类中重写了static方法则会调用子类的方法如果没有重写则会调用父类中的方法唯一的不同点就是如果子类向上转型为父类的对象时无论子类中是否定义了这个static方法都会去调用父类中的static方法所以说static方法是可以被隐藏而不是被覆盖而private修饰的属性都不能被继承构造方法也同样是不能被继承的虽然子类通过super调用父类的构造方法但是在重写父类的其他方法时是不用这样做的所以编译时自然会知道这个构造方法属于哪个类。
3 多态内存
在Java中多态是面向对象编程的一个重要特性它允许子类对象被当作父类对象来使用。多态的实现涉及到方法的重写和动态绑定详见静态绑定和动态绑定。理解多态的内存模型有助于更好地掌握Java的内部工作机制。
针对对象的内存分配有以下两个概念 在创建对象时实际创建的对象被分配在堆内存中 创建对象实例的引用被分配在栈内存中
4 为什么要有多态多态解决了什么问题
我们知道多态是一种抽象的行为它允许程序员面向抽象变成而不是面对具体的实现类编程他可以增强代码的扩展性
例如小明很喜欢吃苹果但我们既可以说他喜欢吃苹果也可以说他喜欢吃水果如果他某天突然开始变得喜欢吃香蕉如果说的是他喜欢吃水果就不需要修改但如果是喜欢吃苹果就需要改成喜欢吃香蕉这展现了多态的灵活性。
再比如我想定义一个Person类内有一个方法work打印“工作”他的子类就可以重写这个work方法让他打印“上学”这样一来就可以在创建的对象都是Person类的时候通过new不同的实现类来体现不同的工作情况这就是多态。
5 接口和抽象类的异同
相同点 都不能被实例化创建对象 他们的子类必须实现他们类中所有的抽象方法才可以被实例化否则子类仍然为抽象类
不同点
关键字不同 抽象类子类使用继承extends关键字来继承抽象类接口实现类使用关键字implements实现接口 抽象类中可以有构造方法而接口中不允许有构造方法抽象类中既可以有普通方法也可以有抽象方法接口中只能有抽象方法方法的权限修饰符不同 抽象方法可以用除了private以外的修饰符接口中的方法只能用public修饰 抽象类中定义的变量可以是普通变量接口中只能定义静态的常量抽象类可以继承单个类和实现多个接口而接口可以实现多继承接口速度抽象类的速度要比接口快接口需要时间寻找在类中实现的方法
注意
1.如果一个类里存在抽象方法那么他一定是抽象类
2.抽象方法要被实现不能是静态的也不可以是私有的
3.接口内含有未被实现的方法也叫抽象方法但未使用abstract关键字
6 什么时候使用接口什么时候使用抽象类
接口的使用场合 类之间需要特定接口协调不在乎其如何实现 可以作为实现特定功能的标识存在也可以作为无接口方法的标识 用来将一组类视为单一的类调用者只能通过接口来访问这些类 需要实现特定的多项功能这些功能间也许毫无联系
抽象类的使用场合
如果既需要统一的接口还需要实例变量或缺省方法的情况下可以使用抽象类
7 什么是面向接口编程
面向接口编程就是在不使用继承的情况下只使用接口的实现类来处理所需要的问题的逻辑当需求变化时只需要编写该需求的实现类即可处理需求不需要改写大量的代码减少对系统的影响
8 关键字4种权限修饰符staticabstract final能否修饰的内容类属性方法构造方法表格形式呈现 类属性方法构造方法4种权限修饰符否能能能static否能能否abstract能否能否final能能能否