/* 教练和运动员案例(学生分析而后讲解) 乒乓球运动员和篮球运动员。 乒乓球教练和篮球教练。 为了出国交流,跟乒乓球相关的人员都须要学习英语。 请用所学知识: 分析,这个案例中有哪些抽象类,哪些接口,哪些具体类。 整个分析过程,我是经过画图讲解的。 */ //定义一个说英语的接口 interface SpeakEnglish { //说英语 public abstract void speak(); } //定义人的抽象类 abstract class Person { private String name; private int age; public Person() {} public Person(String name,int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //睡觉 public void sleep() { System.out.println("人都是要睡觉的"); } //吃饭 public abstract void eat(); } //定义运动员抽象类 abstract class Player extends Person { public Player() {} public Player(String name,int age) { super(name,age); } //学习 public abstract void study(); } //定义教练抽象类 abstract class Coach extends Person { public Coach() {} public Coach(String name,int age) { super(name,age); } //教 public abstract void teach(); } //定义乒乓球运动员具体类 class PingPangPlayer extends Player implements SpeakEnglish { public PingPangPlayer(){} public PingPangPlayer(String name,int age) { super(name,age); } //吃 public void eat() { System.out.println("乒乓球运动员吃大白菜,喝小米粥"); } //学习 public void study() { System.out.println("乒乓球运动员学习如何发球和接球"); } //说英语 public void speak() { System.out.println("乒乓球运动员说英语"); } } //定义篮球运动员具体类 class BasketballPlayer extends Player { public BasketballPlayer(){} public BasketballPlayer(String name,int age) { super(name,age); } //吃 public void eat() { System.out.println("篮球运动员吃牛肉,喝牛奶"); } //学习 public void study() { System.out.println("篮球运动员学习如何运球和投篮"); } } //定义乒乓球教练具体类 class PingPangCoach extends Coach implements SpeakEnglish { public PingPangCoach(){} public PingPangCoach(String name,int age) { super(name,age); } //吃 public void eat() { System.out.println("乒乓球教练吃小白菜,喝大米粥"); } //教 public void teach() { System.out.println("乒乓球教练教如何发球和接球"); } //说英语 public void speak() { System.out.println("乒乓球教练说英语"); } } //定义篮球教练具体类 class BasketballCoach extends Coach { public BasketballCoach(){} public BasketballCoach(String name,int age) { super(name,age); } //吃 public void eat() { System.out.println("篮球教练吃羊肉,喝羊奶"); } //教 public void teach() { System.out.println("篮球教练教如何运球和投篮"); } } class InterfaceDemo { public static void main(String[] args) { //测试运动员(乒乓球运动员和篮球运动员) //乒乓球运动员 PingPangPlayer ppp = new PingPangPlayer(); ppp.setName("王浩"); ppp.setAge(33); System.out.println(ppp.getName()+"---"+ppp.getAge()); ppp.eat(); ppp.sleep(); ppp.study(); ppp.speak(); System.out.println("----------------"); //经过带参构造给数据(留给大家) //篮球运动员 BasketballPlayer bp = new BasketballPlayer(); bp.setName("姚明"); bp.setAge(34); System.out.println(bp.getName()+"---"+bp.getAge()); bp.eat(); bp.sleep(); bp.study(); //bp.speak(); //没有该方法 //测试教练本身作 } }
/* 链式编程。 每次调用完毕方法后,返回的是一个对象。 */ class Student { public void study() { System.out.println("Good Good Study,Day Day Up"); } } class StudentDemo { public Student getStudent() { return new Student(); } } class StudentTest3 { public static void main(String[] args) { //如何调用的呢? StudentDemo sd = new StudentDemo(); //Student s = sd.getStudent(); //s.study(); //你们注意了 sd.getStudent().study(); } }
带包的编译和运行: A:手动式 a:编写一个带包的java文件。 b:经过javac命令编译该java文件。 c:手动建立包名。 d:把b步骤的class文件放到c步骤的最底层包 e:回到和包根目录在同一目录的地方,而后运行 带包运行。 B:自动式 a:编写一个带包的java文件。 b:javac编译的时候带上-d便可 javac -d . HelloWorld.java c:回到和包根目录在同一目录的地方,而后运行 带包运行。
/* 修饰符: 权限修饰符:private,默认的,protected,public 状态修饰符:static,final 抽象修饰符:abstract 类: 权限修饰符:默认修饰符,public 状态修饰符:final 抽象修饰符:abstract 用的最多的就是:public 成员变量: 权限修饰符:private,默认的,protected,public 状态修饰符:static,final 用的最多的就是:private 构造方法: 权限修饰符:private,默认的,protected,public 用的最多的就是:public 成员方法: 权限修饰符:private,默认的,protected,public 状态修饰符:static,final 抽象修饰符:abstract 用的最多的就是:public 除此之外的组合规则: 成员变量:public static final 成员方法:public static public abstract public final */ //此处不容许使用修饰符private //此处不容许使用修饰符protected //此处不容许使用修饰符static public class Demo { //成员变量 private int x = 10; int y = 20; protected int z = 30; public int a = 40; public final int b = 50; public static int c = 60; public static final int d = 70; //此处不容许使用修饰符abstract //abstract int e = 80; //构造方法 private Demo(){} Demo(String name){} protected Demo(String name,int age) {} public Demo(String name,int age,String address) {} //此处不容许使用修饰符static //public static Demo(){} //此处不容许使用修饰符final //public final Demo() {} //此处不容许使用修饰符abstract //public abstract Demo(){} //成员方法 //static void show() {} //abstract void show(); //final void show(){} }
/* 成员内部类: 如何直接访问内部类的成员。 外部类名.内部类名 对象名 = 外部类对象.内部类对象; */ class Outer { private int num = 10; class Inner { public void show() { System.out.println(num); } } } class InnerClassDemo3 { public static void main(String[] args) { //需求:我要访问Inner类的show()方法 //Inner i = new Inner(); //i.show(); //格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象; Outer.Inner oi = new Outer().new Inner(); oi.show(); } }
/* 成员内部类的修饰符: private 为了保证数据的安全性 static 为了方便访问数据 注意:静态内部类访问的外部类数据必须用静态修饰。 案例:我有一我的(人有身体,身体内有心脏。) class Body { private class Heart { public void operator() { System.out.println("心脏搭桥"); } } public void method() { if(若是你是外科医生) { Heart h = new Heart(); h.operator(); } } } 按照咱们刚才的讲解,来使用一下 Body.Heart bh = new Body().new Heart(); bh.operator(); //加了private后,就不能被访问了,那么,怎么玩呢? Body b = new Body(); b.method(); */ class Outer { private int num = 10; private static int num2 = 100; //内部类用静态修饰是由于内部类能够看出是外部类的成员 public static class Inner { public void show() { //System.out.println(num); System.out.println(num2); } public static void show2() { //System.out.println(num); System.out.println(num2); } } } class InnerClassDemo4 { public static void main(String[] args) { //使用内部类 // 限定的新静态类 //Outer.Inner oi = new Outer().new Inner(); //oi.show(); //oi.show2(); //成员内部类被静态修饰后的访问方式是: //格式:外部类名.内部类名 对象名 = new 外部类名.内部类名(); Outer.Inner oi = new Outer.Inner(); oi.show(); oi.show2(); //show2()的另外一种调用方式 Outer.Inner.show2(); } }
/* 面试题: 要求请填空分别输出30,20,10。 注意: 1:内部类和外部类没有继承关系。 2:经过外部类名限定this对象 Outer.this */ class Outer { public int num = 10; class Inner { public int num = 20; public void show() { int num = 30; System.out.println(num); System.out.println(this.num); //System.out.println(new Outer().num); System.out.println(Outer.this.num); } } } class InnerClassTest { public static void main(String[] args) { Outer.Inner oi = new Outer().new Inner(); oi.show(); } }
/* 匿名内部类在开发中的使用 */ interface Person { public abstract void study(); } class PersonDemo { //接口名做为形式参数 //其实这里须要的不是接口,而是该接口的实现类的对象 public void method(Person p) { p.study(); } } //实现类 class Student implements Person { public void study() { System.out.println("好好学习,每天向上"); } } class InnerClassTest2 { public static void main(String[] args) { //测试 PersonDemo pd = new PersonDemo(); Person p = new Student(); pd.method(p); System.out.println("--------------------"); //匿名内部类在开发中的使用 //匿名内部类的本质是继承类或者实现了接口的子类匿名对象 pd.method(new Person(){ public void study() { System.out.println("好好学习,每天向上"); } }); } }
/* 匿名内部类面试题: 按照要求,补齐代码 interface Inter { void show(); } class Outer { //补齐代码 } class OuterDemo { public static void main(String[] args) { Outer.method().show(); } } 要求在控制台输出”HelloWorld” */ interface Inter { void show(); //public abstract } class Outer { //补齐代码 public static Inter method() { //子类对象 -- 子类匿名对象 return new Inter() { public void show() { System.out.println("HelloWorld"); } }; } } class OuterDemo { public static void main(String[] args) { Outer.method().show(); /* 1:Outer.method()能够看出method()应该是Outer中的一个静态方法。 2:Outer.method().show()能够看出method()方法的返回值是一个对象。 又因为接口Inter中有一个show()方法,因此我认为method()方法的返回值类型是一个接口。 */ } }