Java编程思想第十章"内部类"的10.7至10.8小节的笔记和练习题

Java编程思想第四版第十章习题 这张东西有点多,闲话少说,直接上题。 PS:编译环境——IDEA 1.编写一个名为Outer的类,它包含一个名为Inner的类。在Outer中添加一个方法,它返回一个Inner类型的对象。在main()中,创建并初始化一个指向某个Inner对象的引用。 package job; import java.util.*; class Outer{ class Inner{ }... 阅读详情

    最近,我的工作很忙,而且10.8小节内容很多、很复杂,即使断断续续的抽时间看了三遍,依然感觉写不好这个小节的笔记。因此,此文中包含10.8小节的部分就当作摘抄,以备后续经常翻看。

10.7 嵌套类
    将内部类声明为static,它通常被称为嵌套类。普通的内部类对象隐式地保存了一个指向创建它的外围类对象的引用,而嵌套类则不是这样:
    ①、要创建嵌套类的对象,不需要外围类的对象。
    ②、不能从嵌套类的对象中访问非静态的外围类对象。
    另外,普通内部类不能包含static方法和static字段(字段可以声明为static final的常量),也不能包含嵌套类,但是嵌套类可以。
    练习题18:创建一个包含嵌套类的类。在main()中创建其内部类的实例。
    代码如下:
interface MarineAnimals {
    void swim();
}

public class Sea {

    static class Turtle implements MarineAnimals {

        int num = 10;

        @Override
        public void swim() {
            System.out.println("有" + num + "只海龟在游泳。");
        }
    }

    public static MarineAnimals getMarineAnimals() {
        return new Turtle();
    }
}

运行代码如下:
public static void main(String[] args) {
    Sea.Turtle turtle = new Turtle(); // 或MarineAnimals animal = getMarineAnimals()
    turtle.swim();
}

    练习题19:创建一个包含了内部类的类,而此内部类又包含有内部类。使用嵌套类重复这个过程。注意编译器生成.class文件的名字。
    代码如下:
interface MarineAnimals {
    void swim();
}

public class Sea {

    static class Turtle implements MarineAnimals {
        int num = 10;

        static class Eye {
        }

        @Override
        public void swim() {
            System.out.println("有" + num + "只海龟在游泳。");
        }
    }

    class Anglerfish implements MarineAnimals {

        class Eye {
        }

        @Override
        public void swim() {
            System.out.println("背上有个小灯笼,在海底爬行");
        }
    }

    public static MarineAnimals getMarineAnimals() {
        return new Turtle();
    }
}
生成.class文件如下:


    10.7.1 接口内部的类
    如果想要创建某些公共代码,使得它们可以被某个接口的所有不同实现所共用,那么就可以使用接口内部的嵌套类。
    练习题20:创建一个包含嵌套类的接口,实现此接口并创建嵌套类的实例。
    代码如下:
public interface MarineAnimals {
    void swim();

    static class GoodSwimmer implements MarineAnimals {

        @Override
        public void swim() {
            System.out.println("海洋动物都是游泳健将。");
        }

        public static void main(String[] args) {
            new GoodSwimmer().swim();
        }
    }
}

    练习题21:创建一个包含嵌套类的接口,该嵌套类中有一个static方法,它将调用接口中的方法并显示结果。实现这个接口,并将这个实现的一个实例传递给这个方法。
    代码如下:
public interface MarineAnimals {
    void swim();

    static class GoodSwimmer {

        public static void swim(MarineAnimals animals) {
            animals.swim();
        }
    }
}

class Turtle implements MarineAnimals {

    @Override
    public void swim() {
        System.out.println("海龟游速每小时可达32公里");
    }
}

class Dolphin implements MarineAnimals {

    @Override
    public void swim() {
        System.out.println("海豚全力前进时,游速每小时可达80公里");
    }
}

运行代码如下:
public static void main(String[] args) {
    MarineAnimals.GoodSwimmer.swim(new Turtle());
    MarineAnimals.GoodSwimmer.swim(new Dolphin());
}

    10.8 为什么需要内部类
    一般来说,内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象。所以可以认为内部类提供了某种进入其外围类的窗口(诸如ArrayList的内部类Itr、ListItr等)。

    问题1:如果只需要一个对接口的引用,为什么不通过外围类实现那个接口呢?
    答:如果能满足需求,就应该用外围类实现那个接口。
    
    问题2:用内部类实现一个接口与外围类实现这个接口有什么区别呢?
    答:对于一个接口可以有多个不同的内部类实现,而只用外围类,则仅有一个实现(用这个外围类来实现)。因此,用外围类实现不一定能享用接口的方便。

    因此,使用内部类最吸引人的原因是:
    每个内部类都能独立地继承自一个(接口的)实现,而无论外围类是否已经继承了某个(接口的)实现。

    这使得多重继承的解决方案变得完整,接口解决了多重继承的部分问题,内部类有效地实现了多重继承。即,内部类允许继承多个类或抽象类。

    书中有两个示例,这里不贴代码了,只是说明一下:
    ①、在一个类中以某种方式实现两个接口:若问题没有指明应该使用单一类还是内部类,那么仅从实现上来看两种方式没有什么区别。
    ②、在一个类中以某种方式继承两个类(抽象类或具体类):由于Java是单继承,因此这个类至多只能继承其中一个类,而另一个则必须让内部类来继承。

    使用内部类,可以获得的一些特性:
    ①、内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。
    ②、在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类。
    ③、创建外围类对象的时候,并不一定创建内部类对象。这使得内部类对象类似于外围类对象的轻量级组件。例如ArrayList与其内部类Itr,我们只有在需要的时候才会去创建Itr对象,然后获得一个ArrayList的视图。(英文原文为:The point of creation of the inner-class objects not tied to the creation of the outer-class object.,这句话我觉得应该翻译为:内部类对象的创建并不会随着外部类对象的创建而创建。)。
    ④、内部类是一个独立的实体,它与外围类并没有”is-a”(继承)关系。

    练习题22:实现Sequence.java中的reverseSelector()方法。
public Selector reverseSelector() {
    return new Selector() {

        private int i = items.length - 1;

        @Override
        public void next() {
            if (i >= 0)
                i--;
        }

        @Override
        public boolean end() {
            return i < 0;
        }

        @Override
        public Object current() {
            return items[i];
        }
    };
}

运行代码如下:
public static void main(String[] args) {
    Sequence sequence = new Sequence(10);
    for (int i = 0; i < 10; i++) {
        Employee emp = new Employee(i, "compony" + i);
        sequence.add(emp);
    }

    Selector reverseSelector = sequence.reverseSelector();
    while (!reverseSelector.end()) {
        System.out.println(reverseSelector.current());
        reverseSelector.next();
    }
}

    练习题23:创建一个接口U,它包含三个方法。创建第一个类A,它包含一个方法,在此方法中通过创建一个匿名内部类,来生成指向U的引用。创建第二个类B,它包含一个由U构成的数组。B应该有几个方法,第一个方法可以接受对U的引用并存储到数组中;第二个方法将数组中的引用设为null(根据方法参数);第三个方法遍历此数组,并在U中调用这些方法(调用U中的方法)。在main()中,创建一组A的对象和一个B的对象。用那些A类对象所产生的U类型的引用填充B对象的数组。使用B回调所有A的对象,再从B中移除某些U的引用。
    代码如下:
public interface Fish {

    void swim(String desc);

    void breathe(String desc);

    void dive(String desc);
}

public class SeaFish {

    private String name;

    public SeaFish(String name) {
        this.name = name;
    }

    public void swim(String desc) {
        System.out.println(name + desc);
    }

    public void breathe(String desc) {
        System.out.println(name + desc);
    }

    public void dive(String desc) {
        System.out.println(name + desc);
    }

    public Fish getFish() {
        return new Fish() {

            @Override
            public void swim(String desc) {
                SeaFish.this.swim(desc);
            }

            @Override
            public void breathe(String desc) {
                SeaFish.this.breathe(desc);
            }

            @Override
            public void dive(String desc) {
                SeaFish.this.dive(desc);
            }
        };
    }
}

public class Sea {

    private int i = 0;
    private Fish[] fishes;

    public Sea(int size) {
        fishes = new Fish[size];
    }

    public void add(SeaFish seaFish) {
        if (i < fishes.length) {
            fishes[i++] = seaFish.getFish();
        }
    }

    public void remove(int i) {
        if (i > 0 && i < fishes.length)
            fishes[i - 1] = null;
    }

    public void show() {
        for (Fish fish : fishes) {
            if (fish == null)
                continue;

            fish.swim("在水中快乐嬉戏");
            fish.breathe("自由自在的呼吸");
            fish.dive("本领很大,会潜水");
        }
    }
}

运行代码如下:
public class Test {

    public static void main(String[] args) {
        Sea sea = new Sea(4);
        for (int i = 0; i < 4; i++) {
            SeaFish fish = new SeaFish("海豚" + i);
            sea.add(fish);
        }
        sea.show();
        sea.remove(3);
        sea.show();
    }
}

    10.8.1 闭包与回调
    闭包:是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。
    通过这个定义,可以看出内部类是面向对象的闭包,它不仅包含外围类对象(创建内部类的作用域)的信息,还拥有一个指向此外围类对象的引用,在此作用域内,内部类可以操作所有成员,包括private成员。
    回调:在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用高层定义的子程序。
    通过回调,对象能够携带一些信息,这些信息允许它在稍后的某个时刻调用初始的对象。
    书中部分代码如下:
interface Incrementable {

    void increment();
}

class MyIncrement {
    public void increment() {
        System.out.println("Other operation");
    }

    static void f(MyIncrement mi) {
        mi.increment();
    }
}

class Callee extends MyIncrement {
    private int i = 0;

    @Override
    public void increment() {
        super.increment();
        System.out.println(++i);
    }

    private class Closure implements Incrementable {

        @Override
        public void increment() {
            Callee.this.increment();
        }
    }

    Incrementable getCallbackReference() {
        return new Closure();
    }
}

class Caller {
    private Incrementable callbackReference;

    Caller(Incrementable cbh) {
        callbackReference = cbh;
    }

    void go() {
        callbackReference.increment();
    }
}

public class Callback {
    public static void main(String[] args) {
        Callee callee = new Callee();
        Caller caller = new Caller(callee.getCallbackReference());
        caller.go();
    }
}

    说明:
    ①、Callee继承自MyIncrement,它已经有了一个increment()方法,其与Incrementable的increment()方法无关。因此,不能为了实现Incrementable而覆盖increment()方法,于是只能使用内部类独立地实现Incrementable。
    ②、内部类Closure实现了Incrementable,以提供一个返回Callee的”钩子”(hook),而且是一个安全(与指针相比)的钩子,它只能调用外围类的increment()方法。
    ③、Caller的构造器需要一个Incrementable的引用作为参数,然后在以后的某个时刻,Caller对象可以使用此引用回调Callee类。

    10.8.2 内部类与控制框架
    应用程序框架(application framework):被设计用以解决某类特定问题的一个类或一组类。要运用某个应用程序框架,通常是继承一个或多个类,并覆盖某些方法。在覆盖后的方法中,编写代码定制应用程序框架提供的通用解决方案,以解决我们的问题(模板方法模式)。模板方法包含算法的基本结构,并且会调用一个或多个可覆盖的方法,以完成算法的动作。设计模式总是将变化的事物与保持不变的事物分离开,在这个模式中,模板方法是保持不变的事物,而可覆盖的方法就是变化的事物。
    控制框架是一类特殊的应用程序框架,它用来解决响应事件的需求。主要用来响应事件的系统被称作事件驱动系统。比如,Java Swing库就是一个控制系统。
    书中示例代码:基于时间触发事件的控制系统。
    抽象的事件类:
/**
 * 描述了要控制的事件。因为其默认的行为是基于时间去执行控制,所以使用抽象类代替实际的接口。
 */
public abstract class Event {

    private long eventTime;
    protected final long delayTime;

    /**
     * 事件创建的时候启动事件,触发事件的时间为System.nanoTime() + delayTime
     * 
     * @param delayTime
     */
    public Event(long delayTime) {
        this.delayTime = delayTime;
        start();
    }

    /**
     * 方便在事件运行以后重新启动计时器,即可以重复使用Event对象
     */
    public void start() {
        eventTime = System.nanoTime() + delayTime;
    }

    /**
     * 是否就绪,若就绪,则可以运行action()方法(触发事件)
     * 
     * @return
     */
    public boolean ready() {
        return System.nanoTime() >= eventTime;
    }

    /**
     * 由导出类实现具体的行为
     */
    public abstract void action();
}

    管理并触发事件的实际控制框架:
/**
 * 管理并触发事件的控制器
 */
public class Controller {
    // 事件容器
    private List<Event> eventList = new ArrayList<Event>();

    /**
     * 添加事件
     * 
     * @param e
     */
    public void addEvent(Event e) {
        eventList.add(e);
    }

    public void run() {
        // 直到事件全部被触发,且全部移除
        while (eventList.size() > 0) {
            /**
             * 在进行foreach循环遍历的时候,不能add/remove元素。因此,使用 new
             * ArrayList<Event>(eventList)创建一个副本
             */
            for (Event e : new ArrayList<Event>(eventList)) {
                if (e.ready()) { // 就绪后,触发事件,并移除
                    System.out.println(e);
                    e.action();
                    eventList.remove(e);
                }
            }
        }
    }
}

    注意,在当前的设计中我们还不知道Event到底要做什么。这正是此设计的关键:使变化的事物与不变的事物相互分离。这里,变化的事物就是各种不同的Event对象所具有的不同行为,而我们可以通过创建不同的Event子类来表现不同的行为。
    这正是内部类要做的事情,它允许:
    ①、控制框架的单个实现是由单个的类创建的,从而使得实现的细节被封装起来。内部类用来表示解决问题所必需的各种不同的action()。
    ②、内部类能够轻易地访问外围类的任意成员。
    
    此控制框架的一个实现:控制温室的运作,控制灯光、水、温度调节器的开关,以及响铃和重新启动系统。它的每个行为都是不同的,可以使用内部类,在单一的类里产生对同一个基类Event的多种导出版本。
/**
 * 温室控制系统
 */
public class GreenhouseControls extends Controller {
    // 灯开关的控制
    private boolean light = false;

    // 开灯
    public class LightOn extends Event {

        public LightOn(long delayTime) {
            super(delayTime);
        }

        @Override
        public void action() {
            // 控制开灯的硬件代码
            light = true;
        }

        @Override
        public String toString() {
            return "Light is on";
        }
    }

    // 关灯
    public class LightOff extends Event {

        public LightOff(long delayTime) {
            super(delayTime);
        }

        @Override
        public void action() {
            // 控制关灯的硬件代码
            light = false;
        }

        @Override
        public String toString() {
            return "Light is off";
        }
    }

    // 水开关的控制
    private boolean water = false;

    // 打开水开关
    public class WaterOn extends Event {

        public WaterOn(long delayTime) {
            super(delayTime);
        }

        @Override
        public void action() {
            // 控制打开水开关的硬件代码
            water = true;
        }

        @Override
        public String toString() {
            return "Water is on";
        }
    }

    // 关闭水开关
    public class WaterOff extends Event {

        public WaterOff(long delayTime) {
            super(delayTime);
        }

        @Override
        public void action() {
            // 控制关闭水开关的硬件代码
            water = false;
        }

        @Override
        public String toString() {
            return "Water is off";
        }
    }

    // 温度调节器,默认为白天模式
    private String thermostat = "Day";

    // 调整温度调节器为夜间模式
    public class ThermostatNight extends Event {

        public ThermostatNight(long delayTime) {
            super(delayTime);
        }

        @Override
        public void action() {
            // 调整温度调节器为夜间模式的硬件代码
            thermostat = "Night";
        }

        @Override
        public String toString() {
            return "Thermostat on night setting";
        }
    }

    // 调整温度调节器为白天模式
    public class ThermostatDay extends Event {

        public ThermostatDay(long delayTime) {
            super(delayTime);
        }

        @Override
        public void action() {
            // 调整温度调节器为白天模式的硬件代码
            thermostat = "Day";
        }

        @Override
        public String toString() {
            return "Thermostat on day setting";
        }
    }

    // 响铃,其行为是将自己的一个实例添加到事件容器中
    public class Bell extends Event {

        public Bell(long delayTime) {
            super(delayTime);
        }

        @Override
        public void action() {
            addEvent(new Bell(delayTime));
        }

        @Override
        public String toString() {
            return "Bing! Bing! Bing!";
        }
    }

    // 重启控制系统的事件
    public class Restart extends Event {

        private Event[] eventList;

        public Restart(long delayTime, Event[] eventList) {
            super(delayTime);
            this.eventList = eventList;
            for (Event e : eventList)
                addEvent(e);
        }

        @Override
        public void action() {
            // 重启每个事件
            for (Event e : eventList) {
                e.start();
                addEvent(e);
            }
            start(); // 重启当前事件
            addEvent(this);
        }

        @Override
        public String toString() {
            return "Restarting system";
        }
    }

    // 停止事件
    public static class Terminate extends Event {

        public Terminate(long delayTime) {
            super(delayTime);
        }

        @Override
        public void action() {
            System.exit(0);
        }

        @Override
        public String toString() {
            return "Terminating";
        }
    }
}

    创建一个GreenhouseControls对象,并添加不同的Event对象来配置该系统。
/**
 * 配置并启动温室系统
 */
public class GreenhouseController {

    public static void main(String[] args) {
        GreenhouseControls gc = new GreenhouseControls();
        // 可以使用配置文件来避免硬编码
        gc.addEvent(gc.new Bell(900));
        Event[] eventList = { gc.new ThermostatNight(0), gc.new LightOn(200), gc.new LightOff(400), gc.new WaterOn(600),
                gc.new WaterOff(800), gc.new ThermostatDay(1400) };
        gc.addEvent(gc.new Restart(2000, eventList));
        // 以命令行输入参数(作为毫秒数)来决定何时终止系统
        if (args.length == 1) {
            gc.addEvent(new GreenhouseControls.Terminate(new Integer(args[0])));
        }
        gc.run();
    }
}

    练习题24:在GreenhouseControls.java中增加一个Event内部类,用以打开、关闭风扇。配置GreenhouseController.java以使用这些新的Event对象。
    代码如下:
    打开、关闭风扇的Event导出类
// 风扇开关的控制
private boolean fan = false;

// 打开风扇
public class fanOn extends Event {

    public fanOn(long delayTime) {
        super(delayTime);
    }

    @Override
    public void action() {
        // 控制打开风扇开关的硬件代码
        fan = true;
    }

    @Override
    public String toString() {
        return "Fan is on";
    }
}

// 关闭风扇
public class fanOff extends Event {

    public fanOff(long delayTime) {
        super(delayTime);
    }

    @Override
    public void action() {
        // 控制关闭风扇开关的硬件代码
        fan = false;
    }

    @Override
    public String toString() {
        return "Fan is off";
    }
}

    打开、关闭风扇的Event导出类的使用:
public static void main(String[] args) {
    GreenhouseControls gc = new GreenhouseControls();
    // 可以使用配置文件来避免硬编码
    gc.addEvent(gc.new Bell(900));
    Event[] eventList = { gc.new ThermostatNight(0), gc.new LightOn(200), gc.new LightOff(400), gc.new WaterOn(600),
            gc.new WaterOff(800), gc.new fanOn(1000), gc.new fanOff(1200), gc.new ThermostatDay(1400) };
    gc.addEvent(gc.new Restart(2000, eventList));
    // 以命令行输入参数(作为毫秒数)来决定何时终止系统
    if (args.length == 1) {
        gc.addEvent(new GreenhouseControls.Terminate(new Integer(args[0])));
    }
    gc.run();
}

    练习题25:在GreenhouseControls.java中继承GreenhouseControls,增加Event内部类,用以开启、关闭喷水机。写一个新版的GreenhouseController.java以使用这些新的Event对象。
    代码如下:
    GreenhouseControls的导出类,及开启、关闭喷水机的Event导出类:
class HouseControls extends GreenhouseControls {
    // 喷水机控制装置
    private boolean sprinklerControls = false;

    // 打开喷水机
    public class TurnOnSprinkler extends Event {

        public TurnOnSprinkler(long delayTime) {
            super(delayTime);
        }

        @Override
        public void action() {
            // 硬件代码,打开喷水机开关
            sprinklerControls = true;
        }

        @Override
        public String toString() {
            return "Sprinkler is on";
        }
    }

    // 打开喷水机
    public class TurnOffSprinkler extends Event {

        public TurnOffSprinkler(long delayTime) {
            super(delayTime);
        }

        @Override
        public void action() {
            // 硬件代码,关闭喷水机开关
            sprinklerControls = false;
        }

        @Override
        public String toString() {
            return "Sprinkler is off";
        }
    }
}

    使用新的Event导出类:
public class HouseController {

    public static void main(String[] args) {
        HouseControls hc = new HouseControls();
        // 可以使用配置文件来避免硬编码
        hc.addEvent(hc.new Bell(900));
        Event[] eventList = { hc.new ThermostatNight(0), hc.new LightOn(200), hc.new LightOff(400), hc.new WaterOn(600),
                hc.new WaterOff(800), hc.new fanOn(1000), hc.new fanOff(1200), hc.new TurnOnSprinkler(1400),
                hc.new TurnOffSprinkler(1600), hc.new ThermostatDay(1800) };
        hc.addEvent(hc.new Restart(2000, eventList));
        // 以命令行输入参数(作为毫秒数)来决定何时终止系统
        if (args.length == 1) {
            hc.addEvent(new GreenhouseControls.Terminate(new Integer(args[0])));
        }
        hc.run();
    }
}

京东工作8年,肝到T8就剩这份心得了,已助朋友拿到10个Offer 在京东工作了8年,工作压力大,节奏快,但是从技术上确实得到了成长,尤其是当你维护与大促相关的系统的时候,熬到P7也费了不少心思,小编也是个爱学习的人,把这几年的工作经验整理成了一份完整的笔记。此笔记已助朋友拿到腾讯,阿里,美团等10个offer ! 由于细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容! 大致内容包括了: Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elast 阅读详情

相关推荐

LangChain Message 官方文档

消息是聊天模型中的基本通信单位。它们用于表示聊天模型的输入和输出,以及与对话相关的其他上下文或元数据。每条消息都包含一个角色(如“用户”、“助手”)和内容(如文本或多模态数据),并可能包含根据不同聊天模型提供商而有所不同的附加元数据。LangChain 提供了一个统一的消息格式,可以跨不同聊天模型使用,简化用户在不同模型之间切换时所需关注的消息格式差异。

AI Agent 首席体验官 896

Think in Java 中一道有意思的题目

第3版中 第8章的一道题目 关于内部类的 题目如下: 创建一个接口U,它包含三个方法.创建第一个类A,它包含一个方法,在此方法中通过创建一个匿名内部类,来生成指向U的引用.创建第二个类B,它包含一个由U构造成的数组.B应该有几个方法,第一个方法可以接受对U的引用并存储到数组中;第二个方法将数组中的引用设为null;第三个方法遍历此数组,并在U中调用这些方法.在main()中,创建一组A的对...

开发者 260

Python程序—定子故障三相永磁同步电动机振动与电流数据集

1.0 kW 电机匝间短路故障数据: 正常匝间短路振动数据: 匝间短路故障,严重度为2.26%: 匝间短路故障,严重度为2.70%: 匝间短路故障,严重度为3.35%: 匝间短路故障,严重度为4.41%: 匝间短路故障,严重度为6.48%: 匝间短路故障,严重度为12.17%: 匝间短路故障,严重度为21.69%1.5 kW 电机匝间短路故障数据: 正常匝间短路振动数据: 匝间短路故障,严重度为1.57%: 匝间短路故障,严重度为1.88%: 匝间短路故障,严重度为2.34%

m0_66465741的博客 1320

java编程思想第四版 第10章习题

java编程思想第四版 第10章 萌新刷题指北

qq_36625612的博客 559

PCIE配置和地址空间

来源:https://www.jianshu.com/p/574e9a2cbc4e 每个PCIe设备,有这么一段空间,Host软件可以读取它获得该设备的一些信息,也可以通过它来配置该设备,这段空间就叫做PCIe的配置空间。不同于每个设备的其它空间,PCIe设备的配置空间是协议规定好的,哪个地方放什么内容,都是有定义的。PCI或者PCI-X时代就有配置空间的概念,那时的配置空间如下: 图6.1 整个配置空间就是一系列寄存器的集合,其中Type 0是Endpoint的配置,Type 1是Brid.

qq_28643619的博客 4060

开关电源三大基本拓扑:反激、正激与桥式选型本质

开关电源拓扑是电力电子系统设计的核心基础概念,其本质决定能量传递路径、器件应力分布与系统物理边界。反激拓扑以耦合电感形式实现隔离与升降压,适用于小功率AC-DC场景;正激拓扑依赖实时能量传递与强制复位机制,支撑中功率高效率需求;桥式拓扑(含推挽/半桥/全桥)通过电压应力分摊与双向磁化,成为大功率系统的刚性选择。理解三者在磁芯工作模式、电流连续性、直流偏磁抑制等方面的原理差异,直接关系到效率、温升、EMI及可靠性等关键技术指标。本文聚焦反激、正激、桥式三大工程级基本拓扑的物理本质与落地约束,揭示从需求参数到电

cqwmy840702的博客 376

Thinking in java 第10章 内部类 笔记+习题

Thinking in java 第10章 内部类 学习目录 10.1 创建内部类 1. 外部类可以用一个方法返回一个指向内部类的引用。 2. 内部类对象的类型:OuterClassName.InnerClassName 10.2 链接到外部类 1. 当生成一个内部类的对象时,此对象与制造它的外围对象之间就有了一种联系,所以它能访问其外围成员,而不需要任何特殊条件。 2. 例P192。以迭代器设计模式为例。 3. 内部类自动拥有对其外围类所有成员的访问权。当某个外围类的对象创建了一个内.

soyamilk233的博客 727

YOLOv8缺陷检测可视化界面实战:PyQt5布局设计与代码实现

本文详细介绍了如何利用PyQt5为YOLOv8缺陷检测模型构建一个专业、易用的可视化界面。通过实战讲解PyQt5的布局管理器设计、信号槽机制与YOLOv8核心的集成,帮助开发者快速将AI模型部署为直观的桌面应用,提升工业质检等场景的落地效率。

redis7keeper的博客 758

java迭代器的源码,Java源码解析-迭代器

自己写一个迭代器/*** 迭代器接口*/interface Selector {boolean end();Object current();void next();}public class Sequence {private Object[] items; // 内部持有一个Object数组private int next = 0;/*** 初始化Object数组* @param size*/...

weixin_39992957的博客 147

AD9026芯片开发实战指南:从硬件配置到射频校准

本文为AD9026芯片开发实战指南,详细解析了从硬件设计、电源时钟配置、SPI初始化到多芯片同步与JESD204高速链路建立的完整流程。重点探讨了射频校准技术,包括初始化校准与跟踪校准,以保障5G、MIMO等现代通信系统所需的射频性能。旨在帮助开发者系统掌握这颗高性能射频收发器的应用,规避常见设计陷阱。

tomato的博客 851

智能手表竞品分析与市场调研报告

本报告旨在通过调研当前主流智能手表产品的功能特点、市场表现、用户反馈、定价策略等方面,辅助我司即将立项的Aurora Watch S1产品在功能定义、目标用户、定价区间、差异化竞争等方面做出科学决策。 调研范围包括国内外中端价位主流品牌(¥199~¥999),重点关注小米、华为、荣耀、Amazfit、Redmi、Haylou 等品牌的热销型号。

hoony123的博客 7万+

Java 内部类和匿名内部类小结

一、什么是内部类 在一个类中定义另外一个类 举例: 在类A中,定义一个类B,就可以将类B作为A类的内部类. 二、分类 1)成员内部类: 在外部类的成员位置,定义一个类。 2)局部内部类: 在外部类的局部位置,定义一个类。 三、成员内部类访问特点 访问成员内部类中的成员方法: 需求:在测试类中如何访问成员内部类中的show方法(非静态) // 外部类 class Outer{ private int num = 10 ; public int num2 = 20 ; //成员内部类 public

