黑马程序员——Java基础---包、内部类、匿名内部类

来源:互联网 发布:网络运营商 编辑:程序博客网 时间:2024/05/29 12:51

——Java培训、Android培训、iOS培训、UI培训、PHP培训、期待与您交流! ——

一、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;    }}

二、四种权限修饰符

权限修饰符 本类 同一个包下(子类和无关类) 不同包下(子类) 不同包下(无关类) private Y 默认 Y Y protected Y Y Y public Y Y Y Y

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培训、Android培训、iOS培训、UI培训、PHP培训、期待与您交流! ——

0 0
原创粉丝点击