内部类
对于类和对象的概念已经在脑海里逐渐形成。今天又接触到一个新鲜的词——内部类!初学者很容易对此概念印象模糊,搞不懂这究竟是什么,它的存在意义又是什么,如何应用呢?带着这些问题慢慢解析给大家。还是那句话,互相学习互相进步!————部分内容来源网络收集。
1.什么是内部类?
说的不如看的,直接看代码来区别内部类。
普通类
class Person
{
String name ;
}
内部类
class Person
{
String name ;
class Heart
{
System.out.println("this heart belong with " + name) ;
}
}
通过以上代码可以很直观的认识到,人是一个类,但人身体里还有心脏,当需要心脏类的时候可以直接在‘人’类的内部建立一个‘心脏’类,这样我们就得到了一个内部类。内部类是写在一个类(外部类)的里面,内部类可以直接调用外部类的属性,这就是内部类的最大优点!我们可以在没有得到外部类的实例的情况下,通过内部类去使用外部类的属性。
无论外部类继承实现了什么,都不影响内部类的继承,这就实现了多重继承,这是内部类的另一个好处。
2.详细的去认识内部类。
内部类主要有以下几类:成员内部类、局部内部类、静态内部类、匿名内部类。他们都有什么特点呢?且听我一一道来!
<1>成员内部类
属于外部类的一个成员,与变量和方法同一级别。即上面第一个例子所展示的形式。比较简单。
<2>局部内部类
把内部类放到方法里面,就成了局部内部类。
class Person
{
String name ;
public void sport()
{
class Heart
{
long power ;
}
}
}
<3>静态内部类
在成员内部类的基础上,在class前加上static修饰,使内部类静态化。静态化后只能访问外部类的静态变量,有局限性。但是因为静态化了,在new对象时可以直接Person.Heart,通过static找到,而不需要先有Person对象。
class Person
{
static String name ;
static class Heart
{
public void toString()
{
System.out.println(name) ;
}
}
}
public class Demo
{
public static void main(String args[])
{
Person.Heart h = new Person.Heart() ;
h.toString() ;
}
}
<4>匿名内部类
匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:
必须继承一个父类或实现一个接口
在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、方法和类。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
abstract class Person {
public abstract void eat();
}
public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
对于内部类的研究暂时就到这里
更深入的研究还请大家自行实施吧,我已经把我所能理解的东西都写了出来,如果有大神路过看到还请多多包涵,小弟实在能力有限。
互相学习互相进步!!
---------------------- ASP.Net+Unity开发、 .Net培训、期待与您交流! ----------------------