* 编写一个内部类,外部类为药品类,内部类为药架类,包括一个放置药品的方法,要求: * 1.外部其他类不能直接访问内部类 * 2.但外部其他类可以访问内部类的放置药品方法

—-classOne
package firstExam.third;

public interface MedicineSelfInterface {

public void putMedicine();

}
—-classTwo
package firstExam.third;

public class Medicine {

public MedicineSelf getInnerInstancce(){
    return new MedicineSelf();
}

private class MedicineSelf implements MedicineSelfInterface{

    @Override
    public void putMedicine() {

        System.out.println("药架用于放置药品。");

    }

}

}

—-classThree
package firstExam.third;
/**
* 编写一个内部类,外部类为药品类,内部类为药架类,包括一个放置药品的方法,要求:
* 1.外部其他类不能直接访问内部类
* 2.但外部其他类可以访问内部类的放置药品方法
*/

/**
* Java内部类的概念及四种分类
* 概念:在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。
* 分类①:成员内部类
* 成员内部类是最普通的内部类,它的定义位于另一个类的内部;成员内部类类似于此外部类的方法,可以无条件的访问
* 外部类的所有成员属性和成员方法。但是外部类如果要访问成员内部类的成员,必须先创建一个成员内部类的对象。成员内部类是
* 依附于外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象。
* 内部类可以拥有各种访问修饰权限,如果内部类Inner用private修饰,则只能在外部类的内部访问,如果用public
* 修饰,则任何地方都能访问,但是外部类只能被public和包访问权限(默认)修饰,由于内部类看起来像是外部类的一个成员,
* 所以可以像类的成员一样拥有多种权限修饰。
* 分类②:局部内部类
* 定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的方法权限仅限于方法内或者该作用域内。
* 局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的,
* 局部变量只能被final修饰或者是默认修饰。
* 分类③静态内部类
* 静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,
* 这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,
* 分类④匿名内部类
*/

public class Test {

public static void main(String[] args) {

    Medicine medicine=new Medicine();
    /*多态,利用接口的引用来接收实现类的对象,medicine.getInnerInstancce();方法
     * 返回一个内部类MedicineSelf的对象实例;此处如果不使用接口,那么MedicineSelf为
     * private的内部类,不可以被其他类所方法,就会出现错误。
     */
    medicine.getInnerInstancce();
    MedicineSelfInterface msi=medicine.getInnerInstancce();
    /*msi.putMedicine();是接口MedicineSelfInterface的抽象方法,编译期间
     *匹配MedicineSelfInterface接口的抽象方法,运行期间JVM根据
     *medicine.getInnerInstancce();的实际类型,
     *动态绑定msi.putMedicine();方法的实现
     */
    msi.putMedicine();


}

}

猜你喜欢

转载自blog.csdn.net/qq_38986609/article/details/78488565