JAVASE总结--内部类
2016-08-26 21:43
162 查看
内部类
内部类是定义在另一个类中的类。
使用原因:
内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据。
内部类可以对同一个包中的其他类隐藏起来。
当要想定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。
内部类包括:
成员内部类、局部内部类、匿名内部类、静态内部类。
=====================================================================
1.成员内部类。
成员内部类是最普通的内部类,它的定义位于另一个类的内部。
成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)
当成员内部类拥有和外部类同名的成员变量或方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果访问外部类的同名成员,需要以下面的形式进行访问:
外部类.this.成员变量
外部类.this.成员方法
创建成员内部类对象
成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类对象,前提是必须存在一个外部类对象。
Outter outter=new Outter();
Outter.Inner inner=outter.new Inner();
Outter.Inner inner=new Outter().new Inner();
内部类可以有private protected public default。
private--------外部类的内部访问。
public----------任何地方都能访问。
protected ----- 同一个包/继承外部类
缺省---------- 同一个包
代码:
public class MyInner{
public static void main(String[]
args) {
Circle.Draw d=new Circle(2).new Draw();
d.drawSahpe();
}
}
class Circle {
public int a=0;
public int b=0;
private double radius =
0;
public static int count =1;
public Circle(double radius)
{
this.radius =
radius;
}
class Draw { //内部类
public int a=1;
public int b=1;
public void drawSahpe()
{
System.out.println("a "+a);
System.out.println("b "+Circle.this.b);
System.out.println(radius);
//外部类的private成员
System.out.println(count);
//外部类的静态成员
}
}
}
=====================================================================
2.局部内部类
局部内部类是定义在一个方法或者一个作用域里边的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public private protected 以及static修饰的。
代码:
class Man{
public Man(){
}
public void getWoman(){
class Woman { //局部内部类
int age =0;
}
}
}
====================================================================
3.匿名内部类
匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
在安卓监听中使用较多。
匿名内部类不能有访问修饰符和static修饰符。
匿名内部类是唯
一一种没有构造器的类。
==================================================================================
4.静态内部类
静态内部类在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,隶属于类,并且它不能使用外部类的非静态成员变量或者方法。
代码:
public class TestStaticInner {
public static void main(String[]
args) {
Out02.Inner02
inner02 = new Out02.Inner02();
inner02.sayHello();
}
}
class Out02 {
public String
name =
"岳不群";
public Out02() {
System.out.println("Out02.Out02(我是外部类的构造器)");
}
static class Inner02 {
public Inner02() {
System.out.println("Out02.Inner02.Inner02(我是内部类的构造器)");
}
public void sayHello() {
System.out.println("Out02.Inner02.sayHello()");
}
}
}
运行结果:
Out02.Inner02.Inner02(我是内部类的构造器)
Out02.Inner02.sayHello()
不会调用外部类的构造器。
而成员内部类在创建内部类对象时,会首先执行外部类的构造器。
内部类是定义在另一个类中的类。
使用原因:
内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据。
内部类可以对同一个包中的其他类隐藏起来。
当要想定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。
内部类包括:
成员内部类、局部内部类、匿名内部类、静态内部类。
=====================================================================
1.成员内部类。
成员内部类是最普通的内部类,它的定义位于另一个类的内部。
成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)
当成员内部类拥有和外部类同名的成员变量或方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果访问外部类的同名成员,需要以下面的形式进行访问:
外部类.this.成员变量
外部类.this.成员方法
创建成员内部类对象
成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类对象,前提是必须存在一个外部类对象。
Outter outter=new Outter();
Outter.Inner inner=outter.new Inner();
Outter.Inner inner=new Outter().new Inner();
内部类可以有private protected public default。
private--------外部类的内部访问。
public----------任何地方都能访问。
protected ----- 同一个包/继承外部类
缺省---------- 同一个包
代码:
public class MyInner{
public static void main(String[]
args) {
Circle.Draw d=new Circle(2).new Draw();
d.drawSahpe();
}
}
class Circle {
public int a=0;
public int b=0;
private double radius =
0;
public static int count =1;
public Circle(double radius)
{
this.radius =
radius;
}
class Draw { //内部类
public int a=1;
public int b=1;
public void drawSahpe()
{
System.out.println("a "+a);
System.out.println("b "+Circle.this.b);
System.out.println(radius);
//外部类的private成员
System.out.println(count);
//外部类的静态成员
}
}
}
=====================================================================
2.局部内部类
局部内部类是定义在一个方法或者一个作用域里边的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public private protected 以及static修饰的。
代码:
class Man{
public Man(){
}
public void getWoman(){
class Woman { //局部内部类
int age =0;
}
}
}
====================================================================
3.匿名内部类
匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
在安卓监听中使用较多。
匿名内部类不能有访问修饰符和static修饰符。
匿名内部类是唯
一一种没有构造器的类。
==================================================================================
4.静态内部类
静态内部类在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,隶属于类,并且它不能使用外部类的非静态成员变量或者方法。
代码:
public class TestStaticInner {
public static void main(String[]
args) {
Out02.Inner02
inner02 = new Out02.Inner02();
inner02.sayHello();
}
}
class Out02 {
public String
name =
"岳不群";
public Out02() {
System.out.println("Out02.Out02(我是外部类的构造器)");
}
static class Inner02 {
public Inner02() {
System.out.println("Out02.Inner02.Inner02(我是内部类的构造器)");
}
public void sayHello() {
System.out.println("Out02.Inner02.sayHello()");
}
}
}
运行结果:
Out02.Inner02.Inner02(我是内部类的构造器)
Out02.Inner02.sayHello()
不会调用外部类的构造器。
而成员内部类在创建内部类对象时,会首先执行外部类的构造器。