Java编程思想第四版第十章习题

这张东西有点多,闲话少说,直接上题。

PS:编译环境——IDEA

1.编写一个名为Outer的类,它包含一个名为Inner的类。在Outer中添加一个方法,它返回一个Inner类型的对象。在main()中,创建并初始化一个指向某个Inner对象的引用。

package job;
import java.util.*;
class Outer{
    class Inner{

    }
    Inner way(){
        return new Inner();
    }
}
public class Main {

    public static void main(String[] args) {
        Outer a=new Outer();
        Outer.Inner b=a.way();
    }
}

2.创建一个类,它持有一个String,并且有一个显示这个String的toString()方法,将你的新类的若干个对象添加到一个Sequence对象中,然后显示它们。

package job;

class A {
    String s = "aaa";

    A(String a) {
        s = a;
    }

    public String toString() {
        return s;
    }
}
interface Selector {
    boolean end();

    void next();

    Object current();
}

public class Main {
    private Object[] item;
    private static int i = 0;
    private static int j = 0;

    public Main(int size) {
        item = new Object[size];
    }

    private class SequenceSelector implements Selector {
        public Object current() {
            return item[j];
        }

        public void next() {
            j++;
        }

        public boolean end() {
            if (j < item.length) return true;
            else {
                j = 0;
                return false;
            }
        }
    }

    Selector selector() {
        return new SequenceSelector();
    }

    void add(Object s) {
        if (i < item.length) {
            item[i] = s;
            System.out.println(item[i]);
            ++i;
        }
    }


    public static void main(String[] args) {
        Main a = new Main(3);
        a.add(new A("aaaa"));
        a.add(new A("bbbb"));
        a.add(new A("cccc"));
        Selector b = a.selector();
        while (b.end()) {
            System.out.println(b.current());
            b.next();
        }
    }
}

 

3.修改练习1,使得Outer类包含一个private string域(由构造器初始化),而Inner包含一个显示这个域的toString()方法。创建一个Inner类型的对象并显示它。

package job;
import java.util.*;
class Outer{
    private String a="moren";
    class Inner{
        public String toString(){
            return a;
        }
    }
    Inner way(){
        return new Inner();
    }
}
public class Main {

    public static void main(String[] args) {
        Outer a=new Outer();
        Outer.Inner b=a.way();
        System.out.println(b.toString());
    }
}

4.在Sequence.SequenceSelector类中增加一个方法,它可以生成对外部类Sequence的引用。

 public Main way1(){
            return Main.this;
        } 

5.创建一个包含内部类的类,在另一个独立的类中,创建此内部类的实例。

package job;
import java.util.*;
class A{
    class B{
        
    }
}
class C{
    A a=new A();
    A.B b=a.new B();
}
public class Main {

    public static void main(String[] args) {

    }
}

6.在第一个包中创建一个至少有一个方法的接口。然后在第二个包内创建一个类,在其中增加一个protected的内部类以实现那个接口。在第三个包中,继承这个类,并在一个方法中返回该protected内部类对象,在返回的时候向上转型为第一个包中的接口的类型。

package package1;

/**
 * @ClassName: A
 * @Description: A
 * @author: hszjj
 * @date: 2019/7/18 9:01
 */
public interface A {
    void show();
}
package package2;
import package1.*;
/**
 * @ClassName:
 * @Description:
 * @author: hszjj
 * @date: 2019/7/19 10:16
 */
public class B {
    protected class C implements A{
        @Override
        public void show() {

        }
    }
}
package job;
import java.util.*;

import package1.A;
import package2.*;
class D extends B{
    C show2() {
        //return this.new C();//Error:(8, 21) java: C() 在 package2.B.C 中是 protected 访问控制
        //return new C();//Error:(9, 16) java: C() 在 package2.B.C 中是 protected 访问控制
    }
}
public class Main {

    public static void main(String[] args) {

    }
}

7.创建一个含有private域和private方法的类。创建一个内部类,它有一个方法可用来修改外部类的域,并调用外围类的方法。在外围类的另一个方法中,创建此内部类的对象,并且调用它的方法,然后说明对外围类对象的影响。

package job;
import java.util.*;
class A{
    private int x=1;
    private void way1(){
        System.out.println("x="+x);
    }
    class B{
        void way2(int y){
            x=y;
            way1();
        }
    }
    void way3(){
        B b=new B();
        b.way2(3);
    }
}
public class Main {

