day 11:Java中的内部类、匿名内部类和一道例题


package bamzhy.day13;

//    乒乓球运动员和篮球运动员,乒乓球教练和篮球教练。为了出国交流,跟乒乓球相关的人员都必须学习英语。
//      请用所学知识分析,这个案例中有哪些抽象类、接口、具体类。
public class Example {
    public static void main(String[] args) {
        PingpongPlayer pingPongPlayer1=new PingpongPlayer("张怡宁",true,25);
        System.out.println("name = " + pingPongPlayer1.name + " isFemale = " + pingPongPlayer1.isFemale + " career = "
                + pingPongPlayer1.carrer);
        pingPongPlayer1.eat();
        pingPongPlayer1.practice();

    }

}

abstract class Person{

    String name;
    boolean isFemale;
    public Person(){

    }

    public Person(String name, boolean isFemale) {
    this.name=name;
    this.isFemale=isFemale;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public boolean isFemale() {
        return isFemale;
    }

    public void setFemale(boolean female) {
        isFemale = female;
    }
    public  void sleep(){
        System.out.println("人都躺着睡");
    }
    //吃饭这个动作对于不同类型的运动员和教练员来说可能并不相同,无法确定此时究竟吃什么
    public abstract void eat();
}
abstract class Player extends Person{

    int carrer;
    public Player(){}
    public Player(int carrer){
        this.carrer=carrer;
    }
    public Player(String name,boolean isFemale,int carrer){
        super(name,isFemale);//向上传参数
        this.carrer=carrer;
    }
    public int getCarrer() {
        return carrer;
    }

    public void setCarrer(int carrer) {
        this.carrer = carrer;
    }
    //站在运动员的角度,还是没有办法确定具体的训练内容
    public abstract void practice();
}

abstract class Coach extends Person{
    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    String status;
    public Coach(){
    }
    public abstract void train();
}

interface InterfaceInternationally{
    void speakEnglish();
}

class PingpongPlayer extends Player implements InterfaceInternationally{

    public PingpongPlayer(String name,boolean isFemale,int carrer) {
        super(name,isFemale,carrer);
    }

    @Override
    public void eat() {
        System.out.println("均衡搭配,营养丰富");
    }

    @Override
    public void practice() {
        System.out.println("训练乒乓球技巧");
    }

    @Override
    public void speakEnglish() {
        System.out.println("学习英语技能");
    }
}

class BasketballPlayer extends Player{
    @Override
    public void eat() {
        System.out.println("高蛋白饮食");
    }

    @Override
    public void practice() {
        System.out.println("训练篮球技巧");
    }
}

class PingPongCoach extends Coach implements InterfaceInternationally{
    @Override
    public void eat() {
        System.out.println("均衡搭配,营养丰富");
    }

    @Override
    public void train() {
        System.out.println("指导乒乓球运动员");
    }

    @Override
    public void speakEnglish() {
        System.out.println("熟练掌握英语技能");
    }
}
class BasketbalCoach extends Coach{
    @Override
    public void eat() {
        System.out.println("补脑食物");
    }
    @Override
    public void train() {
        System.out.println("给篮球运动员提供战术指导");
    }
}


内部类:
 
package bamzhy.day12;

public class InnerClassDemo2 {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.accessInner();
//        Outer.Inner in=new Outer.Inner();
        //没有静态(static)的类中类不能使用外部类进行.操作,必须用实例来进行实例化类中类.
        Outer outer1=new Outer();
        //从外部类的外部访问成员位置局部变量的正确语法
        //外部类名.内部类名 对象名=外部类对象.内部类对象
        Outer.Inner inner=outer1.new Inner();
        //第二种语法
        Outer.Inner inner2=new Outer().new Inner();
        //匿名对象:没有引用变量指向它,用完就成为垃圾
        //匿名对象不可以复用,只在使用一次的场景想使用;
        new Outer().accessInner();
        Outer[] outers={new Outer()};

    }
}
class Outer{
    int j=100;
    public void accessInner(){
        //外部类内部访问局部内部类
        Inner inner = new Inner();
        System.out.println("inner i="+inner.i);
    }
    class Inner{
        int i=10;
    }
}

package bamzhy.day12;

public class InnerClassDemo3 {
    public static void main(String[] args) {
    Outer1 outer1=new Outer1();
//    Outer1.Inner1 inner1 = outer1.new Inner1();
        //内部类中无论是静态或者非静态方法都可以用对象去访问
        Outer1.Inner1 inner1=new Outer1.Inner1();
        inner1.accessOuter();
        inner1.staticAccessOuter();
        //对于内部类中的静态成员
        //外部类名.内部类名.方法名()
//        Outer1.Inner1.staticAccessOuter();
        System.out.println("inner static field access:"+Outer1.Inner1.k);
    }
}
//static修饰符不能用来修饰普通类
class Outer1 {
    int i = 10;
    static private int j = 10;

    //一旦内部类被static修饰符所修改时,那么整个内部类的的类体都会变成静态环境
    static class Inner1 {
        static int k = 100;
        int j = 1000;
        public void accessOuter() {
            System.out.println("inner non static j=" + j);
        }

        public static void staticAccessOuter() {
            System.out.println("inner static j=" + new Outer1().j);
            System.out.println("inner static j=" + new Inner1().j);
        }

    }

}

匿名内部类:

public class AnonymousInnerClass {
    //是内部类的一种简化写法
    //(对象)new 类名或者接口名(){重写方法}
    //匿名内部类的本质:是一个继承了类或者实现了接口的子类匿名对象
    public static void main(String[] args) {
        Inter1 inter=new A();
        //首先匿名内部类的结构是一个实现了接口或者抽象类的匿名对象
        //因为它是一个匿名对象,在只会被使用一次的场景下使用
        new A().show();
        new Inter1(){
            @Override
            public void show() {
                System.out.println("class A implements Inter1");
            }
        }.show();
    }
}
interface Inter1{
    void show();
}
class A implements Inter1{
    @Override
    public void show() {
        System.out.println("class A implements Inter1");
    }
}

public class AnonymousInnerClass2 {
    /*
    匿名内部类的使用
     */
    public static void main(String[] args) {
        new Inner2(){
            @Override
            public Inner2 toDo() {
                System.out.println("to do");
                return  this;
            }

            @Override
            public void toBuy() {
                System.out.println("to Buy");
            }
        }.toBuy();
        //当要在一个匿名内部类对象上调用两个方法或者调用多次,new出多个匿名内部类对象
        new Inner2(){
            @Override
            public Inner2 toDo() {
                System.out.println("to do");
                return this;
            }

            @Override
            public void toBuy() {
                System.out.println("to Buy");
            }
        }.toBuy();
        //第二种调用方式
        Inner2 inner2 = new Inner2(){
            @Override
            public Inner2 toDo() {
                System.out.println("to do");
                return this;
            }

            @Override
            public void toBuy() {
                System.out.println("to Buy");
            }
        };
        inner2.toBuy();
        inner2.toDo();
        //实现链式调用
        new Inner2(){
            @Override
            public Inner2 toDo() {
                System.out.println("to do");
                return this;
            }
            @Override
            public void toBuy() {

            }
        }.toDo().toDo();
    }
}
interface Inner2{
    Inner2 toDo();
    void toBuy();

 
 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值