Java基础10---包内部类匿名内部类

Posted 冬有雪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础10---包内部类匿名内部类相关的知识,希望对你有一定的参考价值。

一、package关键字

      包的作用是将字节码(.class)进行分类存放 ,包其实就是文件夹。

1.注意事项

  • package语句必须是程序的第一条可执行的代码
  • package语句在一个java文件中只能有一个
  • 如果没有package,默认表示无包名

2.带包类的编译运行

javac编译的时候带上-d即可

javac -d . HelloWorld.java

通过java命令执行。

java 包名.HellWord

package cn.ds93;
import xyz.junshuai.*;
public class Programer 
    public static void main(String[] args) 
        Translator t = new Translator("HouHou","nv");
        System.out.println(t.getName() + " is " + t.getSex());
    
package xyz.junshuai;
public class Translator 
    private String name;
    private String sex;

    public Translator() 
    public Translator(String name,String sex) 
        this.name = name;
        this.sex = sex;
    

    public void setName(String name) 
        this.name = name;
    

    public String getName() 
        return name;
    

    public void setSex(String sex) 
        this.sex = sex;
    

    public String getSex() 
        return sex;
    

二、四种权限修饰符

权限修饰符本类同一个包下(子类和无关类)不同包下(子类)不同包下(无关类)
privateY
默认YY
protectedYYY
publicYYYY

1.类及其组成所使用的常见修饰符

  • 权限修饰符:private,默认的,protected,public
  • 状态修饰符:static,final
  • 抽象修饰符:abstract

2.关于类的修饰符

  • 权限修饰符:默认修饰符,public
  • 状态修饰符:final
  • 抽象修饰符:abstract
  • 用的最多的就是:public

3.关于成员变量的修饰符

  • 权限修饰符:private,默认的,protected,public
  • 状态修饰符:static,final
  • 用的最多的就是:private

4.关于构造方法的修饰符

  • 权限修饰符:private,默认的,protected,public

  • 用的最多的就是:public

5.关于成员方法的修饰符

  • 权限修饰符:private,默认的,protected,public
  • 状态修饰符:static,final
  • 抽象修饰符:abstract

  • 用的最多的就是:public

6.除此以外的组合规则

  • 成员变量:public static final
  • 成员方法:
    • public static
    • public abstract
    • public final

三、内部类

1.内部类访问特点

  • 内部类可以直接访问外部类的成员,包括私有。
  • 外部类要访问内部类的成员,必须创建对象。
  • 外部类名.内部类名 对象名 = 外部类对象.内部类对象;

2.静态成员内部类

  • 用static修饰
  • 成员内部类被静态修饰后的访问方式是:
    • 外部类名.内部类名 对象名 = 外部类名.内部类对象;

来个面试题:

class InnerClass 
    public static void main(String[] args) 
        Outer.Inner oi = new Outer().new Inner();
        oi.print();
    


class Outer 
    public int dong = 100;
    class Inner 
        public int shuai = 200;

        public void print() 
            int hou = 300;
            System.out.print(hou + "\\n");
            System.out.print(this.shuai + "\\n");
            System.out.print(Outer.this.dong + "\\n");
        
    

3.局部内部类访问局部变量的问题

  • 局部内部类访问局部变量必须用final修饰
  • 局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么?
          因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用。但是jdk1.8取消了这个事情,老师认为这是个bug。

四、匿名内部类

1.匿名内部类就是内部类的简化写法。

2.前提:存在一个类或者接口

  • 这里的类可以是具体类也可以是抽象类。

3.格式

new 类名或者接口名()
            重写方法;
        

4.本质

      是一个继承了该类或者实现了该接口的子类匿名对象。

举个例子(面试题,补齐Outer类中的代码):

interface HouHou 
    public void english();


class Outer 
    class Inner implements HouHou 
        public void english() 
//          System.out.println();
        
    

    public void print() 
        new Inner() 
            public void english() 
                System.out.println("Shanghai Haishi University");
            
        .english();
    


public class AnonymousInnerClass 
    public static void main(String[] args) 
        new Outer().print();
    

5.匿名内部类,只在重写一个方法时用

interface Inter 
    public void dong();
    public void shuai();


class Outer 
    public void hou() 
        new Inter()    //匿名内部类,只在重写一个方法时用
            public void dong()
                System.out.println("lijun");
            
            public void shuai()
                System.out.println("lijun2");
            
        .dong();

        new Inter() 
            public void dong()
                System.out.println("lijun");
            
            public void shuai()
                System.out.println("lijun2");
            
        .shuai();
    


public class AnonymousInner 
    public static void main(String[] args) 
        new Outer().hou();
    

6.匿名内部类在开发中的应用

//匿名内部类在开发中的应用
//本例为有名类,作为对比
public class AnonymousInner2 
    public static void main(String[] args) 
        Caomin c = new Caomin();
        c.bitter(new Employee());
    


abstract interface Employer 
    public abstract void exploit();


class Employee implements Employer 
    public void exploit() 
        System.out.println("哪里有压迫,哪里就有反抗。");
    

class Caomin 
    public void bitter(Employee e) 
        e.exploit();
    
//匿名内部类在开发中的应用
//本例为匿名内部类
public class  AnonyInnerDevelop 
    public static void main(String[] args) 
        Caomin c = new Caomin();
        c.bitter(new Employee()    //匿名内部类,编译看左边,运行看右边
            public void exploit() 
                System.out.println("哪里有压迫,哪里就有反抗。");
            
        );
    


abstract interface Employer 
    public abstract void exploit();


class Employee implements Employer 
    public void exploit() 
        //System.out.println("哪里有压迫,哪里就有反抗。");
    


class Caomin 
    public void bitter(Employee e) 
        e.exploit();
    

再来一个面试题

//匿名内部类的面试题
public class AnonyInnerInterview 
    public static void main(String[] args) 
        Outer.dong().shuai();   //链式编程,每次调用方法后还能调用方法,第一次调用方法返回的是对象
    


interface Inter 
    void shuai();


class Outer 
    public static Inter dong() 
        return new Inter()     //返回实现的接口(子类对象)
            public void shuai() 
                System.out.print("匿名内部类");
            
        ;
    

以上是关于Java基础10---包内部类匿名内部类的主要内容,如果未能解决你的问题,请参考以下文章

java基础第七天_匿名内部类异常包和jar

java基础之匿名内部类

java基础学习——29匿名内部类

JAVA类基础知识

java基础知识 17-2 匿名内部类

java基础04 匿名内部类