1 成员内部类
A:定义格式
class 外部类 {
修饰符 class 内部类 {
//其他代码
}
}
B:访问方式
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
在内部类当中,可以直接访问外部类的成员,包括私有成员
匿名内部类:
// 匿名内部类是创建某个类型子类对象的快捷方式
格式
new 类/接口( ){
如果是创建了继承这个类的子类对象,我们可以重写父类的方法
如果是创建了实现这个接口的子类对象,我们必须要实现该接口的所有方法
}
interface Inner4{
public void function();
}
class Outer4{
public void method(){
// 这里得到的是 子类实现类的对象.为了多次利用 通过多态向上转型,即Inner4 i来接收
Inner4 i=new Inner4(){
@Override
public void function() {
System.out.println("nihao");
}
}; //.function();
i.function();
i.function();
匿名内部类的应用场景
method(
new Animal(){
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
);
}
public static void method(Animal a){
a. eat();}
通过Animal对象来调用eat方法但是,animal是接口不能创建对象,这里就需要用多态 通过Animal子类或者实现类的对象向上转型得到,
//匿名内部类:
// 匿名内部类是创建某个类型子类对象的快捷方式
public class Lianxi4 {
public static void main(String[] args) {
Outer4 o=new Outer4();
o.method();
}
}
interface Inner4{
public void function();
}
//创建一个类
class Outer4{
public void method(){
// 这里得到的是 子类实现类的对象.为了多次利用 通过多态向上转型,即Inner4 i来接收
Inner4 i=new Inner4(){
@Override
public void function() {
System.out.println("nihao");
}
}; //.function();
i.function();
i.function();
}
}
//成员内部类
public class Lianxi2 {
public static void main(String[] args) {
//成员内部类被static 修饰时就不用再创建外部类的对象 new Outer2()
/*Outer2.Inner2 i=new Outer2.Inner2();
i.function(); 构造对象 */
Outer2.Inner2.function(); //内部类的完整类名,来直接调方法
}
}
class Outer2{
public void method(){
//外部类可以调用内部类生成对象
Inner2 i=new Inner2();
}
static class Inner2{
public static void function(){
System.out.println("静态内部类方法");
}
}
}
//局部内部类 再方法中,除了方法就无法调用
public class Lianxi3 {
public static void main(String[] args) {
Outer3 o=new Outer3();
o.method();
}
}
class Outer3{
public void method(){
int nun=10;
class Inner{
public void function(){
System.out.println("局部内部类方法");
}
}
}
public void outer4Test(){
//Inner i=new Inner(); 错误