Acybee的博客 451

【具身智能】感知 × 决策 × 执行:一个智能体的认知闭环怎么搭?

构建一个真正能在现实世界中运作的具身智能体,并不是简单地拼接“视觉 + 控制器 + 动作模块”就能完成的,它必须是一个**认知闭环结构**:能感知环境、理解状态、制定策略、执行动作,并从结果中学习反馈。 本讲将深入剖析具身智能的三大核心支柱:**感知系统、决策系统、执行系统**,并解析它们如何协同构建出一个“能观察、能思考、能行动”的智能体。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3263

说说Java中的内部类

/@OverrideSystem.out.println(“我是定时器”);flag=false;System.out.println(“flag改成了false”);show();System.out.println(“我是show”);4.内部类与外部类的关系1.对于非静态内部类,内部类的创建依赖外部类的实例对象。在没有外部类的实例之前是无法创建内部类的。

2301_82242670的博客 639

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

《Java编程思想》第四版读书笔记 第十章 内部类

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33737774的博客 187

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java8使用小节

Oracle公司于2014年3月18日发布了Java8,它提供了更多的编程工具和概念,能以更快,更重要的是能以更简洁、更易于维护的方式解决新的或现有的编程问题。本文主要整理了其中流处理、Lambda表达式、Optional类的概念与使用方式,期望有助于提供开发效率、减少代码复杂性。流处理流是一系列&lt;u&gt;数据项&lt;/u&gt;,一次只生成一项...

