10.01 运动员和教练案例分析

教练和运动员案例:运动员分乒乓球运动员和篮球运动员,教练分乒乓球教练和篮球教练。为了出国交流,跟乒乓球相关的人员都需要学习英语。

分析:

10.02 运动员和教练案例实现

 //定义一个说英语的接口
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("篮球教练教如何运球和投篮");
}
}

10.03 运动员和教练案例测试

 //定义一个说英语的接口
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 Demo
{
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(); //没有该方法
}
}

运行结果:

王浩---33
乒乓球运动员吃大白菜,喝小米粥
人都是要睡觉的
乒乓球运动员学习如何发球和接球
乒乓球运动员说英语
----------------
姚明---34
篮球运动员吃牛肉,喝牛奶
人都是要睡觉的
篮球运动员学习如何运球和投篮

10.04 类名作为形式参数

形式参数和返回值问题

形式参数:基本类型、引用类型(类、抽象类、接口)

返回值类型:基本类型、引用类型(类、抽象类、接口)

例:

 class Student
{
public void study()
{
System.out.println("好好学习");
}
}
class StudentTest
{
//形式参数是一个类
public void method(Student s)
{
s.study();
}
}
class Demo
{
public static void main(String[] args)
{
StudentTest st = new StudentTest();
Student s = new Student();
//需要的是该类的对象
st.method(s);
}
}

运行结果:

好好学习

10.05 抽象类名作为形式参数

例:

 abstract class Person
{
public abstract void study();
} class Student extends Person
{
public void study()
{
System.out.println("好好学习");
}
}
class PersonTest
{
//形式参数是一个抽象类
public void method(Person p)
{
p.study();
}
}
class Demo
{
public static void main(String[] args)
{
PersonTest pt = new PersonTest();
Person p = new Student();
//需要该抽象类的子类对象
pt.method(p);
}
}

运行结果:

好好学习

10.06 接口名作为形式参数

例:

 interface Love
{
public abstract void love();
}
class Teacher implements Love
{
public void love()
{
System.out.println("老师爱学生");
}
}
class LoveTest
{
//形式参数是一个接口
public void method(Love l)
{
l.love();
}
}
class Demo
{
public static void main(String[] args)
{
LoveTest lt = new LoveTest();
Love l = new Teacher();
//需要该接口的实现类对象
lt.method(l);
}
}

运行结果:

老师爱学生

10.07 类名作为返回值类型

例:

 class Student
{
public void study()
{
System.out.println("好好学习");
}
}
class StudentTest
{
//返回值是一个类
public Student getStudent()
{
//真实返回的是该类的对象
return new Student();
}
}
class Demo
{
public static void main(String[] args)
{
StudentTest st = new StudentTest();
Student s = st.getStudent();
s.study();
}
}

10.08 抽象类名作为返回值类型

例:

 abstract class Person
{
public abstract void study();
}
class Student extends Person
{
public void study()
{
System.out.println("好好学习");
}
}
class PersonTest
{
//返回值是一个抽象类
public Person getPerson()
{
//真实返回的是抽象类的子类对象
return new Student();
}
}
class Demo
{
public static void main(String[] args)
{
PersonTest pt = new PersonTest();
Person p = pt.getPerson();
p.study();
}
}

10.09 接口名作为返回值类型

例:

 interface Love
{
public abstract void love();
}
class Teacher implements Love
{
public void love()
{
System.out.println("老师爱学生");
}
}
class LoveTest
{
//返回值是一个接口
public Love getLove()
{
//真实返回的是该接口的实现类对象
return new Teacher();
}
}
class Demo
{
public static void main(String[] args)
{
LoveTest lt = new LoveTest();
Love l = lt.getLove();
l.love();
}
}

10.10 链式编程

例:

 class Student
{
public void study()
{
System.out.println("好好学习");
}
}
class StudentTest
{
public Student getStudent()
{
return new Student();
}
}
class Demo
{
public static void main(String[] args)
{
//链式编程,每次调用方法完毕后返回的是一个对象
new StudentTest().getStudent().study();
}
}

10.11 package关键字的概述及作用

包的概述:其实就是文件夹

作用:对类进行分类管理

包的划分:

例:学生的增加,删除,修改,查询和老师的增加,删除,修改,查询

基本的划分:

按照功能分

cn.itcast.add(AddStudent,AddTeacher)

