一个关于JAVA基础知识的问题?
//fileInFace.javapublicinterfaceInFace{publicvoidinFaceA();}//fileImple.javapubliccla...
//file InFace.java
public interface InFace
{
public void inFaceA();
}
//file Imple.java
public class Imple implements InFace
{
public void inFaceA()
{
System.out.println("InterFace method!");
}
public void impleB()
{
System.out.println("Implement method!");
}
}
//file TestIn.java
public class TestIn
{
public static void main(String[] args)
{
InFace i = new Imple();
i.inFaceA() ;
System.out.println( i.toString() );
//为什么此处i只能显示调用inFaceA,而不能调用impleB.
}
} 展开
public interface InFace
{
public void inFaceA();
}
//file Imple.java
public class Imple implements InFace
{
public void inFaceA()
{
System.out.println("InterFace method!");
}
public void impleB()
{
System.out.println("Implement method!");
}
}
//file TestIn.java
public class TestIn
{
public static void main(String[] args)
{
InFace i = new Imple();
i.inFaceA() ;
System.out.println( i.toString() );
//为什么此处i只能显示调用inFaceA,而不能调用impleB.
}
} 展开
2个回答
展开全部
当用接口指向实现类的时候,只能使用由接口声明的并且被实现类实现的方法,这时不能再使用实现类自己特有的方法了。
举个简单的例子。
class 政治家类 implements 愚蠢接口;
当 “愚蠢接口 蠢人=new 政治家类();”的时候,我们只需要关心“政治家类实例”愚蠢的一面了,而不必关心“政治家类实例”从“政治家类”中获得的其他的特性了,我们有的只是一个“蠢人”!
如果这时你一定要使用“政治家类”的某些特有方法,可以将上例中的“蠢人”强制转换回“政治家类”的对象。(政治家类 政治家=(政治家类)蠢人;)
用你的例子:
“
Imple imple = (Imple)i;
imple.impleB() ;
”
然而接口更大的意义在于:很多实现类可以实现同一个接口,当一个方法的参数中需要用到所有的实现类,而且在方法中仅需要使用这些实现类实现自接口声明的方法的时候,可以不必对方法进行多次重载,而直接将接口作为方法的形参。
再举个例子。
“政治家类”和“社会盲流类”都实现了“愚蠢接口”,(class 政治家类 implements 愚蠢接口;class 社会盲流类 implements 愚蠢接口;)而“愚蠢接口”中声明了“说空话方法”,当我们需要一个方法“谴责”所有实现了“愚蠢接口”的“蠢人”的时候,我们可以这样做:
“[public] void 谴责(愚蠢接口 蠢人)
{
强烈谴责(蠢人.说空话方法());
}
”
这样,无论在调用“谴责”方法的时候传入的实参是“政治家”还是“社会盲流”(谴责(new 政治家类());谴责(new 社会盲流类())),我们都可以“强烈谴责”了,而没有必要去区分“谴责”的是“政治家”还是“社会盲流”了。
无论怎么说,接口是面向对象程序设计中一个非常重要的工具!
另外,所举例子纯属信手拈来,本人绝没有歧视“政治家”和“社会盲流”的意思。
举个简单的例子。
class 政治家类 implements 愚蠢接口;
当 “愚蠢接口 蠢人=new 政治家类();”的时候,我们只需要关心“政治家类实例”愚蠢的一面了,而不必关心“政治家类实例”从“政治家类”中获得的其他的特性了,我们有的只是一个“蠢人”!
如果这时你一定要使用“政治家类”的某些特有方法,可以将上例中的“蠢人”强制转换回“政治家类”的对象。(政治家类 政治家=(政治家类)蠢人;)
用你的例子:
“
Imple imple = (Imple)i;
imple.impleB() ;
”
然而接口更大的意义在于:很多实现类可以实现同一个接口,当一个方法的参数中需要用到所有的实现类,而且在方法中仅需要使用这些实现类实现自接口声明的方法的时候,可以不必对方法进行多次重载,而直接将接口作为方法的形参。
再举个例子。
“政治家类”和“社会盲流类”都实现了“愚蠢接口”,(class 政治家类 implements 愚蠢接口;class 社会盲流类 implements 愚蠢接口;)而“愚蠢接口”中声明了“说空话方法”,当我们需要一个方法“谴责”所有实现了“愚蠢接口”的“蠢人”的时候,我们可以这样做:
“[public] void 谴责(愚蠢接口 蠢人)
{
强烈谴责(蠢人.说空话方法());
}
”
这样,无论在调用“谴责”方法的时候传入的实参是“政治家”还是“社会盲流”(谴责(new 政治家类());谴责(new 社会盲流类())),我们都可以“强烈谴责”了,而没有必要去区分“谴责”的是“政治家”还是“社会盲流”了。
无论怎么说,接口是面向对象程序设计中一个非常重要的工具!
另外,所举例子纯属信手拈来,本人绝没有歧视“政治家”和“社会盲流”的意思。
展开全部
首先你要了解的是"多态"
那么这里的原因就是因为你使用的是多态.
这里简单的说一下,多态是JAVA的一种机制,它允许父类的引用去引用一个子类的对象,或者接口的引用去引用一个接口实现类的对象(正如你这例子一样,你的Imple类是一个Inface的实现类,你的i是接口Inface的引用,引用了Imple的对象.)...
使用多态的目的是,我们只需要知道父类或者接口所提供的方法,就能知道其子类或者实现类应具有的方法(比如你的inFaceA().那么相应的,我们并不能确定子类或者实现类本身还具有的自有的方法,比如你的impleB().
说简单一点,如果有一个父类或者接口的引用,我们使用这个引用去指向一个子类或者实现类对象,我们只能使用(我们通过该引用只知道)在父类或者接口中的方法,子类或者实现类新增的属性或方法我们是不知道的,只能通过子类或者实现类本身的引用来获取.
那么这里的原因就是因为你使用的是多态.
这里简单的说一下,多态是JAVA的一种机制,它允许父类的引用去引用一个子类的对象,或者接口的引用去引用一个接口实现类的对象(正如你这例子一样,你的Imple类是一个Inface的实现类,你的i是接口Inface的引用,引用了Imple的对象.)...
使用多态的目的是,我们只需要知道父类或者接口所提供的方法,就能知道其子类或者实现类应具有的方法(比如你的inFaceA().那么相应的,我们并不能确定子类或者实现类本身还具有的自有的方法,比如你的impleB().
说简单一点,如果有一个父类或者接口的引用,我们使用这个引用去指向一个子类或者实现类对象,我们只能使用(我们通过该引用只知道)在父类或者接口中的方法,子类或者实现类新增的属性或方法我们是不知道的,只能通过子类或者实现类本身的引用来获取.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询