面向对象之内部类

类里面定义的类称之为内部类。定义方式与普通类的定义方式一样,只是普通类只能被访问修饰符public,default修饰,但是内部可以被所有的访问修饰符修饰。

内部类分类:

成员内部类:

静态内部类:

方法内部类:

匿名内部类:

4.1 成员内部类

在内中定义一个普通类,这个普通类只能被访问修饰符修饰。

public class Monkey {//外部类
​
    //当前类中可以定义成员变量,成员方法,代码区,静态代码块
    // 还可以定义类
​
    public class A{// 这个类称为成员内部类
        //当前类中可以定义成员变量,成员方法,代码区,静态代码块
    }
}

调用:

1、在当前外部类中的方法调用内部类中的属性和行为,直接在指定的方法中创建内部类的对象即可。

public class Monkey {//外部类
​
    //当前类中可以定义成员变量,成员方法,代码区,静态代码块
    // 还可以定义类
    public void show(){
        A a=new A();
        a.run();
    }
    public class A{// 这个类称为成员内部类
        //当前类中可以定义成员变量,成员方法,代码区,静态代码块
        public void run(){
            System.out.println("a A class of run");
        }
    }
}
2、在外部类以外的其它类中使用该内部类,此时要注意当前成员内部类的访问修饰符。

需要使用外部类对象调用内部类对象的方式创建内部类对象。

Monkey.A a=new Monkey().new A();

注意:一般情况下创建内部类时仅供当前类所使用的,其它类使用的评率不高。

4.2 静态内部类

成员内部类被static修饰,该内部类就是一个静态内部类。

public class Monkey2 {//外部类
     
    // 静态内部类
   public static class A{
       
   }
}

调用

  1. 在当前外部类中创建对象

    public class Monkey2 {//外部类
        public void show(){
            B b=new B();//创建静态内部类对象的方式
            b.run();
        }
    ​
        // 静态内部类
       public static class B{
            public void run(){
                System.out.println("Hello World");
            }
       }
    }
    ​

  1. 在其他类中创建对象

public static void main(String[] args) {
    Monkey2.B b=new Monkey2.B();
    b.run();
}

4.3 方法内部类

在方法中也可以定义类。当前类作用域只能是在当前的方法中。

public void method(){
​
  class Z{
     public void run(){
         System.out.println("Hello Z");
     }
 }
​
 Z z=new Z();//只能在当前方法中使用。
  z.run();
}

4.4 匿名内部类

匿名内部类就是一个没有名字的内部类。这种内部类没有对象。但是可以认为是一个值,赋值给某个变量,直接使用这个变量。

匿名内部类也有分类:

类类型的匿名内部类

接口式匿名内部类。

参数式匿名内部类。

使用抽象类创建的匿名内部类称为类类型的匿名内部类,使用接口创建的匿名内部类称为接口式匿名内部类。

在面向对象中,抽象类和接口都不能创建对象,原因是抽象类和接口中可能存在抽象方法,想要创建对象必须先实现这些抽象方法。如果直接new抽象类或者接口,要求你完成其中的抽象方法,由于方法存放在类中的,因此new出来的是一个类,称这个类为匿名内部类。

类类型的匿名内部类:

public abstract class AbstractPerson {
public abstract void eat();
}
​
public static void main(String[] args) {
new AbstractPerson() {//匿名内部类
  @Override
  public void eat() {
​
  }
};
​
}

接口式匿名内部类

public interface PersonInterface {
void run();
void eat();
}
​
public static void main(String[] args) {
  new PersonInterface() {// 接口式匿名内部类
      @Override
      public void run() {
      }
      @Override
      public void eat() {
      }
  };
}

参数式匿名内部类:

​
public class Student {
​
public void show(){
  System.out.println("Hello ");
}
}
​
​
public static void main(String[] args) {
JFrame jFrame=new JFrame();
jFrame.addKeyListener(new KeyListener() {// 当前的匿名内部类当做参数直接传递给了某个方法,称这个内部类叫做参数式匿名内部类
  @Override
  public void keyTyped(KeyEvent e) {
​
  }
​
  @Override
  public void keyPressed(KeyEvent e) {
​
  }
​
  @Override
  public void keyReleased(KeyEvent e) {
​
  }
});
​
​
Student s=new Student(){
  @Override
  public void show() {//短暂的重写,只能对s变量起作用。
      System.out.println("hehe");
  }
};
s.show();
Student s2=new Student();
s2.show();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值