消息的含义:对象引用向对象发出的服务请求,是数据成员和成员方法的调用。
互发消息含义:通过一个对象的引用来调用另外一个对象的数据成员或成员方法,实现了两个对象之间的联系。
class NPC1 {
private String Name = "NPC1";
public String GetName(){return Name;}
public void Talk(String Name) {
System.out.println("Hello " + Name);
}
}
class NPC2 {
private String Name = "NPC2";
public String GetName(){return Name;}
public void Talk(String Name) {
System.out.println("Hello " + Name);
}
}
class TalkManager {
public static void main(String[] args) {
NPC1 npc1=new NPC1();
NPC2 npc2=new NPC2();
npc1.Talk(npc2.GetName());
npc2.Talk(npc1.GetName());
}
}
2.组合与继承的区别以及两者的使用场景
组合和继承是Java中两种代码复用的方式。
组合指的是在新类中创建原有类的对象,重复利用已有类的功能。
继承则是根据其他类的实现来定义一个新类的实现。可以使用现有类的功能,并且在无需重复编写原有类的情况下对原有类进行功能上的扩展。
组合实例
class People{
...
}
class Student{
private People a=new People();
}
继承实例
class People{
...
}
class Student extends People{
...
}
两种方法使用选择:除非两个类之间是“is-a”的关系,否则不要轻易的使用继承,不能单纯的为了实现代码的重用而使用继承,因为过多的使用继承会破坏代码的可维护性,当父类被修改时,会影响到所有继承自它的子类,从而增加程序的维护难度和成本。不要仅仅为了实现多态而使用继承,如果类之间没有“is-a”的关系,可以通过实现接口与组合的方式来达到相同的目的。设计模式中的策略模式可以很好的说明这一点,采用接口与组合的方式比采用继承的方式具有更好的可扩展性。所以不难看出,在Java中能使用组合就尽量不要使用继承。
3.Java中的运行时多态的含义及作用多态的含义:同种类的多个对象,在接收到同一个消息时却产生了不同的反应和效果。
运行时多态的含义:使用父类引用指向子类对象,再调用某一父类中的方法时,不同的子类会表现出不同的结果。
作用:增加了程序的扩展性和可维护性。即如果再增加一个子类,不需要改写父类方法,只需要子类继承父类,覆盖父类其中的方法,就可以实现子类。
实例:
鸟类:
public class Bird{
public void chirp(){
System.out.println("鸟叫声");
}
}
鹦鹉类:
public class Parrot extends Bird{
public void chirp(){
System.out.println("鹦鹉的叫声");
}
}
麻雀类:
public class Sparrow extends Bird{
public void chirp(){
System.out.println("麻雀的叫声");
}
}
public class People{
public void listen(Bird bird){
bird.chirp();
}
public static void main(String[] args) {
People a=new People();
a.listen(new Parrot());
}
}
4.instanceof的使用场景
instanceof是Java的一个保留关键字,左边是对象,右边是类,返回类型是Boolean类型。它的具体作用是测试左边的对象是否是右边类或者该类的子类创建的实例对象,是,则返回true,否则返回false。
应用场景:需要用到对象的强制类型转换时,需要使用instanceof进行判断。
实例:
class Uncle{}
class Pare{}
class Pare1 extends Pare{}
class Pare2 extends Pare1{}
class Pare3 {
public static void main(String[ ] args){
Uncle u= new Unc1e();
Pare P= new Pare();
Pare1 p1 = new Pare1();
Pare2 p2 = new Pare2();
}
//本类对象是本类的实例
if ( p instanceof Pare){
System.out.println( "p instanceof Pare" );//子类对象是父类的实例
}
//子类对象是父类的实例
if (!( p1 instanceof Pare)){
System.out.println( "pi not instanceof Pare");
}
else{
System.out.println( "p1instanceof Pare");
}
//父类对象不是子类的实例
if (p1 instanceof Pare2){
System.out.println( "p1 instanceof Pare2");
}
else{
System.out.println( "p1 not instanceof Pare2");
}
if (null instanceof String){
System.out.printLn( "null instanceof String");
}
else{
System.out.println( "null not instanceof String");
}
}
5.抽象类与接口的异同以及两者的使用场景
抽象类:如果一个类中包含抽象方法,那么这个类就是抽象类。在Java语言中,可以通过把类或类中的某些方法声明abstract来表示一个类是抽象类。
接口:接口就是指一个方法的集合,接口中的所有方法都没有方法体,在Java语言中,接口是通过关键字interface来实现的。
相同点:
- 抽象类与接口都不能被实例化,但可以有声明,用于被其它类继承和实现。
- 抽象类与接口都可以包含抽象方法,继承抽象类和实现接口的普通子类都必须实现这些抽象方法。
不同点:
- 接口里只能包含抽象方法、静态方法和默认方法,不能为普通方法提供方法实现;抽象类则完全可以包含普通方法。
- 接口里只能定义静态常量,不能定义普通成员变量;抽象类里则既可以定义普通成员变量,也可以定义静态常量。
- 接口里不包含构造器;抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。
- 接口里不能包含初始化块;但抽象类则完全可以包含初始化块。
- 一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java但集成的不足。
使用场景:
抽象类的使用场景
既想约束子类具有共同的行为(但不再乎其如何实现),又想拥有缺省的方法,又能拥有实例变量
如:模板方法设计模式,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中某些步骤的具体实现。
接口的应用场景
- 约束多个实现类具有统一的行为,但是不在乎每个实现类如何具体实现
- 作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识
- 实现类需要具备很多不同的功能,但各个功能之间可能没有任何联系
- 使用接口的引用调用具体实现类中实现的方法(多态)