cn.itcast.delete(DeleteStudent,DeleteTeacher)

cn.itcast.update(UpdateStudent,UpdateTeacher)

cn.itcast.find(FindStudent,FindTeacher)       

按照模块分

cn.itcast.teacher(AddTeacher,DeleteTeacher,UpdateTeacher,FindTeacher)

cn.itcast.student(AddStudent,DeleteStudent,UpdateStudent,FindStudent)           

10.12 包的定义及注意事项

定义包的格式:package 包名; 多级包用.分开即可

注意事项:

1.package语句必须是程序的第一条可执行的代码

2.package语句在一个java文件中只能有一个

3.如果没有package,默认表示无包名

10.13 带包的类编译和运行

手动式

1:javac编译当前类文件

2:手动建立包对应的文件夹

3:把1步骤的class文件放到2步骤的最终文件夹下

4:通过java命令执行。

注意:需要带包名称执行

例:

 package cn.itcast;
class Demo
{
public static void main(String[] args)
{
System.out.println("hello world");
}
}

运行:

自动式

1:javac编译的时候带上-d即可

例:javac -d . HelloWorld.java (-d后面跟的是目录, .表示当前目录)

2:通过java命令执行。需要带包名称执行。

10.14 不同包下类之间的访问

例:

定义两个类:Demo,Test。

Demo:测试方法(main)

Test:求和方法(sum)

运行步骤如下:

 

10.15 import关键字的概述和使用

导包概述:不同包下的类之间的访问,每次使用不同包下的类的时候,都需要加包的全路径。比较麻烦。这个时候,java就提供了导包的功能。

导包格式:import 包名;

注意:这种方式导入是到类的名称。虽然可以最后写*,但是不建议。使用哪个类就导入哪个类。

例:

面试题:package,import,class有没有顺序关系?

有,package>import>class

package:只能有一个

import:可以有多个

class:可以有多个,建议只写一个

10.16 四种权限修饰符

10.17 类及其组成所使用的常见修饰符

权限修饰符:public、protected、默认的、private

状态修饰符:static、final

抽象修饰符:abstract

 

1.类:默认,public、final、abstract。其中使用public居多

2.成员变量:四种权限修饰符均可,final、static。其中使用private居多

3.构造方法:四种权限修饰符均可,其他不可以。其中使用public居多

4.成员方法:四种权限修饰符均可,fianl、static、abstract。其中使用public居多

 

10.18 内部类概述和访问特点

把类定义在其他类的内部,这个类就被称为内部类。

例:在类A中定义了一个类B,类B就是内部类。

内部类的访问特点:

内部类可以直接访问外部类的成员,包括私有。

外部类要访问内部类的成员,必须创建对象。

例:

 class Outer
{
private int num = 10;
//内部类
class Inner
{
public void show()
{
//内部类可以直接访问外部类的成员,包括私有
System.out.println("show run..."+num);
}
}
public void method()
{
//外部类要访问内部类的方法必须创建内部类的对象
Inner in = new Inner();
in.show();
}
}

10.19 内部类分类及成员内部类的使用

按照内部类在类中定义的位置不同,可以分为如下两种格式:

在成员位置称为成员内部类

在局部位置称为局部内部类

例:

 class Outer
{
//成员内部类
class Inner
{
}
public void method()
{
//局部内部类
class Inner
{
}
}
}

外界创建成员内部类对象的格式:

外部类名.内部类名对象名 = 外部类对象.内部类对象;

例:

 class Outer
{
private int num = 10;
//成员内部类
class Inner
{
public void show()
{
System.out.println(num);
}
}
}
class Demo
{
public static void main(String[] args)
{
//访问Inner类的show()方法
     //外部类名.内部类名 对象名 = 外部类对象.内部类对象;
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}

10.20 成员内部类的常见修饰符及应用

成员内部类的常见修饰符

1.private 为了保证数据的安全性

例:

 class Outer
{
//成员内部类,私有
private class Inner
{
public void show()
{
System.out.println("满足条件输出");
}
}
public void method(int num)
{
if(num > 0)
{
Inner i = new Inner();
i.show();
}
}
}
class Demo
{
public static void main(String[] args)
{
Outer o = new Outer();
o.method(-8);
}
}

上例中,只有当method方法传入的参数大于0时,才可以创建内部类的对象调用方法,否则不创建

2.static 为了让数据访问更方便

