一.成员内部类
比如,一个人,他有头发 四肢,而都需要心脏给她供血。心脏就可以做这个成员内部类,他可以使用类中的所有属性。
package书籍练习;
class Outer{
Stringname;
int x=2;
private class Inner{
Stringname="内部类";
int x=5;
public void print(){
System.out.println(name);
}
}
public void method(){
Innerinner=new Inner();
inner.print();
}
}
public classa1 {
public static void main(String[] args){
Outerouter=new Outer();
outer.method();
}
}
在成员变量和内部类的变量同名时,默认的是访问内部类中的变量
而上面还有另外两种调用成员内部类方法
1.直接在主函数中调用内部类
Outer.Inner.inner=newOuter().new Inner();
2.也是在主函数中直接调用,但是她只能调用静态类,而也只能调用类里面静态的属性。
Outer.Inner inner=newOuter.Inner()
二注意:
1.如果想访问同名的外部类成员,可用System.out.println(Outter.this.name);
2.如果是私有的成员内部类,只能在公共的方法中提供给其他类访问,不能在其他类中建立对象
二.局部内部类
在一个类中的方法中,再定义一个类
调用方法:
1.直接在该内部类的下面,也就是方法的里面建立一个内部类对象,
package书籍练习;
class Outer{
Stringname;
int x=2;
public void method(){
class Inner{
Stringname="内部类";
int x=5;
public void print(){
System.out.println(Outer.this.name);
}
}
Innerinner=new Inner();
inner.print();
}
}
public classa1 {
public static void main(String[] args){
Outerouter=new Outer();
outer.method();
}
}
2.其他的跟成员内部类类似,但是如果想要访问局部内部类的成员,它一定为final型。
三。匿名局部类
直接创建对象不需要引用对象名,但它的前提是必须有继承或者实现的关系,才能使用匿名内部类
什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
·只用到类的一个实例。
·类在定义后马上用到。
·类非常小(SUN推荐是在4行代码以下)
·给类命名并不会导致你的代码更容易被理解。
在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、方法和类。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
有两种表现形式:
package书籍练习;
abstract classAnimal1{
abstract void eat();
abstract void sleep();
}
class Outter{
public void print(){
class Fish extends Animal1{
@Override
void eat() {
System.out.println("想吃啥");
}
@Override
void sleep() {
System.out.println("睡觉");
}
}
Fishfish=new Fish();
fish.eat();
fish.sleep();
}
}
public classa1{
public static void main(String[] args){
Outteroutter=new Outter();
outter.print();
}
}
这种方式,可以建立多个对象,调用多个多个方法。
2. package 书籍练习;
class Outter{
public void print(){
new Animal1(){
@Override
void eat() {
System.out.println("想吃啥");
}
@Override
void sleep() {
System.out.println("睡觉");
}
}.eat();;
}
}
public classa1 {
public static void main(String[] args){
Outteroutter=new Outter();
outter.print();
}
}
该方法只能调用一次,建立一个对象,调用一个方法
四。应用例子
1). 应用程序框架(applicationframeword)就是被设计用来解决某类特定问题的一个类或一组类。
2).要运行某个应用程序框架,通常是继承一个或多个类,并覆盖某个方法。
3).控制框架是一类特殊的应用程序框架,它用来解决响应事件的需求。
4).主要用来响应事件的系统被称作事件驱动系统。