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("匿名内部类");
            }
        };
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值