java学习笔记(五)--(对象编程-类与方法下)(内部类&成员方法与静态方法)***重要***

内部类

  • 定义:在一个类中进行其他机构的嵌套

内部类的简单定义:

class Outer{
    private String msg="Hello world!";
    //定义一个内部类
    class Inner{
        //定义一个普通方法
        public void print(){
            //调用msg属性
            System.out.println(msg);
        }
    }
    //在外部类中定义一个方法,该方法负责产生内部类对象并且调用print()方法
    public void fun(){
        //内部类对象
        Inner in=new Inner();
        // 内部类提供的print()方法
        in.print();
    }
}
public class Test{
    public static void main(String[] args) {
        //外部类对象
        Outer out=new Outer();
        //外部类方法
        out.fun();
    }
}
// 打印结果如下
//Hello word!

将内部类拆分到外部

class Outer{
    private String msg = "Hello World!" ;
    //通过此方法才能取得msg属性
    public String getMsg(){
        return this.msg ;
    }
    //3.现在由out对象调用了fun()方法
    public void fun(){
        //4.this表示当前对象
        Inner in = new Inner(this);
        //7.调用方法
        in.print();
    }
}
class Inner{
    private Outer out;
    //5.Inner.out = mian.out
    public Inner(Outer out){
        //6.引用传递
        this.out = out ;
    }
    //8.执行此方法
    public void print(){
        System.out.println(out.getMsg());
    }
}
public class Test{
    public static void main(String[] args) {
        //1. 实例化Outter类对象
        Outer out = new Outer();
        //2.调用Outter类方法
        out.fun();
    }
}

内部类的优点:

  • 内部类与外部类可以互相访问彼此的私有域(最大优点)

  • 内部类可以实现Java的单继承局限

使用内部类实现多继承

class A{
    private String name="A的私有类";
    public String getName(){
        return name;
    }
}
class B{
    private int age=20;
    public int getAge(){
        return age;
    }
}
class Outter{
    private class InnerClassA extends A{
        public String name(){
            return super.getName();
        }
    }
    private class InnerClassB extends B{
        public int age(){
            return super.getAge();
        }
    }
    public String name(){
        return new InnerClassA().name();
    }
    public int age(){
        return new InnerClassB().age();
    }
}
public class Test{
    public static void main(String[] args) {
        Outter outter=new Outter();
        System.out.println(outter.name());
        System.out.println(outter.age());
    }
}
  • 内部类可以对同一包中其他类隐藏起来,仅供外部类使用

内部类的缺点:结构复杂

内部类与外部类的关系

  • 对于非静态内部类而言,内部类的创建需要依靠外部类的实例化对象,在没有外部类对象之前是无法创建内部类的

  • 内部类是一个相对独立的个体,与外部类不是is - a 关系

  • 内部类可以直接访问外部类的元素(包含私有域)但是外部类不可以直接访问内部类元素,需要通过内部类的引用间接访问。 

内部类直接访问外部元素

class Outter{
    private String outName;
    private int outAge;
    class Inner {
        private int InnerAge;
        public Inner() {
            Outter.this.outName="I am Outter class";
            Outter.this.outAge=20;
        }
        public void display(){
            System.out.println(outName);
            System.out.println(outAge);
        }
    }
}
public class Test{
    public static void main(String[] args) {
        Outter.Inner inner=new Outter().new Inner();
        inner.display();
    }
}

外部类通过内部类间接引用访问内部类元素

class Outter{
    public void display(){
        //外部类访问内部元素,需要通过内部类引用访问
        Inner inner=new Inner();
        inner.display();
    }
    class Inner {
        public void display(){
            System.out.println("I am InnerClass");
        }
    }
}
public class Test{
    public static void main(String[] args) {
        Outter out=new Outter();
        out.display();
    }
}

创建内部类的语法(在外部类的外部创建内部类) *** 灰常重要 ***

     创建非静态内部类

  • 外部类 . 内部类 内部类引用 = new 外部类(). new 内部类();

  • Outter . Inner in = new Outter( ) . new Inner( ) ;  创建内部类的对象

     隐藏的对象  Outter . this 表示外部类对象

     创建静态内部类

  • 外部类 . 内部类 内部类引用 = new 外部类 . 内部类();

  • Outter . Inner in = new Outter . Inner(); //直接产生内部类,没有外部类产生

内部类的分类   ***重要***

  • 成员内部类  ---  成员方法

          1 . 成员内部类不能存在任何static变量或方法,可以访问外部类的静态域,不用拥有静态属性 

          2 . 内部类可以使用private封装,表示私有内部类,该内部类仅供外部类使用(HashMap中Entry内部类,ArreyList的Node内部类) ***重要***

          3 . 成员内部类必须依附外部类new Outter(). new Inner();

  • 静态内部类  ---  静态方法

          1 . 静态内部类的创建不需要外部类,可以直接创建

          2 . 静态内部类不可以访问外部类的任何非static域

使用static创建内部类

class Outer{
    private static String msg="Hello World!";
    //定义一个内部类
    static class Inner {
        //此时只能使用外部类中的static操作
        public void print(){
            //调用msg属性
            System.out.println(msg);
        }
    }
    //在外部类中定义一个方法,该方法负责产生内部类对象并且调用print()方法
    public void fun(){
        //内部类对象
        Inner in=new Inner();
        //内部类提供的print()方法
        in.print();
    }
}
public class Test{
    public static void main(String[] args) {
        Outer.Inner in=new Outer.Inner();
        in.print();
    }
}
  • 方法内部类

  • 匿名内部类

猜你喜欢

转载自blog.csdn.net/ds19980228/article/details/83217828
今日推荐