成员
成员内部类
静态内部类
局部
方法内部类
匿名内部类
依赖外部类对象的:成员内部类,方法内部类,匿名内部类
静态内部类不依赖外部类的对象,所以,我们在项目中优先考虑选择静态内部类
package QianFeng02;
//内部类
public class InnerTest {
public static void main(String[] args){
//在外部创建成员内部类实例,
Outer outer=new Outer();
// 因为成员内部类需要依赖外部类的对象,不建议这样创建
// Outer.Inner2 inner2=outer.new Inner2();
// inner2.print();
outer.innerPrint();//通过innerPrint访问内部类
outer.show();//方法内部类
Outer.Inner3 inner3=new Outer.Inner3(); //静态类直接:类名.内部静态类名
inner3.print();
outer.print11();//(1.继承式)
outer.print2();//(2.匿名类的 接口式)
outer.print3(new Eat(){//(匿名内部类 3.参数式)
public void eat() {
System.out.println("匿名内部类 3.参数式");
}
});//(3.参数式匿名类)
}
}
class Outer{
private String name="除了静态内部类,内部类成可以很方便使用成员变量";
//----------------1.成员内部类----------------
public void innerPrint(){//建议在外部类中定义一个方法,对外提供访问内部类接口
Inner2 inner2=new Inner2();
inner2.print();
}
//内部类(封装性)
class Inner2{//1.成员内部类
private void print(){
System.out.println("{成员内部类}"+name);
}
}
// ----------------2.方法内部类---- ----------
public void show(){
final int x=10; //方法内部类的引用的变量 必须是常量(final),不写声明默认final
class Inner2{
public void print(){
System.out.println("{方法内部类}"+x+name);//为什么用final呢?
}
}
Inner2 inner2=new Inner2();//调用方法内部类(在方法里面调用实例化)不能在方法外实例化
inner2.print();
}
//----------------3.静态内部类----------------
/*
在一个类内部定义一个静态内部类:
静态的含义是该内部类可以像其它静态成员一样,没有外部类对象时,可以直接访问
静态嵌套仅能访问外部类的静态成员和方法
*/
static class Inner3{
public void print(){
System.out.println("静态内部类");
}
}
//----------------4.匿名内部类----------------
/*1.不能有构造方法
2.不能定义任何静态成员,方法
3.不能是public.protected,private,static
4.一定是在new的后面,用其隐含一个接口或者实现一个类
5.匿名内部类为局部的,所以局部内部类的所有限制都对其生效
* */
//(1.继承式)
public void print11(){
CatGame cat=new CatGame(){
public void game(){
System.out.println("猫玩");
}
};
cat.game();
}
//*(2.接口式)
public void print2(){
Eat e=new Eat(){
@Override
public void eat() {
System.out.println("匿名类的 接口式");
}
};
e.eat();
}
//(3.参数式)
public void print3(Eat eat){//传入接口
eat.eat();
}
}
interface Eat{
public void eat();
}
abstract class CatGame{
public abstract void game();
}
/*
方法内部类的引用的变量 必须是常量(final)
为什么用final呢?
final 修饰变量是 常量,会把变量进入到常量池,延长生命周期,以免被销毁
jdk1.8 可以不写final ,系统会默认 final.
*/