什么是内部类?有什么作用?静态内部类和非静态内部类的区别?

  • Post author:
  • Post category:其他

一、 定义

放在一个类的内部的类我们就叫内部类。

二、 作用

1.内部类可以很好的实现隐藏

一般的非内部类,是不允许有 private 与protected权限的,但内部类可以;

平时我们对类的访问权限,都是通过类前面的访问修饰符来限制的,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以,所以我们能通过内部类来隐藏我们的信息

2.内部类拥有外围类的所有元素的访问权限

3.可是实现多重继承

个特点非常重要,个人认为它是内部类存在的最大理由之一。正是由于他的存在使得Java的继承机制更加完善。大家都知道Java只能继承一个类,它的多重继承在我们没有学习内部类之前是用接口来实现的。但使用接口有时候有很多不方便的地方。比如我们实现一个接口就必须实现它里面的所有方法。而有了内部类就不一样了。它可以使我们的类继承多个具体类或抽象类:

public class Example1 {
  public String name() {
    return "liutao";
  }
}
public class Example2 {
  public int age() {
    return 25;
  }
}
public class MainExample {
  private class test1 extends Example1 {
    public String name() {
      return super.name();
    }
   }
 
    private class test2 extends Example2 {
     public int age() {<br>       return super.age();<br>     }
    }
 
   public String name() {
    return new test1().name();<br>   }
 
   public int age() {
    return new test2().age();<br>   }
 
   public static void main(String args[]) {
 
       MainExample mi=new MainExample();
 
       System.out.println("姓名:"+mi.name());
 
       System.out.println("年龄:"+mi.age());
 
   }
 
}

大家注意看类三,里面分别实现了两个内部类 test1,和test2 ,test1类又继承了Example1,test2继承了Example2,这样我们的类三MainExample就拥有了Example1和Example2的方法和属性,也就间接地实现了多继承。

4.可以避免修改接口而实现同一个类中两种同名方法的调用。

三.static(静态)关键字

1.被static修饰的成员变量,成员方法,可以直接被调用而不需要创建对象

2.静态方法中,静态方法中不能使用非静态变量或方法,因为非静态变量,方法需要使用对象调用,与方法本意冲突

3.静态变量被所有对象共享,在内存中只有一个创建

四.静态内部类

1.只有内部类才能定义为静态类

2.静态类中可以定义静态方法也可以定义非静态方法,静态方法可以在在外层通过静态类调用,非静态方法必须创建对象调用

3.静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)。

五,区别:

1.非静态内部类不能有静态成员(方法、属性),但是静态内部类的方法和变量可以是静态的也可以是非静态的,静态的方法可以在外层通过静态类调用,而非静态的方法必须要创建类的对象之后才能调用。

2.非静态内部类可以访问外部类的所有成员,无论静态还是非静态。但是静态内部类只能访问外部类的静态成员,无法访问非静态成员。

3.创建对象时,静态内部类只需要new 外部类.内部静态类名()创建;而非静态内部类需要创建外部类对象,再由外部类对象.new 内部非静态类名()创建。

静态内部类和非静态内部类区别汇总

一、非静态内部类:

1、变量和方法不能声明为静态的。(类的编译顺序:外部类–静态方法或属性–内部类,如果内部类声明为静态的,造成编译顺序冲突。个人理解)

2、实例化的时候需要依附在外部类上面。比如:B是A的非静态内部类,实例化B,则:A.B b = new A().new B();

3、内部类可以引用外部类的静态或者非静态属性或者方法。

二、静态内部类:

1、属性和方法可以声明为静态的或者非静态的。

2、实例化静态内部类:比如:B是A的静态内部类,A.B b = new A.B();

3、内部类只能引用外部类的静态的属性或者方法。

4、如果属性或者方法声明为静态的,那么可以直接通过类名直接使用。比如B是A的静态内部类,b()是B中的一个静态属性,则可以:A.B.b();

三、关于java静态方法的相关总结:

1.一个类的静态方法只能访问静态属性(静态方法是属于类的,而普通方法是属于对象的。)

2.一个类的静态方法不能够直接调用非静态方法;

3.如访问控制权限允许,static 属性和方法可以使用类名加“.”方式调用;当然也可以使用实例加“.”方式调用;

4.静态方法中不存在当前对象,因而不能使用“this”,当然也不能使用”super”;

5.静态方法不能被非静态方法覆盖;

6.构造方法不允许声明为 static 的;

7.局部变量不能使用static修饰;

问题:为什么一个类的静态方法只能访问静态属性或静态方法?

回答:

1.静态方法是属于类的,而普通方法是属于对象的。

2.属于类的静态方法可以在对象不存在的时候就能访问到,而普通方法必须先new一个对象才能用这个对象访问。
3.当我们访问调用静态方法的时候(使用类名.静态方法名)这个时候就没有对象创建,所以普通方法是访问不到的。为了避免这种错误,所以java就不允许在静态方法中访问非静态方法。


版权声明:本文为zuo_er_lyf原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。