黑马程序员技术交流社区

标题: 毕老师视频内部类疑问 [打印本页]

作者: 樊其杰    时间: 2013-3-27 20:16
标题: 毕老师视频内部类疑问
本帖最后由 樊其杰 于 2013-3-27 21:50 编辑
  1. class Outer3 {

  2.         int x = 3;

  3.         public void method() {
  4.                 class Inner3 {
  5.                         public void function() {
  6.                                 System.out.println(x);
  7.                         }
  8.                 }
  9.         }
  10. }



  11. public class InnerClassDemo3 {


  12.         public static void main(String[] args) {
  13.                 Outer3 outer=new Outer3();
  14.                 outer.method();
  15.         }
  16. }
复制代码
System.out.println(x);这句为什么不执行,method()方法被调用了呀,为什么要new一个对象,那是不是执行一个类里面的方法,就必须new一个对象?
作者: HM马明宇    时间: 2013-3-27 20:35
method()方法是被调用了,但是你内部类里面的方法没有被调用啊!它怎么会执行?
  1. package com.itheima;

  2. public class TestSequence {

  3.         public static void main(String[] args) {
  4.                 Outer3 outer = new Outer3();
  5.                 outer.method();
  6.         }

  7. }

  8. class Outer3 {

  9.         int x = 3;

  10.         public void method() {
  11.                 class Inner3 {
  12.                         public void function() {
  13.                                 System.out.println(x);
  14.                         }
  15.                 }
  16.                 new Inner3().function();
  17.         }
  18. }
复制代码
method()方法里调用下就行了
作者: 曾祥旭    时间: 2013-3-27 21:03
(1)为什么System.out.println(x);这条语句没有执行?
你只是创建了一个外部类的对象调用外部类的成员方法,但是,此时,内部类位于外部类的成员方法内,你并没有创建对象去调function
这个方法,想要执行System.out.println(x);你需要做的就是创建内部类的对象,调用内部类中的方法,如:
class Outer3 {
        int x = 3;
        public void method() {
             class Inner3 {
                  public void function() {
                       System.out.println(x);
                        }
                }
             new Inner3().function();
        }
}
public class Test {
        public static void main(String[] args) {
                Outer3 outer=new Outer3();
                outer.method();
        }

}
(2)为什么要创建对象(new)?
我们知道方法的调用,无外乎只有两种,一种是对象调用,还有一种就是类名调用。此时,你也可以不new对象,用类名调用。如:
class Outer{
        private static int num=33;
        static class Inner{//它在Outer类中的成员位置上,那么可以通过对象调用成员
                 void show(){
                    System.out.println(num);
                }
                 static void function(){//如果内部类中定义了静态成员,该内部类就必须是静态的。
                         System.out.println("function run..."+num);
                 }
        }
        void method(){
                   Inner in=new Inner();
                   in.show();
        }
}
public class Test{
        public static void main(String[] args){

                //如果内部类是一个静态的,相当于一个外部类,我们就可以直接创建一个对象
                Outer.Inner in=new Outer.Inner();
            in.show();

                //如果内部类时静态的,成员是静态的,这个时候就不需要对象了
                Outer.Inner.function();
               
        }
}

作者: 胡国彬    时间: 2013-3-27 21:11
第一个问题:   不执行是因为你没有调用那个方法,你可以在Outer3的method()方法中new一下内部类的对象,然后通过对象的引用调用内部类的function()方法.这样的话,就会执行System.out.println(x);这句话.

第二个问题:  要执行一个类里面的方法,有好几种情况,
(1)如果类中的方法是静态的,那么就不需要new对象就可以直接拿类名进行调用,比如如果你的Outer3的method方法定义为 public static void method(),那这样的话,调用的方式就是Outer3.method().这样就可以调用了;
(2)如果类中的方法是public的,那么就需要new对象才能调用.
(3)如果类中的方法是protected的话,那么也需要new对象才能调用,但是和public有一个区别,就是protected的方法要调用的话,必须和这个类在一个包中才能调用,如果不在一个包里面,是不能调用的.
(4)如果类中的方法是private的话,那么只能在类中调用,不能在外面调用,也就是说,你即便new了对象,也不能访问这个方法.

有什么疑问可以继续追问.
作者: 陈丽莉    时间: 2013-3-27 21:36
若还有问题,请继续追问;没有的话,请将帖子分类改成【已解决】~




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