内部类与静态内部类区别及举例

1.内部类与静态内部类的区别

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

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

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

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

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

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对象,通过对象调用。而访问静态变量则不需要通过实例化对象,可以直接访问。

对于第1点

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

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

  • 13
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
内部类是指定义在其他类内部的类。根据定义的位置和特点,内部类可以分为成员内部类、局部内部类、匿名内部类和静态内部类。 1. 成员内部类: 成员内部类是定义在另一个类的内部,并且与外部类实例相关联的内部类。它可以访问外部类的成员变量和方法,甚至可以访问外部类的私有成员。 ```java public class OuterClass { private int outerVariable = 10; public class InnerClass { public void display() { System.out.println("Outer variable: " + outerVariable); } } } // 使用成员内部类 public class Main { public static void main(String[] args) { OuterClass outer = new OuterClass(); OuterClass.InnerClass inner = outer.new InnerClass(); inner.display(); } } ``` 2. 局部内部类: 局部内部类是定义在方法或作用域内的内部类,只能在定义它的方法或作用域中使用。局部内部类对外部世界是隐藏的,只能在其定义的方法或作用域中创建和使用。 ```java public class OuterClass { public void methodWithLocalInnerClass() { int localVar = 5; class LocalInnerClass { public void display() { System.out.println("Local variable: " + localVar); } } LocalInnerClass inner = new LocalInnerClass(); inner.display(); } } // 使用局部内部类 public class Main { public static void main(String[] args) { OuterClass outer = new OuterClass(); outer.methodWithLocalInnerClass(); } } ``` 3. 匿名内部类: 匿名内部类是没有名字的内部类,用于实现一个接口或继承一个类,并且在创建对象时进行定义和实例化。通常在需要临时实现某个接口或继承某个类的情况下使用。 ```java public interface MyInterface { void display(); } // 使用匿名内部类 public class Main { public static void main(String[] args) { MyInterface obj = new MyInterface() { @Override public void display() { System.out.println("Anonymous inner class"); } }; obj.display(); } } ``` 4. 静态内部类: 静态内部类是定义在另一个类内部,并且被声明为静态内部类。它与外部类实例无关,可以直接访问外部类静态成员,但不能访问外部类的实例成员。 ```java public class OuterClass { private static int outerStaticVariable = 5; public static class StaticInnerClass { public void display() { System.out.println("Outer static variable: " + outerStaticVariable); } } } // 使用静态内部类 public class Main { public static void main(String[] args) { OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass(); inner.display(); } } ``` 以上是对不同类型的内部类的简单示例。每种内部类都有其特定的应用场景和用途,可以根据实际需求选择合适的内部类类型来实现代码的设计和功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值