    public static void main(String[] args) {
        
    }
}

8.确定外部类是否可以访问其内部类的private元素。

package job;
import java.util.*;
class A{
    static class B{
        private int x=1;
    }
    static void show(){
        B a=new B();
        System.out.println(a.x);
    }
}
public class Main {

    public static void main(String[] args) {
        A.show();
    }
}

9.创建一个至少有一个方法的接口。在某个方法内定义一个内部类以实现此接口,该方法返回对此接口的引用。

package job;
import java.util.*;
interface A{
    void show();
}
public class Main {
    static A get(){
        class B implements A{
            @Override
            public void show() {

            }
        }
        B b=new B();
        return b;
    }
    public static void main(String[] args) {
        A a = get();
    }
}

10.重复前一个练习,但将内部类定义在某个方法的一个作用域内。

package job;
import java.util.*;
interface A{
    void show();
}
public class Main {
    static A get(){
        if(true) {
            class B implements A {
                @Override
                public void show() {

                }
            }
            B b = new B();
            return b;
        }
        else{
            return null;
        }
    }
    public static void main(String[] args) {
        A a = get();
    }
}

11.创建一个private内部类,让它实现一个public接口。写一个方法,它返回一个指向此private内部类的实例的引用,并将此引用向上转型为该接口类型。通过尝试向下转型,说明此内部类被完全隐藏了。

package package2;
/**
 * @ClassName:
 * @Description:
 * @author: hszjj
 * @date: 2019/7/19 10:16
 */
public interface C {
    void show();
}
package job;
import java.util.*;
import package2.*;
public class Main {
    private class B implements C {
        @Override
        public void show() {
        }
    }
    public C back() {
        C c = new Main.B();
        return c;
    }

    public static void main(String[] args) {
        Main a = new Main();
        C c = a.back();
    }
}

12.重复练习7,这次使用匿名内部类。

package job;
import java.util.*;
class A{
    private int x=1;
    private void way1(){
        System.out.println("x="+x);
    }
    public B getB(final int y){
        return new B(){
            @Override
            public void change() {
                x=y;
                way1();
            }
        };
    }
}
interface B{
    void change();
}
public class Main {
    public static void main(String[] args) {
        A a=new A();
        B b=a.getB(2);
        b.change();
    }
}

13.重复练习9,这次使用匿名内部类。

package job;
import java.util.*;
interface A{
    void show();
}
public class Main {

    public A getA() {
        return new A() {
            @Override
            public void show() {
                System.out.println("showing");
            }
        };
    }

    public static void main(String[] args) {
        Main a=new Main();
        A b=a.getA();
        b.show();
    }
}

 

14.修改interface/HorrorShow.java,用匿名类实现DangerousMonster和Vampire。

package job;
import java.util.*;
public class Main {
    public Monster getDangerousMonster(){
        return new Monster() {
            @Override
            public void menace() {
                System.out.println("menace");
            }
            public void destroy(){//扩展的方法
                System.out.println("destroy");
            }
        };
    }
    public Lethal getVampire(){
        return new Lethal() {
            @Override
            public void kill() {
                System.out.println("kill");
            }
            public void drinkBlood(){
                System.out.println("dringkBlood");
            }
        };
    }
}
interface Monster{
    void menace();
}
interface Lethal{
    void kill();
}

没写main,就看个大概意思的了。

15.创建一个类,它有非默认的构造器(既需要参数的构造器),并且没有默认构造器(没有无参数的构造器)。创建第二个类,它包含一个方法,能够返回对第一个类的对象的引用。通过写一个继承自第一个类的匿名内部类,来创建一个返回对象。

package job;
import java.util.*;
class A{
    A(String a){
        System.out.println(a);
    }
}
class B{
    public A getA(final String s){
        return new A(s){

        };
    }
}
public class Main {
    public static void main(String[] args) {
        B b=new B();
        A a=b.getA("handsome jj");
    }
}

16.修改第九章中练习18的解决方案,让它使用匿名内部类。

package job;
import java.util.*;
public class Main {
    interface Cycle {
        void run();
    }

    interface CycleFactory {
        Cycle getCycle();
    }

    class Unicycle implements Cycle {
        @Override
        public void run() {
            System.out.println("Unicycle Running");
        }
    }

    class Bicycle implements Cycle {
        @Override
        public void run() {
            System.out.println("Bicycle Running");
        }
    }

    class Tricycle implements Cycle {
        @Override
        public void run() {
            System.out.println("Tricycle Running");
        }
    }

