【内部类与静态内部类的区别】

本文详细介绍了Java中内部类的两种类型:静态内部类和非静态内部类。静态内部类独立于外部类存在,不能直接访问外部类的非静态成员,但能访问静态成员。非静态内部类可以直接访问外部类的所有成员,包括静态和非静态。外部类访问内部类需创建内部类对象,其他类访问内部类同样需要外部类对象。文中通过示例展示了如何在代码中使用这两种类型的内部类及其访问规则。
摘要由CSDN通过智能技术生成

内部类与静态内部类的区别:
第一:静态内部类相对与外部类是独立存在的,在静态内部类中无法直接访问外部类中的变量、方法。如果要访问的话,必须要new一个外部类的对象,使用new出来的对象来访问。 但是可以直接访问静态变量,调用静态的方法。

第二:普通内部类作为外部类一个成员而存在,在普通内部类中可以直接访问外部类属性,调用外部类的方法。

第三:如果外部类要访问内部类的属性或者调用内部类的方法,必须要创建一个内部类的对象,使用该对象访问属性或者调用方法。

第四:如果其他的类要访问普通内部类的属性或者调用普通内部类的方法,必须要在外部类中创建一个内部类的对象作为一个属性,外部类可以通过属性调用普通内部类的方法或者访问普通内部类的属性。

第五:如果其他的类要访问静态内部类的属性或者调用静态内部类的方法,直接创建一个静态内部类对象即可。

2.举例说明
2.1 内部类
public class Father {
       private String name;
   
       public Father(String name) {
             this.name = name;
       }

      public void say(String dogName) {
           Dog dog = new Dog(dogName);
           System.out.println("i am " + name + ", i have a dog " + dog.dogName);
      }
    
        public void feed() {
            System.out.println("feed in Father");
      }
    
        public  class Dog {
               private String dogName;

               public Dog(String dogName) {
                    this.dogName = dogName;
          }

          public void bark() {
                feed();
                System.out.println("i am " + dogName + ", i am belong to " + name);
          }
          public String getDogName() {
              return dogName;
         }
     }
}

对于第2条,普通内部类作为成员,可以直接访问外部类的变量,调用其方法。可以看到Dog内中的bark()方法可以直接使用变量name,可以调用feed方法。

对于第3条,我们在Father类中,想要使用Dog类中的属性dogName,必须先实例化一个dog对象,然后通过该对象调用方法,获取变量。

对于第4条,那先创建一个外部类

public class YYTest {
    
    public static void main(String[] args)  {
          final Father zhangsan = new Father("zhangsan");
          Father.Dog gg = zhangsan.new Dog("GG");

          gg.getDogName();
          gg.bark();
    }
}

可以看到,通过对象zhangsan.new Dog()方法实例化一个内部类对象gg,通过该内部类对象可以访问变量,调用方法。

2.2 静态内部类
public class Father {
      private String name;
      private static String sex = "female";
      public Father(String name) {
          this.name = name;
    }

   public void say(String dogName) {
         Dog dog = new Dog(dogName);
         System.out.println("i am " + name + ", i have a dog " + dog.dogName);
    }
    
   public void feed() {
         System.out.println("feed in Father");
    }
    
    public static class Dog {
        private String dogName;

        public Dog(String dogName) {
            this.dogName = dogName;
        }

        public void bark() {
            Father lisi = new Father("lisi");
            lisi.feed();
            System.out.println("i am " + dogName + ", i am belong to " + lisi.name + ", his sex is " + sex);
        }

        public String getDogName() {
            return dogName;
        }
    }
}


对于第1条,可以看到bark()方法中想要使用name属性,需要先实例化Father对象,通过对象调用。而访问静态变量则不需要通过实例化对象,可以直接访问

对于第5条:

public class YYTest {
    
    public static void main(String[] args)  {
          Father.Dog hh = new Father.Dog("HH");
          hh.bark();
    }
}

直接实例化静态内部类即可。注意实例化方法即可。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵俺第一专栏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值