黑马程序员技术交流社区

标题: 关于继承与匿名内部类的问题 [打印本页]

作者: LINUS    时间: 2013-3-31 18:49
标题: 关于继承与匿名内部类的问题
为什么B类 格式不是  class B implements A 呢 ,如果不是接口,如果A类是抽象类格式该怎么写?
  1. interface A{
  2.         public abstract void show();
  3. }
  4. class B{
  5.         public static A method(){ //这一步什么意思,static A 是什么意思?
  6.                 return new A(){  //为什么必须用return ,而不是这个new的子类后面直接.show();结尾呢?
  7.                         public void show(){
  8.                                 System.out.println("淡定淡定淡定");
  9.                         }
  10.                 };
  11.         }
  12. }

  13. class Demo{
  14.         public static void main(String[] args){
  15.                 A a = B.method();// 这一步什么意思??
  16.                 a.show();

  17.         }
  18. }

复制代码

作者: 黄小贝    时间: 2013-3-31 18:59




作者: 小黑黑    时间: 2013-3-31 19:10
1、public static A method(),这句话的意思是B类中有个公有方法,是静态的,可被类直接调用,返回类型是一个接口A类型的,就相当于返回了int或者其他类型是一个道理,方法名为method
2、用return的原因就是因为你上面定义了返回类型是接口A类型的,所以你得返回一个A类型或其引用,对于void类型不用return的,但是对于有返回类型的方法,必须加上return返回你指定的类型(这里是A类型)。
3、new A()其实是使用了匿名内部类,你应该注意到了A()后有大括号,其中是实现A接口中的方法,因为你不能实例化一个接口,但是可以用这种方式(匿名内部类)来实例化接口(确切说是其子类)。
4、因为你这里的new A(){....}是作为方法的放回值存在的,返回的是A接口的类型对象或其引用,如果你.show()的话,那么返回的是这个调用的show方法的结果,就好比说,假设你这样做:A a = new A(){.....},在这里你就相当于调用了a.show(),,返回的是打印的语句,其实就是void,那么你不是和上面你指定返回A类型矛盾吗?所以不能加上.show()
5、对于A a = B.method(),因为B.method()的值是一个实现A的对象,那么将实现A的对象赋给A的引用a,就相当于我上面写的:A a = new A(){.....}。
作者: yhnan    时间: 2013-3-31 19:15
本帖最后由 易贺男 于 2013-3-31 19:22 编辑

public static A method(){ //这一步什么意思,static A 是什么意思?
这是一个静态函数 返回值是A类型的。
return new A(){  //为什么必须用return ,而不是这个new的子类后面直接.show();结尾呢?
意思是返回一个A类型的对象。这是一个复写了A的show方法的匿名内部类(A的子类)
A a = B.method();// 这一步什么意思??
这步运用到多态。因为method方法是静态的所以可以被类名直接调用
作者: 董维明    时间: 2013-3-31 20:58
如果A 类 是抽象类的话,写法如下
  class A{
        public abstract void show();
   }
class B extends A {
     public abstract void show(){
         System.out.print("作为子类,B 必须重写 父类 A中的抽象方法!");
    }
  public static A method(){   这个是子类的特有方法,,就是自己的,大个比喻吧,,这个是你老婆,而不是你从父亲那里继承来的
                return new A(){
                        public void show(){
                                System.out.println("淡定淡定淡定");
                        }
                };
        }
}
作者: 董维明    时间: 2013-3-31 21:03
class B{
        public static A method(){ //这个是 B类的自己的静态方法,如果想使用该方法时,可通过俩种方式,一种是new一个B 类的对象,通过对象.调用,在这里该方法是静态方法,可使用类名.方法直接调用。 这里A 是返回类型,意思是返回一个A 类型。
                return new A(){  //因为method 方法是有返回类型的,所以必须return。
                        public void show(){
                                System.out.println("淡定淡定淡定");
                        }
                };
        }
作者: 董维明    时间: 2013-3-31 21:05
class Demo{
        public static void main(String[] args){
                A a = B.method(); //这是通过B类.直接调用了B类中的静态方法method();,且该方法返回的是一个A 类型的对象。
                a.show();

        }
}
作者: 周一川    时间: 2013-3-31 21:22
继承是子类继承父类的所有成员,内部类是就只执行一次的对象一建立就只执行一次
作者: LINUS    时间: 2013-3-31 21:34
还是有点模糊·······不知固定合适还是?~
作者: 董维明    时间: 2013-4-1 07:55
建议 你好好 看看 毕老师的 java基础吧,,可以多看几遍,,我都看好几遍了,,想把 基础 摸透 咯,,再往下学,,要不很 吃力的
作者: 张超    时间: 2013-4-1 12:42
黄小贝 发表于 2013-3-31 18:59

小贝。你用的是什么软件呀
用来编辑那个红色方框的。
作者: 黄小贝    时间: 2013-4-1 15:45
张超 发表于 2013-4-1 12:42
小贝。你用的是什么软件呀
用来编辑那个红色方框的。

很明显说出来你们都不信,QQ~~~~
作者: 张超    时间: 2013-4-1 16:09
黄小贝 发表于 2013-4-1 15:45
很明显说出来你们都不信,QQ~~~~

这麽神奇,QQ的什么功能呀
作者: 黄小贝    时间: 2013-4-1 16:11
张超 发表于 2013-4-1 16:09
这麽神奇,QQ的什么功能呀

QQ的截图功能,ctrl+alt+A  截图框下面就有各种方框,文字,和线
作者: 张超    时间: 2013-4-1 17:39
黄小贝 发表于 2013-4-1 16:11
QQ的截图功能,ctrl+alt+A  截图框下面就有各种方框,文字,和线

哦,刚刚试了还不错,


作者: vmvm555    时间: 2013-4-2 12:07
这很简答,你要明白,接口不能创建对象
public static A method(){ //这一步什么意思,static A 是什么意思?static方法代表该类是静态的,返回值是A,但A是一个接口,所以返回的是实现了接口A的类对象
return new A(){  //为什么必须用return ,而不是这个new的子类后面直接.show();结尾呢?A是接口,无法创建对象,所以必须使用匿名内部类,创建一个实现接口的类,并
覆写接口中的抽象方法
A a = B.method();// 这一步什么意思?调用静态方法method,返回的是实现了A接口的对象
作者: 黄玉昆    时间: 2013-4-3 12:05
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
作者: 黄玉昆    时间: 2013-4-4 16:47
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2