    public CycleFactory UncycleFactory = new CycleFactory() {
        @Override
        public Cycle getCycle() {
            return new Unicycle();
        }
    };
    public CycleFactory BicycleCycleFactory = new CycleFactory() {
        @Override
        public Cycle getCycle() {
            return new Bicycle();
        }
    };
    public CycleFactory TricycleCycleFactory = new CycleFactory() {
        @Override
        public Cycle getCycle() {
            return new Tricycle();
        }
    };

    static class Factory {
        static void Consumer(CycleFactory fact) {
            Cycle c = fact.getCycle();
            c.run();
        }
    }


    public static void main(String[] args) {
        Main a=new Main();
        Factory.Consumer(a.UncycleFactory);
    }

}

17.修改第9章练习19的解决方案,让它使用匿名内部类。

package job;
import java.util.*;
public class Main {
    interface Game {
        void play();

        void getresult();
    }

    interface GameFactory {
        Game getGame();
    }

    class Coin implements Game {
        Random rand = new Random();
        int coin = 0;

        @Override
        public void play() {
            switch (rand.nextInt(2)) {
                case 0:
                    coin = 0;
                    break;
                case 1:
                    coin = 1;
                    break;
                default:
            }
        }

        public void getresult() {
            if (coin == 0) {
                System.out.println("硬币为正");
            } else {
                System.out.println("硬币为反");
            }
        }
    }

    GameFactory CoinFactory = new GameFactory() {
        @Override
        public Game getGame() {
            return new Coin();
        }
    };

    static class Factories {
        public static void PlayGame(GameFactory fact) {
            Game a = fact.getGame();
            a.play();
            a.getresult();
        }
    }


    public static void main(String[] args) {
        Main a=new Main();
        for (int i = 0; i < 10; i++) {
            Factories.PlayGame(a.CoinFactory);
        }
    }
}

18.创建一个包含嵌套类的类。在main()中创建起内部类的实例。

package job;
import java.util.*;
class A{
    static public class B{
        
    }
}
public class Main {
    public static void main(String[] args) {
        A.B b=new A.B();
    }
}

 

19.创建一个包含内部类的类,而此内部类又包含有内部类。使用嵌套类重复这回过程。注意编译器生成的.class文件的名字。

package job;
import java.util.*;
class A{
    static public class B{
        static public class C{
            
        }
    }
}
public class Main {
    public static void main(String[] args) {
        A.B.C b=new A.B.C();
    }
}

20.创建一个包含嵌套类的接口,实现此接口并创建嵌套类的实例。

package job;
import java.util.*;
interface A{
     public class B implements A{
        
    }
}
public class Main {
    public static void main(String[] args) {
        A.B b=new A.B();
    }
}

21.创建一个包含嵌套类的接口,该嵌套类中有一个static方法,它将调用接口中的方法并显示结果。实现这个接口,并将这个实现的一个实例传递给这个方法。

package job;
import java.util.*;
interface A{
    void way();
     public class B implements A{
         @Override
         public void way() {
            System.out.println("way");
         }
         static void show(){
            new B().way();
        }
    }
}
public class Main {
    public static void main(String[] args) {
        A.B.show();
    }
}

22.实现Sequence.Java中的reverseSelector()方法。

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

package job;
import java.util.*;
interface U{
    void way1();
    void way2();
    void way3();
}
class A{
    U getU(){
        return new U() {
            @Override
            public void way1() {

            }

            @Override
            public void way2() {

            }

            @Override
            public void way3() {

            }
        };
    }
}
class B{
    U[] u=new U[3];
    int index=0;
    void putU(U a){
        if(index

24和25,22章再写。

26.创建一个包含内部类的类,此内部类有一个非默认的构造器(需要参数的构造器)。创建另一个也包含内部类的类,此内部类继承自第一个内部类。

package job;
import java.util.*;
class A{
    class B{
        B(int i){
            System.out.println("E26B");
        }
    }
}

public class Main extends A.B {
    Main(A a) {
        a.super(1);
        System.out.print("E26");
    }

    public static void main(String[] args) {
        Main a = new Main(new A());
    }
}

结束~
我的另一个博客:https://www.cnblogs.com/hsjj/
会不定时的更新算法题
有问题欢迎发送邮件至[email protected]
我们下次见哦~

你可能感兴趣的:(JAVA,Java编程思想第四版答案,Java,Java编程思想)