A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lpf870826 中级黑马   /  2014-12-31 09:30  /  1840 人查看  /  12 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

class DogTesrDrive {
    public static void main(String[] args) {
        Dog d = new Dog();
        d.bark();
        Dog.bark();  // ? 为什么bark()是非静态方法,却可以这样调用?
        
        class Dog {
            void bark() {
                System.out.println("ruff ruff");
            }
        }
    }
}
结果为ruff ruff
           ruff ruff

内部类中方法在编译时不调用不会执行

class DogTesrDrive {
    public static void main(String[] args) {
        Dog d = new Dog();
        d.bark();
        Dog.bark();
        //bark();  
        class Dog {
            static void bark() {
                System.out.println("ruff ruff");
            }
        }
    }
}
不能编译,内部类中不能用static修饰。为什么?
编译结果:
DogTesrDrive.java:9: 错误: 内部类Dog中的静态声明非法
            static void bark() {
                        ^
  修饰符 'static' 仅允许在常量变量声明中使用
1 个错误

第三:
class DogTesrDrive {
    public static void main(String[] args) {
        Dog d = new Dog();
        d.bark();
        Dog.bark();
        //bark();  
        static class Dog {
            static void bark() {
                System.out.println("ruff ruff");
            }
        }
    }
}
为什么不能编译?
编译结果:
DogTesrDrive.java:8: 错误: 非法的表达式开始
        static class Dog {
        ^
1 个错误

12 个回复

倒序浏览
哥们你再检查下代码,你这内部类定义在main方法中,想定义局部内部类?主函数是静态的~~
回复 使用道具 举报
代码测试过吗?
回复 使用道具 举报
1,为什么bark()是非静态方法,却可以这样调用?
Answer:因为你构建一个Dog,其实是为一个局部变量,所以静态函数中是可以使用局部变量。同一个类级别A中的静态方法只可以直接调用类A的静态方法和静态成员变量,而不能够直接调用A中非静态的变量和方法。但是静态方法中是可调用局部变量的东西。
2,不能编译,内部类中不能用static修饰。为什么?
Answer:根据内部类规则,如果变量方法是静态,那么内部类肯定要为静态的。
3,为什么不能编译?
Answer:要注意的是,静态方法中,我们是不可以定义局部的静态变量的,这个是不被允许的(与C是不同)。
回复 使用道具 举报 1 1
王世虎 发表于 2014-12-31 12:00
哥们你再检查下代码,你这内部类定义在main方法中,想定义局部内部类?主函数是静态的~~ ...

呵呵 没看明白
回复 使用道具 举报
hello_csu 发表于 2014-12-31 14:33
1,为什么bark()是非静态方法,却可以这样调用?
Answer:因为你构建一个Dog,其实是为一个局部变量,所以 ...

谢谢了
回复 使用道具 举报
李票 中级黑马 2014-12-31 21:42:15
7#
(同一级别下)静态方法调用静态方法和静态变量,非静态函数调用静态成员和非静态成员。但是都可以调用局部成员
回复 使用道具 举报
我看视频的时候,里面是这样说的,局部内部类:方法当中写内部类,访问规则(1.内部类可以直接访问外部内中的成员,包括私有。2.外部类要访问内部类,必须建立内部类对象。),但是不能被private修饰,因为private修饰的是成员。也不能定义成static修饰,因为它也是修饰成员的
回复 使用道具 举报
2楼正解:lol
回复 使用道具 举报
楼主的这些问题我都还没注意过呢.
回复 使用道具 举报
你的代码就有问题,我实例验证过,在你的代码中只有把局部内部类代码放在创建内部类对象的代码之上才能编译通过。
还有你的这段代码中的(   Dog.bark();  )是绝对有问题的!不能这样调用,因为(类名.方法名)调用必须是一个类中的静态方法才行;
那么问题来了:在内部类之外访问内部类之中的内容只能是生成内部类的实例才行(如果不是static的内部类,必须依赖外部类的实例才能生成)。这跟加了静态就能用类名直接调用的说法有冲突,类的规则肯定优先于方法的规则,所以你问的第二段代码才会提示编译报错;
那么接着你的第三段代码的问题,局部内部类定义在方法中,比方法的范围还小。是内部类中最少用到的一种类型。像局部变量一样,不能被public, protected, private和static修饰。

以上是我在新年之夜亲手实验,和百度出来的,如有不同见解,欢迎指正
回复 使用道具 举报
内部类学起来比较吃力,还有一个什么局部内部类,很是难懂。还得继续多看书啊。
回复 使用道具 举报

肯定测试过,这些代码包括错误提示,都是在写代码时,记录下来的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马