面向对象之内部类

本文详细介绍了Java中的内部类概念,包括成员内部类和局部内部类的区别及使用方式,阐述了如何通过外部类访问内部类成员,并解释了匿名内部类的特点和应用场景。

一.内部类

1.含义

把类B定义在类A中,类B就被称为内部类。

2.访问规则

内部类可以直接访问外部类的成员,包括私有

外部类要想访问内部类成员,必须创建对象

3.分类

(1).成员内部类

在成员位置定义的类

(2).局部内部类

在局部位置定义的类

4.成员内部类

(1).修饰符

private 为了保证数据的安全性

static 为了方便访问数据 (注意:静态内部类访问的外部类数据必须用静态修饰)

(2).访问规则
成员内部类不是静态的:

外部类名.内部类名 对象名 = new 外部类名.new 内部类名();

成员内部类是静态的:

外部类名.内部类名 对象名 = new 外部类名.内部类名();

(3).面试题
/*
    面试题:
        要求请填空分别输出30,20,10。

    注意:
        1:内部类和外部类没有继承关系。
        2:通过外部类名限定this对象
            Outer.this
*/
class Outer {
    public int num = 10;
    class Inner {
        public int num = 20;
        public void show() {
            int num = 30;
            System.out.println(num);
            System.out.println(this.num);
            //System.out.println(new Outer().num);
            System.out.println(Outer.this.num);
        }
    }
}
class InnerClassTest {
    public static void main(String[] args) {
        Outer.Inner oi = new Outer().new Inner();
        oi.show();
    }   
}

5.局部内部类

局部内部类访问局部变量必须加final修饰。

因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。
所以,堆内存还是用该变量,而改变量已经没有了。
为了让该值还存在,就加final修饰。
通过反编译工具我们看到了,加入final后,堆内存直接存储的是值,而不是变量名。

6.匿名内部类

是局部内部类的简化形式

(1).前提

存在一个类或者接口

(2).格式
new 类名或者接口名() {
                重写方法;
            }
(3).本质

匿名内部类的本质是继承类或者实现了接口的子类匿名对象

(4).开发中的使用

我们在开发的时候,会看到抽象类,或者接口作为参数。
而这个时候,我们知道实际需要的是一个子类对象。
如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式简化。

面试题
/*
    匿名内部类面试题:
        按照要求,补齐代码
            interface Inter { void show(); }
            class Outer { //补齐代码 }
            class OuterDemo {
                public static void main(String[] args) {
                      Outer.method().show();
                  }
            }
            要求在控制台输出”HelloWorld”
*/
interface Inter { 
    void show(); 
    //public abstract
}

class Outer { 
    //补齐代码
    public static Inter method() {
        //子类对象 -- 子类匿名对象
        return new Inter() {
            public void show() {
                System.out.println("HelloWorld");
            }
        };
    }
}

class OuterDemo {
    public static void main(String[] args) {
        Outer.method().show();
        /*
            1:Outer.method()可以看出method()应该是Outer中的一个静态方法。
            2:Outer.method().show()可以看出method()方法的返回值是一个对象。
                又由于接口Inter中有一个show()方法,所以我认为method()方法的返回值类型是一个接口。
        */
    }
}

二.形式参数和返回值问题

1.形式参数

类名:需要该类的对象

抽象类名:需要该类的子类对象

接口名:需要该接口的实现类对象

2.返回值类型

类名:返回的是该类的对象
抽象类名:返回的是该类的子类对象
接口名:返回的是该接口的实现类的对象

3.链式编程

特点 对象.方法1().方法2()…….方法n();

注: 其实在方法1()调用完毕后,应该一个对象;
方法2()调用完毕后,应该返回一个对象。
方法n()调用完毕后,可能是对象,也可以不是对象。

三.权限修饰符

1.权限修饰符

                    本类  同一个包下   不同包下的子类 不同包下的无关类
        private     Y
        默认         Y       Y
        protected   Y       Y           Y
        public      Y       Y           Y               Y

2.这四种权限修饰符在任意时刻只能出现一种。

public class Demo {}

四.常见修饰符

1.分类:

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

2.常见的类及其组成的修饰

    类:
        默认,public,final,abstract

        常用的:public

    成员变量:
        private,默认,protected,public,static,final

        常用的:private

    构造方法:
        private,默认,protected,public

        常用的:public

    成员方法:
        private,默认,protected,public,static,final,abstract

        常用的:public

3.另外比较常见的:

public static final int X = 10;
public static void show() {}
public final void show() {}
public abstract void show();

五.包

1.含义

其实就是文件夹

2.作用:

(1).区分同名的类
(2).对类进行分类管理

按照功能分

按照模块分

3.包的定义

格式: package 包名;

多级包用.分开。

4.注意事项

package语句必须在文件中的第一条有效语句

在一个java文件中,只能有一个package

如果没有package,默认就是无包名

5.导包

(1).含义

我们多次使用一个带包的类,非常的麻烦,这个时候,Java就提供了一个关键字import。

(2).格式:

import 包名…类名;

(3).package,import,class的顺序

package > import > class

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值