xingduan5153的博客 217

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JAVA内部类

内部类 内部类的分类 类别 定义 实例 成员内部类 在一个类中定义另一个类 成员内部类 局部内部类 在方法中定义另一个类 局部内部类 匿名内部类 省略掉该类的定义,直接重写抽象方法 匿名内部类 成员内部类 如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类。 例如:身体和心脏的关系。又如:汽车和发动机的关系。 分类: 成员内部类 局部内部类(包含匿名内...

huotong 371

阿里工作8年,肝到P8就剩这份学习笔记了,已助朋友拿到10个Offer

在阿里工作了8年,工作压力大,节奏快,但是从技术上确实得到了成长,尤其是当你维护与大促相关的系统的时候,熬到P7也费了不少心思,小编也是个爱学习的人,把这几年的工作经验整理成了一份完整的笔记。此笔记已助朋友拿到腾讯,阿里,美团等10个offer ! 由于细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容! 大致内容包括了: Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elast

Java大将军的博客 1万+

Java编程思想第十一章"持有对象"的11.5~11.9小节的笔记和练习题

11.5 List 有两种类型的List: ①、ArrayList:擅长随机访问元素,但在List中间插入和移除元素较慢。 ②、LinkedList:在List中间进行插入和删除操作的代价较低,优化的顺序访问,随机访问较慢,特性集比ArrayList大。 书中的代码就不贴在这里了,然后书中介绍了常用的API,需要的话可以自行去查帮助文档。 有几个方法...

hi__study的博客 509

java内部类(代码演示)

1:什么是内部类 将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。 例如:身体和心脏的关系。又如:汽车和发动机的关系。 2:分类 成员内部类:定义在类中,方法外的类。 局部内部类:(包含匿名内部类) 3:成员内部类 3.1 访问特点: 内部类可以直接访问外部类的成员,包括私有成员。 外部类要访问内部类的成员,必须要建立内部类的对象。 如何使用成员内部类?有两种方式: 间接方式:在外部类的方法当中,使用内部类;然后main只是调用外部类的方法。 直接方式,公式: 类名称

rainMan的博客 533

【Java】内部类

内部类 /* 如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类。 例如:身体和心脏的关系。又如:汽车和发动机的关系。 分类: 1. 成员内部类 2. 局部内部类(包含匿名内部类) 成员内部类的定义格式: 修饰符 class 外部类名称 { 修饰符 class 内部类名称 { // ... } // ... } 注意:内用外,随意访问;...

欢迎关注【微信公众号】测试开发Guide,从功能测试进阶测试开发 150

黑马java学习笔记8(阶段二 第一章 1-6~1-7)第一章完结

黑马java学习笔记8(阶段二 第一章 1-6~1-7)第一章完结

xiaozhuzhu__的博客 1123

JAVA之final、权限、内部类、引用类型笔记及注意事项

1 /* final关键字代表最终、不可改变的。 常见四种用法: 1. 可以用来修饰一个类 2. 可以用来修饰一个方法 3. 还可以用来修饰一个局部变量 4. 还可以用来修饰一个成员变量 */ 2 /* 当final关键字用来修饰一个类的时候,格式: public final class 类名称 { // ... } 含义:当前这个类不能有任何的子类。(太监类) 注意:一个类如果是final的,那么其中所有的成员方法都无法进行覆盖重写(因为没儿子。) */ 3 /* 当final关

TOPic666的博客 248

阿里工作7年,肝到P8就剩这份学习笔记了,已助10个朋友拿到offer

在阿里工作了7年,工作压力大,节奏快,但是从技术上确实得到了成长,尤其是当你维护与大促相关的系统的时候,熬到P8也费了不少心思。 技术的更新迭代越来越快,程序员或许是这个过程中最为挣扎的一波人。每当遇到技术升级,也就意味着程序员曾经赖以生存的技能将大打折扣。不得已的,我们必须去不断汲取新的知识,学习新的技术,日复一日,周而复始。几乎每过一段时间,就要沉下心来,填补自己的技能库。这其中的压力,恐怕也只有我们自己知道。 我也是个爱学习的人,我觉得学习是程序员生活与工作中长久不变的主题。所以我把这几年的工

gp16674213804的博客 472

JAVA的final、修饰符、内部类详解

1. final关键字 final关键字代表最终、不可改变的。 1.1 常见四种用法: 可以用来修饰一个类 可以用来修饰一个方法 还可以用来修饰一个局部变量 还可以用来修饰一个成员变量 1.2 修饰类 当final关键字用来修饰一个类的时候,格式: public final class 类名称 { // ... } 含义:当前这个类不能有任何的子类。(太监类) 注意:一个类如果是fin...

tastyrekeke的博客 476

Java学习路线总结(书籍、视频推荐篇)

立志存高远,笃行践初心 三更灯火五更鸡,正是男儿读书时。 黑发不知勤学早,白首方悔读书迟。 立志,标定人生方向;奋斗,创造人生价值,二者相辅相成,互相促进。 大部分程序员的「 目标 」都是成为一名优秀的工程师,一名可以统览全局的「架构师」。 千里之行始于足下 对于大部分普通人而言,成为一名优秀的架构师还是有一定难度的,「千里之行始于足下,一步一个脚印,慢慢来」。 ???? 粉丝专属福利:包邮送书3本,如下书单四选一。 ???? 获取方式: 1、参与文末投票,点赞,收藏即有机会获得精美图书一

学Java,找哪吒 2万+
上一篇: Java编程思想第十章"内部类"的10.3至10.6小节的练习题
下一篇: 项目总结:XXGAT的OA系统及移动办公服务端
hi__study
博客等级 码龄10年 14粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值