没看明白LZ的问题,给LZ段小代码,Lz看看是哪里不清楚? interface Ia { void m1(); }interface Ib extends Ia { void m2(); }class A implements Ia { public void m1() {System.out.println("A:m1");} }class B implements Ib { public void m1() {System.out.println("B:m1");} public void m2() {System.out.println("B:m2");} }class Test { public static void main(String[] args) { Ia ia = new A(); ia.m1();
Ia iab = new B(); iab.m1(); Ib ib = (Ib)iab; ib.m2(); } }
SayHello dogSayHello=new Dog(); dogSayHello.sayHello(); }} miaomiao wang wang ~~ miaomiao wang wang ~~ 看看结果 明白了?你可以对照着书看看向上转型,其实接口和继承是差不多的。 你可以声明为接口类型, 也可以声名为对象自己的类型 。如果你关心的只是接口提供的方法 就可以向上转型提供多态机制,否则可以声明为对象类型。 求分~~~
接口是类型, 实现了接口的类可以看成该接口的子类型。 这样, 实例化的类可以赋值给接口引用, 就像子类实例可以赋值给基类引用一样A.javapublic interface A { void f(); }AImp.java public class AImp { public void f() { System.out.println("AImp"); } }Tester.java public class Tester { public static void main(String[] args) { A a = new AImp(); a.f(); } }
你不能 new 接口, 只能 new 一个实现了接口的类的实例, 然后将这个实例赋值给接口引用 比如 A { void fun(); }, B implements A. 那么 A a = new B(); a.fun();
纠正一下: public class AImp implements A { }
看看吧。大一时整理的http://lavenders.tk/?post=5
7楼的代码public static void main(String[] args) { Ia ia = new A(); ia.m1();
Ia iab = new B(); iab.m1(); Ib ib = (Ib)iab; ib.m2(); 这么写Ia ia=new A();是什么意思?
额。这里给你贴个代码吧。 public interface A(){ void f(); } public class Aa() implements A{ public void f(){} public static void main(String[] args){ A a = new Aa();//这里是创建借口引用指向实例对象。(涉及向上转型) Aa b = new Aa();//这里就是正常声明了。 } }
interface Ia {
void m1();
}interface Ib extends Ia {
void m2();
}class A implements Ia {
public void m1() {System.out.println("A:m1");}
}class B implements Ib {
public void m1() {System.out.println("B:m1");}
public void m2() {System.out.println("B:m2");}
}class Test {
public static void main(String[] args) {
Ia ia = new A();
ia.m1();
Ia iab = new B();
iab.m1(); Ib ib = (Ib)iab;
ib.m2();
}
}
package InterfaceDemo;public interface SayHello {
void sayHello();}
package InterfaceDemo;public class Cat implements SayHello{ @Override
public void sayHello() {
System.out.println("miaomiao");
}}package InterfaceDemo;public class Dog implements SayHello{ @Override
public void sayHello() {
System.out.println("wang wang ~~");
}
}
package InterfaceDemo;public class Test {
public static void main(String [] args){
Cat cat=new Cat();
cat.sayHello();
Dog dog=new Dog();
dog.sayHello();
SayHello catSayHello=new Cat();
catSayHello.sayHello();
SayHello dogSayHello=new Dog();
dogSayHello.sayHello();
}}
miaomiao
wang wang ~~
miaomiao
wang wang ~~
看看结果 明白了?你可以对照着书看看向上转型,其实接口和继承是差不多的。 你可以声明为接口类型, 也可以声名为对象自己的类型 。如果你关心的只是接口提供的方法 就可以向上转型提供多态机制,否则可以声明为对象类型。
求分~~~
你new对象的时候用接口名字new能行吗?
你运行一下八楼的例子,别说你运行都通过不了?
SayHello say =new Cat();
这里SayHello 称为引用类型, Cat则是对象的实际类型,由于java是动态解析的,所以就有了多态机制,就是向上转型 。此处 SayHello 就相当于父类型,Cat相当于子类型,具体涉及到虚拟机的解析过程,我的日志里写了一下你可以看看。 这和类继承差不多 ,接口可以为不相关的类抽象出共同的服务,以实现多态机制。 还不懂的话就快去看书吧回答了你也听不明白
void f();
}AImp.java
public class AImp {
public void f() { System.out.println("AImp"); }
}Tester.java
public class Tester {
public static void main(String[] args)
{
A a = new AImp();
a.f();
}
}
你不能 new 接口, 只能 new 一个实现了接口的类的实例, 然后将这个实例赋值给接口引用
比如 A { void fun(); }, B implements A. 那么 A a = new B(); a.fun();
public class AImp implements A {
}
Ia ia = new A();
ia.m1();
Ia iab = new B();
iab.m1(); Ib ib = (Ib)iab;
ib.m2();
这么写Ia ia=new A();是什么意思?
public interface A(){
void f();
}
public class Aa() implements A{
public void f(){}
public static void main(String[] args){
A a = new Aa();//这里是创建借口引用指向实例对象。(涉及向上转型)
Aa b = new Aa();//这里就是正常声明了。
}
}