内部类和包装类
一、内部类
在一个类中定义一个类,内部类被分为成员内部类、局部内部类、匿名内部类。
举例:在一个A的内部定义一个类B,B是A的内部类。
内部类格式:
public class 类名{
修饰符 class 类名{
}
}
内部类的访问特点
①内部类可以直接访问外部类的成员,包括私有。
②外部类要访问内部类的成员,必须要创建对象。
2、成员内部类
成员内部类,外界如何创建使用呢?
格式:
外部类名.内部类名 对象名=外部类对象.内部类对象;
例:
Outer.Inner oi=new Outer.new Inner;
成员内部类推荐使用方案:
将一个类,设计为内部类的目的,大多数都是不想让外界去访问,所以内部类的定义应该私有化,私有化之后,再提供一个可以让外界调用的方法,方法内部创建内部类对象并调用。
成员内部类的定义位置:在类中方法,跟成员变量是一个位置。
public class InnerDemo {
public static void main(String[] args) {
//创建操作类对象,并调用方法
/*Outer.Inner oi=new Outer().new Inner();
oi.show();*/
Outer o=new Outer();
o.method();
}
}
public class Outer {
private int num=10;
/* public class Inner {
public void show() {
System.out.println(num);
}
}*/
private class Inner{
public void show(){
System.out.println(num);
}
}
public void method(){
Inner i=new Inner();
i.show();
}
}
2、局部内部类
局部内部类,是在方法中调用的类,外界无法直接使用,需要在方法内部创建对象并使用。
该类可以访问外部类的成员,也可以访问方法内的局部变量。
局部内部类的定义位置:局部内部类是在方法中定义的类。
public class Outer {
private int num=10;
public void method(){
class Inner{
public void show(){
System.out.println(num );
}
}
Inner i=new Inner();
i.show();
}
}
3、匿名内部类
匿名内部类是局部内部类的特殊形式。
前提条件:
存在一个类或者接口
这个类可以是具体类也可以是抽象类
格式:
格式:
new 类名(){
重写方法
}
new 接口(){
重写方法
}
例:
: new Inter(){
@Override
public void method(){}
}
本质:
是继承了该类或者该接口的子类匿名对象
public class Outer {
public void method(){
//仅仅只是个对象
/* new Inter(){
@Override
public void show() {
System.out.println("匿名内部类");
}
};
*/
//对象调方法
/* new Inter(){
@Override
public void show() {
System.out.println("匿名内部类");
}
}.show();
new Inter(){
@Override
public void show() {
System.out.println("匿名内部类");
}
}.show();
*/
//多次调用,Inter的实现类对象,可以按照多态形式赋值给Inter接口
Inter i= new Inter(){
@Override
public void show() {
System.out.println("匿名内部类");
}
};
i.show();
i.show();
}
}
细节:
匿名内部类可以通过多态的形式接受多次调用,Inter的实现类对象,可以按照多态形式赋值给Inter接口,匿名内部类也可以直接调用方法
Inter i = new Inter(){
@Override
public void method(){}
}
在开发中的使用:
当发现某个方法需要,接口或抽象类的子类对象,我们就可以传递一个匿名内部类过去,来简化传统的代码。
二、包装类
1.包装类被分为8种。
作用:将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据。
常用的操作之一:
基本数据类型和字符串之间的转换
2.integer类
包装一个对象的原始类型int的值
构造方法:
public Integer(int value);根据int创建Integer对象。已过时,但还是可以用,不建议使用
public Integer(String s);根据String创建Integer对象。已过时,字符串是由数字组成的。
静态方法获取对象
public static Integer valueOf(int i);返回表示指定int值的Integer实例.
public static Integer valueOf(String s);返回一个保存指定值Integer对象String
3.int和string类型的相互转换
int转换成String
方式1:字符串参与加法运算,做字符串连接,加一个空字符串
String s1=" "+number;
System.out.println(s1);
方式2:通过String的静态方法修饰valueOf()
public static String valueOf(int i) //返回参数的字符串表示形式,String类中的方法
String s2=String.valueOf(100);
System.out.println(s2);
String转换成int
方式1:先把String转换成Integer类型,再转换成int类型。
String s="100";
String ---integer---int
Integer i=Integer.valueOf(s);
public int intValue() 不是静态的
int x=i.intValue();
System.out.println(x);
方式2:通过Integer静态方法parselnt()
public static int parseInt(String s) //将字符串解析为int类型,Integer类中的方法
int y=Integer.parseInt(s);
System.out.println(y);
4.自动装箱和拆箱
拆箱:将包装类转为基本数据类型
装箱:将基本数据类型转为包装类
public class IntegerDemo {
public static void main(String[] args) {
// 装箱:把基本数据类型转换成对应的包装类类型,调方法
Integer i = Integer.valueOf(100);
//自动装箱
Integer ii=100;// Integer.valueOf(100); JDK5过后简化了
// 拆箱:把包装类类型转换成对应的基本数据类型
//ii+=200;
// ii是引用类型,先把ii转为int类型(基本类型),再和200做加法,加完后再赋值给ii.
//ii = ii.intValue() + 200;
ii+=200;//内部隐含了自动装箱和自动拆箱
System.out.println(ii);
//在开发中如果是个引用类型的变量,使用之前,先做不为null的判断,只要是对象,就必须进行null的判断
Integer iii=null;
if(iii!=null) {
iii += 300;
}
}
}