注册 登录
编程论坛 JAVA论坛

为什么找不到符号????

新人学习 发布于 2018-10-30 21:29, 3697 次点击
interface AA
{
    //接口
    void f();
}

class BB                     
{
    public void f() {System.out.println("BB");}
    public class BC implements AA
    {
        public void f() {System.out.println("BC");}
        public class BD implements AA
        {
            public void f() {System.out.println("BD");}
        }
        public AA Newn()
        {
            return new BD();
        }
    }
    public AA New() //BC 没有对象 就无法创建BD对象 因为他们都是非静态class 必须要有外部类对象才能创建内部类对象
    {
        return new BC();
    }
}

class CC
{
    public void f() {System.out.println("CC");}
    private static class CA implements AA
    {
        public void f() {System.out.println("CA");}
        private static class CB implements AA
        {
            public void f() {System.out.println("CB");}
        }
    }
    public static AA New(int i)
    {
        if (i == 1 && i != 2)
            return new CA();
        else
            return new CA.CB();
    }
}
public class lianxi19
{
    public static void play(BB a)
    {
        AA a1 = a.New();
        AA a2 = a1.Newn();
        AA a3 = CC.New(1);
        AA a4 = CC.New(2);
    }
   
    public static void main(String[] args)
    {
        play(new BB());
    }
}
/*
lianxi19.java:54: 错误: 找不到符号
                AA a2 = a1.Newn();
                          ^
  符号:   方法 Newn()
  位置: 类型为AA的变量 a1
1 个错误

D:\wendang\linshijava\Nine\ten>
*/
3 回复
#2
纵横阳仔2018-10-31 11:28
这里是涉及到成员内部类和静态内部类的问题;

成员内部类创建实例时,需要先创建外部类的实例(该实例与外部实例息息相关,只能被外部实例使用)
静态内部类创建实例时,不需要创建外部类的实例,只需表名该实例属于哪一种类即可(该实例与外部类型息息相关;所有的外部类的实例都可以使用该实例)

AA a2 = a1.Newn();
这句话在编译的时候会出错;因为编译看左边;变量a1是 AA 类型(由AA a1 = a.New();决定),AA没有newn()这个方法;
要想使用则应将其转化为对应的类型;
AA a2 = ((BB.BC)a1).Newn();
#3
TysonKoothra2018-10-31 15:08
Newn方法也可以写在BB里面。
程序代码:

public AA Newn(){
    return (new BC()).new BD();
}

play里面写AA a2=a.Newn();

[此贴子已经被作者于2018-10-31 15:11编辑过]

#4
新人学习2018-10-31 22:56
回复 2楼 纵横阳仔
是啊 需要向下转型
我今天刚弄明白.

谢谢你.
1