面向对象(四)——Object类+内部类

Keywords: Object类、内部类、匿名内部类

Object类

所有对象的直接或间接父类,java中的上帝。该类中定义的是所有对象中都具备的功能。

常用的共性功能:


image

equals(Object obj) 方法与toString() 方法的栗子:day10\ObjectDemo1.java

内部类

内部类的概述

将一个类定义在另一个类里面,对里面的那个类就成为内部类(内置类,嵌套类)。(day10\InnerClassDemo.java)

内部类的访问特点

  1. 内部类可以直接访问外部类中的成员,包括私有成员。之所以可以直接访问外部类中的成员是因为内部类中持有了一个外部类的引用,格式外部类名.this
  2. 外部类要访问内部类中的成员必须要建立内部类的对象

内部类的位置

内部类定义在外部类的成员位置上

栗子:

class Outer
{
    private static int num = 31;

    class Inner// 内部类。//相当于外部类中的一个成员,可以被成员修饰符所修饰。public private static
    {
        static final int count = 5;//在非静态内部类中只允许定义静态的常量,不能定义其他静态成员
        void show()
        {
            System.out.println("show run..."+num);
        }
        /*static void function()//如果内部类中定义了静态成员,该内部类也必须是静态的。
        {
            System.out.println("function run ...."+num);
        }
        */
    }

    static class Inner2 //静态内部类,相当于外部类
    {
        void show2()
        {
            System.out.println("show2 run..."+num);
        }
        
        static void show3()
        {
            System.out.println("show3 run..."+num);
        }
    }
}

访问格式:

  1. 当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中直接建立内部类对象。格式:

    //非静态,非私有的内部类访问方式
    外部类名.内部类名 变量名 = 外部类对象.内部类对象;
    Outer.Inner in = new Outer().new Inner();
    
  2. 当内部类在成员位置上,就可以被成员修饰符所修饰。如private:将内部类在外部类中进行封装;static:内部类具备static的特性,当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限.

    //在外部其他类中访问static内部类的非静态成员
    形式一:间接访问
    Outer.Inner in = new Outer.Inner();
    in.function();
    形式二:直接访问
    new Outer.Inner.function();
    
    //在外部其它类中访问static内部类的静态成员
    Outer.Inner.function()
    

    注意:当内部类中定义了静态成员,该内部类必须是静态的。当外部类中的静态方法访问内部类时,内部类也必须是静态的。

内部类定义在局部

栗子:

class Outer
{
    int num = 3;
    Object obj;
    void method()
    {
        final int x = 9; //不可以访问它所在的局部中的变量,只能访问final修饰的局部变量

        class Inner
        {
            public String toString()
            {
                System.out.println("x="+x);
                System.out.println("show.."+num);
                return "Inner....abc";
            }
        }

        Inner in = new Inner();
        obj = in;
    }

    public void function()
    {
        //打印obj指向的对象的字符串表现形式。
        System.out.println(obj.toString());
    }
}

当内部类定义在局部时:

  1. 不可以被成员修饰符修饰
  2. 可以直接访问外部类中的成员,因为还持有外部类中的引用,但是不可以访问它所在的局部中的变量,只能访问final修饰的局部变量

内部类的应用

当描述事物时,事物的外部还有事物,该事物用内部类来描述,因为内部事物在使用外部事物的内容。

匿名内部类

就是内部类的简化写法。(day10\InnerClassDemo4.java)其实匿名内部类就是一个匿名子类对象,可以理解为带内容的对象。匿名内部类中定义的方法最好不要操作两个。

abstract class Demo
{
    abstract void show();
}

class Outer
{
    int num = 4;
    /*
    class Inner extends Demo
    {
        void show()
        {
            System.out.println("show ..."+num);
        }
    }
    */
    public void method()
    {
        //new Inner().show();
        new Demo()//匿名内部类。
        {
            public void show()
            {
                System.out.println("show ........"+num);
            }
        }.show();
    }
}


class InnerClassDemo
{
    public static void main(String[] args) 
    {
        new Outer().method();
    }
}

定义匿名内部类的前提: 内部类必须继承一个类或者接口
匿名内部类的格式: new 父类/接口(){定义子类的内容}
匿名内部类的使用场景:
一个测试题:

interface Inter
{
    void method();
}

class Test
{
    //补足代码 (建议用匿名内部类)

    /*
    static class Inner implements Inter{
        public void method(){
            System.out.println("method run");
        }
    }*/

    static Inter function()
    {
        return new Inter()
        {
            public void method()
            {
                System.out.println("method run");
            }
        };
    }
}

class  InnerClassTest
{
    public static void main(String[] args) 
    {
        //Test.function():Test类中有一个静态的方法function()
        //.method():function方法运算后的结果是一个对象,而且是一个Inter类型的对象
        //因为只有是Inter类型的对象,才可以调用method方法
        Test.function().method();
        show(new Inter(){
            public void method()
            {
                System.out.println("method run");
            }
        });
    }

    public static void show(Inter in)
    {
        in.method();
    }
}

你可能感兴趣的:(面向对象(四)——Object类+内部类)