----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
内部类的概念:当一个类定义在另一个类的里面,这个类就是内部类。内部类分为:成员内部类(包括静态嵌套类)、方法内部类、匿名内部类。它们的共性有
(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。
如Outer$1。
(2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。
class Outer{
private int x;
class Inter{
void showX(){
System.out.println(x);
}
}
}
//这里内部类就能访问外面的x,即使x是private的
(3)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量。
class Outer{
private static int x;
static class Inter{
void showX(){
System.out.println(x);
}
}
}
//这里showX方法可以访问x,因为x被static修饰了。假如x
//注意内部类定义了静态成员,那么这个内部类就必须是static
下面分类介绍java内部类。
一、成员内部类:把内部类定义在成员位置上。这个时候,内部类可以被成员修饰符修饰。如static,private。当被static修饰的后,它只能访问外部类中的static成员。出现的访问局限。当被 private修饰后,外部其他类就不能直接访问这个类了。
被static修饰的示例:
public class InnerClass {
public static void main(String[] args){
new Outer.Inter().showX();
}
}
class Outer{
private static int x = 10;
static class Inter{
void showX(){
System.out.println(x);
}
}
}
//外部其他类访问的格式 new 外部类名.内部类名().方法
仅仅被private修饰的示例::
public class InnerClass {
public static void main(String[] args) {
new Outer().method();
}
}
class Outer{
private int x = 10;
void method(){
new Inter().showX();
}
private class Inter{
void showX(){
System.out.println(x);
}
}
}
注意:当内部类定义了静态成员。该内部类就一定要定义成static。
方法内部类的准则:
(1)、方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。
(2)、方法内部类对象不能使用该内部类所在方法的非final局部变量。
示例:
public class MethodInnerClass {
public static void main(String[] args) {
new Outer1().doSomething();
}
}
class Outer1{
int y = 20;
public void doSomething(){
final int x = 10; //要定义为final,不然访问不了.
class Inner{
public void show(){
System.out.println(x + y);
}
}
Inner inter = new Inner(); //只能在定义内部类的方法里实例化
inter.show();
}
}
三、匿名内部类:顾名思义,没有名字的内部类。
(1)、定义匿名内部类要满足的条件:a、只用到类的一个实例。
b、类在定义后马上用到。
c、类非常小。
d、给类命名并不会导致你的代码更容易被理解。
e、内部类必须继承一个类,或者必须实现接口。然后这个内部类就是这个类或者接口的子类。
(2)、匿名内部类的好处就是大大的简化了书写。
示例:
public class MissingName {
public static void main(String[] args)
{
new AbsDemo() { //继承了AbsDemo 注意,这里不能被修饰符修饰
@Override
void show() {
System.out.println(getClass().getName());
}
}.show(); //马上使用了
}
}
abstract class AbsDemo{
abstract void show();
}
为什么要使用内部类:
典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其的外围类的对象。所以你可以认为内部类提供了某种进入其外围类的窗口。(人和心脏的例子)
使用内部类最吸引人的原因是:
每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
详情请查看: