关于内部类
内部类
内部类:定义在一个类内部的类。
它可以在定义在一个类中的属性的区域,或方法中,或一个代码块中(if,for)
内部类可以有名称,可以没有名称(匿名内部类)
匿名内部类多用于抽象类或接口的实例化(抽象类和接口本身是不能创建对象的,不能实例的,但是可以通过匿名内部类间接实现)
内部类的优点:它可以具有类的功能,但是只限于当前类使用,不对外,否则就定义成一个外部的类。
内部类可以绕开Java的类的单继承,如果外部类继承了一个类,而此时还想继承另一个类,就让内部类来继承它。
两点:别人不用,自己用(所以是内部类);内部类可以定义成方法来使用,但方法有局限性,当一个方法完成不了时,需要定义成一个类,方法升级为内部类后,功能增强。可以组织代码,使的代码结构清晰。
分类 :
1.成员内部类
2.方法内部类
3.块内部类
4.匿名内部类
public class Outer {
int id = 1;
/**
* 成员内部类
*/
class Inner1{
public void say(){
System.out.println("Inner1.say");
}
}
public static void main(String[] args) {
Outer outer = new Outer();
// 访问类的成员
System.out.println(outer.id);
// 创建内部类的实例,需要外部类的实例
Outer.Inner1 inner1 = new Outer().new Inner1();
inner1.say();
}
}
/**
* 静态成员内部类
*/
static class Inner2{
public void say(){
System.out.println("Inner2.say");
}
}
main:
Outer.Inner2 inner2 = new Outer.Inner2();
inner2.say();
内部类可以访问外部类的数据(注意静态的使用,如果内部类是静态的,则情况复杂)
静态内部类只能访问外部类的静态数据
public class Outer {
int id = 1;
/**
* 成员内部类
*/
class Inner1{
public void say(){
System.out.println("Inner1.say");
System.out.println("Outer.id=" + id);
}
}
/**
* 静态成员内部类
*/
static class Inner2{
public void say(){
System.out.println("Inner2.say");
//System.out.println("Outer.id=" + id);
}
}
public void work(){
/**
* 方法内部类,只能在方法内部使用
*/
class Inner1{
public Inner1(){
System.out.println("method work Inner1 created");
}
void work(){
System.out.println("method Inner1.work");
}
}
Inner1 inner1 = new Inner1();
inner1.work();
}
public static void main(String[] args) {
Outer outer = new Outer();
// 访问类的成员
System.out.println(outer.id);
// 创建内部类的实例,需要外部类的实例
Outer.Inner1 inner1 = new Outer().new Inner1();
inner1.say();
Outer.Inner2 inner2 = new Outer.Inner2();
inner2.say();
outer.work();
}
}
public class Outer {
int id = 1;
/**
* 成员内部类
*/
class Inner1{
public void say(){
System.out.println("Inner1.say");
System.out.println("Outer.id=" + id);
}
}
/**
* 静态成员内部类
*/
static class Inner2{
public void say(){
System.out.println("Inner2.say");
//System.out.println("Outer.id=" + id);
}
}
public void work(){
/**
* 方法内部类,只能在方法内部使用
*/
class Inner1{
public Inner1(){
System.out.println("method work Inner1 created");
}
void work(){
System.out.println("method Inner1.work");
}
}
Inner1 inner1 = new Inner1();
inner1.work();
}
public void work2(){
if(id >0 ){
/**
* 块内部类
*/
class Inner1{
public Inner1(){
System.out.println("if block Inner1 created");
}
}
Inner1 inner1 = new Inner1();
}
}
/**
* 匿名内部类,一个没有名称的实现了IAnimal接口的类
*/
IAnimal animal = new IAnimal() {