内部类详解
-
static关键字基本概念
我们可以用一句话来概括:方便在没有创建对象的情况下来进行调用。也就是说:被static关键字修饰的不需要创建对象去调用,直接根据类名就可以去访问。 -
什么是内部类
大部分时候,类被定义成一个独立的程序单元。在某些情况下,也会把一个类放到另一个类的内部定义,这个定义在其他类内部的类就被称为内部类(有些地方也叫做嵌套类),包含内部类的类也被称为外部类(有些地方也叫做宿主类)。
Java的内部类主要分为 成员内部类、局部内部类、匿名内部类、静态内部类 -
成员内部类与局部内部类
1.成员内部类与局部内部类的区分
package com.vg.demo03;
/**
* 内部类的位置:
* 1.成员位置——>成员变量
* 2.局部位置——>局部变量
* */
//外部类
public class Outer {
private int num;
//成员内部类 --- 成员变量
//内部类——>成员位置
public class Inner{
}
public void method() {
int num;
//局部内部类---局部变量
//内部类——>局部变量
class Inner{
}
}
}
//成员内部类变量名方法名和局部内部类可以一样
2.成员内部类与局部内部类的访问特点
内部类可以直接访问外部类的成员,包括私有。
外部类要访问内部的成员,必须创建对象
package com.vg.demo03;
/**
* 内部类的访问——内部类造对象
* 成员内部类造对象
* */
//外部类
class Outer {
private int num = 10;
public void method2() {
//外部类中访问内部类的成员
//必须创建内部类对象
System.out.println("====调用method2===");
System.out.println("method2...");
//成员内部类对象创建
Inner i = new Inner();
System.out.println(i.i);
//静态成员内部类对象创建
Inner3 i3 = new Inner3();
i3.method();
}
public static int num2;
//静态内部类
public static class Inner3{
public void method() {
System.out.println("===静态内部类===");
System.out.println("method");
//静态成员不能访问非静态的
//method2();
//System.out.println(num);
}
}
//成员内部类
public class Inner{
private int i = 1000;
public void method() {
System.out.println("===成员内部类===");
System.out.println(num);
method2();
}
}
public void method() {
//int num;
//局部内部类
class Inner2 {
public void method1() {
System.out.println("===局部内部类==");
System.out.println(num);
method2();
}
}
//局部内部类只能在局部范围使用
Inner2 i2 = new Inner2();
i2.method1();
}
}
public class OuterTest{
public static void main(String[] args) {
//创建外部类对象,都是在外部类外部
//成员内部类造对象
//Inner i = new Inner(); 普通类 错误写法
//格式:外部类名.内部类名 i = new 外部类().new 内部类();
Outer.Inner oi = new Outer().new Inner();
oi.method();//成员内部类对象的使用
//创建外部类对象
//调用方法
//执行局部内部类对象的方法
Outer o = new Outer();
o.method();
//局部内部类对象的使用
o.method2();
//静态内部类造对象
//类名.静态变量名
//格式: 外部类名.内部类名 i = new 外部类 new 内部类();
Outer.Inner3 oi3 = new Outer.Inner3();
oi3.method();
}
}
-
内部类的作用
1、更好的封装性
2、内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,但外部类不能访问内部类的实现细节,例如内部类的成员变量
3、匿名内部类适合用于创建那些仅需要一次使用的类 -
静态类(只有内部类才能被声明为静态类,即静态内部类(也可称为类内部类))---静态成员变量
1、只能在内部类中定义静态类
2、静态内部类与外层类绑定,即使没有创建外层类的对象,它一样存在。
3、静态类的方法可以是静态的方法也可以是非静态的方法,静态的方法可以在外层通过静态类调用,而非静态的方法必须要创建类的对象之后才能调用。
4、只能引用外部类的static成员变量(也就是类变量)。
5、如果一个内部类不是被定义成静态内部类,那么在定义成员变量或者方法的时候,是不能够被定义成静态的。 -
静态类与非静态类的区别
package com.vg.demo03;
//代码来分析静态内部类与非静态内部类的区别
public class OutClassTest {
int out1 = 1;
static int out2 = 1 ;
void out() {
System.out.println("非静态");
}
static void outstatic() {
System.out.println("静态");
}
public class InnerClass{
void InnerClass() {
System.out.println("innerClass!");
System.out.println(out1);
System.out.println(out2);
out();
outstatic();//静态内部类只能访问外部类的静态成员
}
//static void inner(){}
//static int i=1;
//非静态内部类不能有静态成员(方法、属性)
}
public static class InnerstaticClass{
void InnerstaticClass() {
System.out.println("InnerstaticClass");
//静态内部类只能访问外部类的静态成员
//out();
//System.out.println(out1);
outstatic();
System.out.println(out2);
}
//静态内部类能有能有静态成员(方法、属性)
static void innerstatic() {}
static int i = 1;
}
public static void main(String[] args) {
OutClassTest a = new OutClassTest();
OutClassTest.InnerstaticClass b = new OutClassTest.InnerstaticClass();//创建静态内部类
OutClassTest.InnerClass c = a.new InnerClass();
System.out.println(a.out1);
System.out.println("====");
System.out.println(a.out2);
System.out.println("====");
a.out();
System.out.println("====");
a.outstatic();
System.out.println("====");
c.InnerClass();
System.out.println("====");
b.InnerstaticClass();
}
}
1.是否能拥有静态成员
静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。
2.访问外部类成员
静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性),外部类的静态成员不可以直接使用非静态内部类。
3.静态内部类和非静态内部类在创建时有区别
//假设类A有静态内部类B和非静态内部类C,创建B和C的区别为:
A a=new A();
A.B b=new A.B(); //静态内部类
A.C c=a.new C();