滴水穿石-03一道面试题引发的思考

按要求,补齐代码.要求在控制台输出"HelloWorld";

interface Inter {void show();}

class Outer {//补齐代码}

class OuterDemo{

  public static void main(String[] args){

    Outer.method().show();

  }

}

1 链式编程

看到Outer.method().show();这行代码首先想到的是链式编程,即:方法调用后返回一个对象,对象接着可以继续调方法

1.1 链式编程例子  

package cn.DSCS_03;

public class 链式编程 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        StudentDemo s = new StudentDemo();
        s.getStudent().SayLevel();
        
    }
}    
    class StudentDemo {        
        public Student getStudent(){
            return new Student();
        }
    } 
     class Student{
        public void SayLevel(){
             System.out.print("简单级别");
        } 
    }            
             
         
链式编程—简单例子

 

public class 链式编程 { 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Student s = new Student();
        s.setName("张三").setAge(20).SayLevel();
    }
}     
     class Student{
        private String name;
        private int age;
        public Student setName(String name){
            this.name = name;
            return this;
        }
        public Student setAge(int age){
            this.age = age;
            return this;
        }
        public void SayLevel(){
             System.out.println("简单级别");
             System.out.println("我叫"+this.name+"年龄: "+this.age); 
        } 
    }    
链式编程-例子2

 

package cn.DSCS_03;

public class 链式编程 { 
    public static void main(String[] args) {
        // TODO Auto-generated method stub 
        Student.builder().setName("张三").setAge(20).SayLevel();
    }
}     
     class Student{
         public static Builder builder(){
             return new Builder();
         }
         static class Builder{             
               private String name;
                private int age;
                public Builder setName(String name){
                    this.name = name;
                    return this;
                }
                public Builder setAge(int age){
                    this.age = age;
                    return this;
                }
                public void SayLevel(){
                     System.out.println("简单级别");
                     System.out.println("我叫"+this.name+"年龄: "+this.age); 
                } 
         }
    }            
             
         
成员内部类结合链式编程

 

1.1.1 内部类:在类的内部定义的类

1.1.1.1 成员内部类:在成员位置定义的类被称为“成员内部类”

package cn.DSCS_03;

public class 成员内部类 {
    public static void main(String [] args){
        //访问方式 
        //外部类名.内部类名 对象名 = 外部类对象.内部对象
        Outer.Inner ot = new Outer().new Inner();
        ot.show();
    }
}

class Outer{
    private int num =10;
    //成员位置
    class Inner{
        public void show(){
            System.out.print(num);
        }        
    }
    
}
成员内部类

 1.1.1.2 方法内部类:在局部位置定义的类被称为“局部内部类”;这道题的答案也涉及到了局部内部类

public class 局部内部类 {
    public static void main(String[] args){
         Outer_a o = new Outer_a();
         o.method();
    }
}

class Outer_a{
    private int num =10;
    public void method(){
        class Inner{
            public void show(){
                System.out.print(num);
            }
        }
        Inner i = new Inner();
        i.show();
    }
    
}
局部内部类

 1.1.2 匿名内部类;其本质为对象(类的子类,实现了接口的类)

package cn.DSCS_03;

public class 匿名内部类 {
 
    public static void main(String[] args) {
        //格式: new 类名或者接口名(){重写方法;}
        Outer_b o = new Outer_b();
        o.method();
    }

}
interface Inter2{
    public abstract void show();
}
class Outer_b{
    /**
     * 
     */
    public void method(){
        new Inter2(){
            public void show(){
                System.out.print("Hello,World");
            }
        }.show();
    }
}
匿名内部类

 

package cn.DSCS_03;

public class 匿名内部类 {
 
    public static void main(String[] args) {
        //格式: new 类名或者接口名(){重写方法;}
        Outer_b o = new Outer_b();
        o.method();
    }

}
interface Inter2{
    public abstract void show();
    public abstract void show2();
}
class Outer_b{
     
    public void method(){
        Inter2 i = new Inter2(){
            public void show(){
                System.out.println("Hello,World");
            }
            public void show2(){
                System.out.print("Hello,World2");
            }
        } ;
        i.show();
        i.show2();
    }
}
匿名内部类2

2 自此,我们可以写出

但是return Inter;不能直接返回接口,而是返回接口的实现类

package cn.DSCS_03;

public class 面试题 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //01 根据此句是链式编程,可以推出返回值为Inter
        //02 由于通过类名.方法名直接调用可以退出时静态方法
        Outer2.method().show();
    }

}
interface Inter {
    //注意:这里默认为 public abstract 
    void show();
}

class Outer2 {
   public static Inter method(){
       //匿名内部类
       return new Inter(){
           //由于继承类的访问权限不能比接口的低
          public void show(){
              System.out.print("HelloWorld");
          }
       };
   }
}
最终答案

 

转载于:https://www.cnblogs.com/YK2012/p/8279110.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值