  • 被静态修饰的成员内部类只能访问外部类的静态成员
  • 内部类被静态修饰后的方法可以有静态方法也可以有非静态方法

例:

 class Outer
{
private static int num = 10;
//成员内部类,静态
public static class Inner
{
//静态方法
public static void show1()
{
System.out.println(num);
}
//非静态方法
public void show2()
{
System.out.println(num);
}
}
}
class Demo
{
public static void main(String[] args)
{
//成员内部类被静态修饰后的访问方式:
//外部类名.内部类名 对象名 = new 外部类名.内部类名();
Outer.Inner oi = new Outer.Inner();
oi.show1();
oi.show2(); //静态方法show1()的另一种调用方式
Outer.Inner.show1();
}
}

10.21 成员内部类的面试题

分别输出30、20、10

 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 Demo
{
public static void main(String[] args)
{
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}

10.22 局部内部类访问局部变量的问题

1.可以直接访问外部类的成员

2.在局部位置可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能

例:

 class Outer
{
private int num = 10;
public void method()
{
//局部内部类
class Inner
{
public void show()
{
//可以直接访问外部类的成员
System.out.println(num);
}
}
//在局部位置创建内部类对象
Inner i = new Inner();
//通过对象调用内部类方法
i.show();
}
}
class Demo
{
public static void main(String[] args)
{
Outer o = new Outer();
o.method();
}
}

局部内部类访问局部变量的注意事项:

例:

 class Outer
{
public void method()
{
//局部变量
final int num = 20;
//局部内部类
class Inner
{
public void show()
{
//局部内部类访问局部变量,该局部变量必须被声明为最终类型
System.out.println(num);
}
} Inner i = new Inner();
i.show();
}
}
class Demo
{
public static void main(String[] args)
{
Outer o = new Outer();
o.method();
}
}

因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从堆内存中消失,还要使用那个变量。为了让数据还能继续被使用,就用fianl修饰,这样,在堆内存里面存储的其实是一个常量值。

10.23 匿名内部类的格式和理解

匿名内部类就是内部类的简化写法。

前提:存在一个类或者接口,这里的类可以是具体类也可以是抽象类。

格式:new 类名或者接口名() {重写方法;}

本质:是一个继承了该类或者实现了该接口的子类匿名对象

例:

10.24 匿名内部类的方法调用

例:

 interface Inter
{
public abstract void show1();
public abstract void show2();
}
class Outer
{
public void method()
{
/* 一个方法的调用
new Inter()
{
public void show1()
{
System.out.println("show1");
}
}.show1();
*/
//两个方法的调用
Inter i = new Inter()
{
public void show1()
{
System.out.println("show1");
}
public void show2()
{
System.out.println("show2");
}
};
i.show1();
i.show2();
}
}
class Demo
{
public static void main(String[] args)
{
Outer o = new Outer();
o.method();
}
}

10.25 匿名内部类在开发中的应用

例:

 interface Person
{
public abstract void study();
}
class PersonDemo
{
public void method(Person p)
{
p.study();
}
}
class Demo
{
public static void main(String[] args)
{
PersonDemo pd = new PersonDemo();
pd.method(new Person()
{
public void study()
{
System.out.println("好好学习");
}
});
}
}

当函数参数是接口类型时,而且接口中的方法不超过三个,可以用匿名内部类作为实际参数进行传递

10.26 匿名内部类的面试题

按照要求,补齐代码,要求在控制台输出”HelloWorld”

 interface Inter
{
void show();
}
class Outer
{
//补齐代码
}
class Demo
{
public static void main(String[] args)
{
Outer.method().show();
}
}

补齐代码:

 /*
分析:
1:Outer.method()可以看出method()是Outer中的一个静态方法
2:Outer.method().show()可以看出method()方法的返回值是一个对象。
又由于接口Inter中有一个show()方法,所以method()方法的返回值类型是一个接口。
*/
interface Inter
{
void show();
}
class Outer
{
//补齐代码
public static Inter method()
{
return new Inter()
{
public void show()
{
System.out.println("helloworld");
}
};
}
}
class Demo
{
public static void main(String[] args)
{
Outer.method().show();
}
}

JavaSE学习总结第10天_面向对象5的更多相关文章

  1. JavaSE学习总结第09天_面向对象4

      09.01 final关键字引入 例: class Fu { public final void show() { System.out.println("访问底层资源"); ...

  2. JavaSE学习总结第07天_面向对象2

      07.01 成员变量和局部变量的区别 1.在类中的位置不同 成员变量    类中方法外 局部变量    方法内或者方法声明上 2.在内存中的位置不同 成员变量   堆内存 局部变量   栈内存 3 ...

  3. JavaSE学习总结第08天_面向对象3

      08.01 工具类中使用静态 例: class ArrayTool { //将构造方法私有,外界不能创建该类的对象 private ArrayTool(){} //遍历数组 public stat ...

  4. javaSE学习笔记(10)---List、Set

    javaSE学习笔记(10)---List.Set 1.数据存储的数据结构 常见的数据结构 数据存储的常用结构有:栈.队列.数组.链表和红黑树. 1.栈 栈:stack,又称堆栈,它是运算受限的线性表 ...

  5. JavaSE学习总结第27天_反射 & 设计模式 & JDK5、7、8新特性

      27.01  反射_类的加载概述和加载时机 类的加载:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载:就是指将class文件读 ...

  6. JavaSE学习总结第24天_多线程2

      24.01  JDK5之后的Lock锁的概述和使用 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK ...

  7. JavaSE学习总结第11天_开发工具 & API常用对象1

      11.01 常见开发工具介绍 1:操作系统自带的记事本软件 2:高级记事本软件例:Editplus,Notepad++,UltraEdit 3:集成开发环境 IDE(Integrated Deve ...

  8. JavaSE学习总结第23天_多线程1

      23.01  多线程程序的引入 如果一个程序只有一个执行流程,所以这样的程序就是单线程程序. 如果一个程序有多条执行流程,那么,该程序就是多线程程序. 23.02  进程概述及多进程的意义 要想说 ...

  9. JavaSE学习总结(四)——Java面向对象十分钟入门

    面向对象编程(Object Oriented Programming,OOP)是一种计算机模拟人类的自然思维方式的编程架构技术,解决了传统结构化开发方法中客观世界描述工具与软件结构的不一致性问题.Ja ...

随机推荐

  1. 改变QTreeView项高的方法(改变Delegate行高,或者::data取数据的时候,根据Qt::SizeHintRole进行判断)

    很久之前写过一篇关于QTreeView快速显示超过千万条数据项的方法,如果说那篇文章讲的是QTreeView的内功的话,今天这篇是讲QTreeView的外功,有时我们想改变视图的数据项的行高,那怎么办 ...

  2. HDU 1076 An Easy Task

    题解:枚举即可…… #include <cstdio> int main(){ int now,y,n,T,count; scanf("%d",&T); whi ...

  3. 《windows程序设计》学习_3.4:实现雷区翻转

    #include<windows.h> #include "resource.h" LRESULT CALLBACK WndProc (HWND, UINT, WPAR ...

  4. CSS 常用自定义样式

    目录: 1. 文本单行显示,并对超出部分截断以省略号代替: 2.列布局或栅格布局:比如:左侧固定宽度,右侧占满剩下的宽度: 章节: 1. 文本单行显示,并对超出部分截断以省略号代替:参见以下代码: d ...

  5. 如何注册Uber司机,加入uber(全国版最新最详细注册流程)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  6. 利用宏定义令iOS项目当中的NSLog不执行

    今天在博客园主页看到一篇帖子,提到NSLog消耗运行时性能: http://www.cnblogs.com/sunnyxx/p/3680623.html 解决方案如下,在​Prefix.pch文件当中 ...

  7. [置顶] jsp中c标签的使用

    jsp中c标签的使用 核心标签库 它是JSTL中的核心库,为日常任务提供通用支持,如显示和设置变量.重复使用一组项目.测试条件和其他操作(如导入和重定向Web内容).Core标签按功能可分为4种类型: ...

  8. SMACSS:一个关于CSS的最佳实践-1.Overview

    什么是SMACSS? SMACSS(发音"smacks"),全称Scalable and Modular Architecture for CSS.顾名思义,SMACSS是一个可扩 ...

  9. sql update 触发器 可获得被update的行的信息

    类型:转载   sql update 触发器 可获得被update的行的信息,需要的朋友可以参考下. 复制代码 代码如下: create trigger TgName on tb for update ...

  10. java动手动脑课后思考题

    public class SquareInt { public static void main(String[] args) { int result; ; x <= ; x++) { res ...