DUFQ_2020.12.15-杜飞强-内部类

内部类

定义

内部类是将一个类定义在另一个类的内部,被定义在内部的类称为内部类,包含内部类的类称为外部类。

PS:如果一个类只在另外一个类的内部使用,不会再其他的地方使用,就可以定位内部类。

分类

成员内部类
/**
 * 成员内部类
 *  1) 成员内部类与实例变量/实例方法一样,都是属于某一个Outer对象的
 *  2) 一般情况下, 在实例方法中使用成员内部类创建对象
 *  3) 在Java中,所有类编译后都会生成一个独立的字节码文件, 
 *      内部类的字节码文件: 外部类$内部类名.class
 */
public class Outer {
    int  xx = 10 ;      //实例变量
    public void m1() {
        System.out.println("实例方法");
        xx = 123;       //在实例方法中,可以直接使用实例变量
        //一般情况下, 在实例方法中使用成员内部类创建对象
        Inner1  obj = new Inner1();
    }
    //成员内部类
    class Inner1{   
    }
}
静态内部类
/**
 * 静态内部类
 *  1) 使用static修饰的成员 内部类
 *  2) 静态内部类一般情况下是在静态方法中使用
 */
public class Outer {
    static int yy = 20;         //静态变量
    public static void sm() {
        System.out.println("静态方法");
        yy = 202 ;              //在静态方法中,可以直接使用静态变量
        //一般情况下是在静态方法中使用静态内部类
        Inner2 obj = new Inner2();
    }
    //静态内部类
    static class Inner2{    
    }
}
局部内部类
/**
 * 局部内部类
 *  1) 在方法体中定义的内部类就是局部内部类
 *  2) 局部内部类的作用域 , 是从定义内部类的位置开始, 直到包含它的大括弧结束
 *
 */
public class Outer {
    public void m3() {
        int zz = 10;        //局部变量  
        class Inner3{}      //局部内部类 
    }
}
匿名内部类
/**
 * 匿名内部类
 *  1)匿名内部类,就是没有类名的内部类,
 *  2)因为匿名内部类没有类名, 匿名内部类的定义与对象的创建必须在一起
 *  3)给接口/抽象类的引用赋值时,可以赋值匿名内部类对象,接口实现类/抽象类的子类只使用一次时, 可以使用  *   匿名内部类
 *  如果方法的形参是接口/抽象类的引用,在调用方法时,可以传递匿名内部类对象
 */
public class Test {

    public static void main(String[] args) {
        //接口的引用只能赋值实现类对象, 接口不能实例化对象, 需要先定义一个类,让它实现接口,再创建实现类对象给接口引用赋值
        //如果接口的实现类就使用这一次, 以后再也不用了,就不需要再单独的定义一个实现类了,可以直接给接口引用赋值匿名内部类对象
        
        Flyable  flyable = new Flyable() {
            //在匿名内部类中重写接口的抽象方法
            @Override
            public void fly() {
                System.out.println("我是匿名内部类中重写的飞行操作");
            }
        };      
        flyable.fly();
        //抽象类不能实例化对象, 抽象类的引用需要赋值子类对象, 先定义子类继承抽象类, 重写抽象类的抽象方法, 再创建子类对象给抽象类引用赋值
        //当子类就使用这一次时, 可以直接给抽象类引用赋值匿名内部类对象
        
        Animal animal = new Animal() {
            //在匿名内部类中重写抽象类的抽象方法
            @Override
            public void walk() {
                System.out.println(" 这是一个神奇的动物, 它没有腿也能走路");
            }
        };
        animal.walk();  
    }
}

习题1

package com.dufq.pack;

import java.util.Scanner;
/**
 * @author dufq
 * @version idea 1.3
 * @date 2020/12/15 16:14
 */
public  abstract class Area {//面积抽象类Area

    public abstract void area(double n, double m,double r);//定义有参抽象方法
}
     class RectArea extends Area {//矩形面积类RectArea

         @Override
         public void area(double n, double m, double r) {
             double area = n * m;
             System.out.println("矩形面积是:" + area);
         }
     }
         class RoundArea extends Area {//圆形面积RoundArea

             @Override
             public void area(double n, double m, double r) {
                 double area = Math.PI * Math.pow(r, 2);
                 System.out.println("原型面积" + area);
             }
         }
public class Test {
    public static void main(String[] args) {
        Scanner r = new Scanner(System.in);
        RectArea rectArea = new RectArea();
        RoundArea roundArea = new RoundArea();
        System.out.println("请输入图形的长:");
        int h = r.nextInt();
        System.out.println("请输入图形的宽:");
        int w = r.nextInt();
        rectArea.area(h,w,0);
        System.out.println("请输入半径:");
        double v = r.nextDouble();
        roundArea.area(0,0,v);
    }
}

习题2

package com.dufq.pack1;

import java.util.Scanner;
/**
 * @author dufq
 * @version idea 1.3
 * @date 2020/12/15 22:25
 */
public abstract class Print {
    public static void pr() {
    }

    abstract void print();
}

class DotMatrixtPrinter extends Print{
    @Override
    void print() {
        System.out.println("已连接针式打印机!");

    }
}
class InkpetPrinter extends  Print{
    @Override
    void print() {
        System.out.println("已连接喷墨打印机!");
    }
}
class LaserPrinter extends Print{
    @Override
    void print() {
        System.out.println("已连接激光打印机!");
    }
}
public class Test {
    public static void main(String[] args) {
        Print print = null;
        Scanner r = new Scanner(System.in);
        System.out.println("请选择你需要的打印机,1:针式打印机;2,喷墨打印机;3,激光打印机");
        int score = r.nextInt();
        switch(score){
            case 1:
                print = new DotMatrixtPrinter();
                break;
            case 2:
                print = new InkpetPrinter();
                break;
            case 3:
                print = new  LaserPrinter();
                break;
        }
        print.print();
    }
}

标签

评论


© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1