简单整理一下内部类

装箱 和 拆箱

装箱:

int i = 22;

Integer inte = new Integer(i);  //将i包装成Integer类型的对象

inte=Integer.valueof(i);  //获得一个i值的Integer对象

inte=i; 这里隐式调用了Integer.valueof()方法

拆箱:  对象的值取出来赋值给基本类型  对象-->基本类型

i = inte.intvalue();

i=inte;  //这里也是隐式的调用了inte.intvalue()的方法

byte-->Byte

char-->Charactor

short-->Short

int-->Integer

double-->Double

float-->Float

booelan-->Boolean

这些包装类型跟String类型 类似 他们在常量池中有一些缓存

Double Float除外

整数缓存的范围是 (-128---127)

布尔类型 true false

char的值的0--127

(话不多说上例子)

输出结果为true

将两个Integer的对象的值更改成为128  输出结果为false;

超出范围就会在堆中新建一个对象  (这个地方是需要注意的)

字符串类型转换成int类型的方法:

结果打印出来都是123456

将int类型转换成字符串类型:

最简单的一种方法是直接让i与一个空字符串连接

另外两种是分别调用Integer的toSring()的方法  和   调用 String的valueof()的方法

(想得到哪个类型的对象 就调用其valueof()方法)

简单分析内部类:

类的内部可以定义属性 方法 也可以定义类

class Outer{  //外部类

  class Inner{   //内部类

}

}

内部类可以被四种修饰符修饰 也可以被static关键修饰

1:实例成员内部类

如上图所看看到的 实例成员内部类有两种创建实例对象的方式

内部类可以无限制的访问外部类的成员

即使是私有的外部成员也是可以访问的:

因为在内部类种隐含了有一个外部内对象

(Outer.this.i )

但是外部类要想访问内部类的成员就要创建内部类的对象来访问

上面分析了实例成员内部类

总结一下:内部类可以无限制的访问外部类成员(尽管是private) 

  而外部类要想访问内部类的成员就必须要创建内部类对象来访问

很重要的一句话:内部类归外部类对象所有

很重要!很重要!很重要!(说三遍)

2.静态内部类:

也就是说用static关键字来修饰内部类

class Outer{  //外部类

   static class Inner{   //内部类

}

}

被static修饰的内部类在创建对象的时候 不依附于外部类对象

Outer.Inner inner = new Outer.Inner();

也不需要先创建外部类对象再来创建内部类对象

不能直接访问外部类非静态成员(但是可以通过创建外部类对象访问)

总结一下静态内部类:

不需要依附外部类的对象 

不能访问直接外部非静态成员变量(需要创建对象)

3:局部内部类:

局部内部类可以访问局部变量

但是局部变量的值不能改变

4:匿名内部类:

匿名内部类 要继承一个类 (可以是抽象类) 或者 实现一个接口

先来看一下继承一个类的匿名内部类

打印结果是:父类的匿名方法

                  父类的方法

new TestOuter().outer.show():

这个show()方法是重写了父类的show();方法所以打印出来的是 父类的匿名方法

new Outer().show();

这一个是新建了一个父类的匿名对象 并没有重写父类的show()方法 ,所有调用的是父类的show()方法

还有另外一种方式来编写匿名内部类:

打印输出的结果跟上面的一样原因也是相同的,只不过是内部类的两种不同的表现形式

下面是匿名内部类实现一个接口

实现一个接口跟继承一个类是同理的

下面的例子是子类继承一个静态内部类和非静态内部类的例子

class Wai {
	Wai() {
		System.out.println("外部类的构造方法");
	}

	class Nei1 {
		public Nei1() {
			System.out.println("内部类的构造方法");
		}
	}

	static class Nei2 {
		public Nei2() {
			System.out.println("静态内部类的构造方法");
		}
	}
}

class A extends Nei2 {
	public A() {
		super();// 隐式的调用super();
		System.out.println("父类是静态内部类的子类的构造方法");
	}
}

class B extends Nei1 {
	public B(Wai l) {
		l.super();
		System.out.println("父类是内部类的子类的构造方法");
	}
}

public class TestLibary {
	public static void main(String[] args) {
		new A();
		new B(new Wai());
	}
}

打印结果分别是

静态内部类的构造方法
父类是静态内部类的子类的构造方法

外部类的构造方法
内部类的构造方法
父类是内部类的子类的构造方法

子类继承静态内部类:子类在创建对象的时候需要先调用父类的构造函数 因为是静态的内部类  不需要外部类对象来操作

所以就打印出来两个结果(子类的构造方法里隐式的调用了父类的构造函数)

子类继承非静态的内部类 类在创建对象的时候需要先调用父类的构造函数 因为式非静态的内部类 需要外部类对象来操作

所以要先调用外部类的构造函数获得外部类对象 再来调用内部类的构造函数 打印出来三行语句

断断续续敲了一天 整理一下内部类的知识点

尽管不是很全面 也可能还有错误  (逼话少说) 继续努力努力再努力!!

猜你喜欢

转载自blog.csdn.net/Bigdata_do/article/details/81561356