10.21作业(Java)
来源:互联网 发布:知乎日报知乎好问题 编辑:程序博客网 时间:2024/06/13 23:12
d08
1:教练和运动员案例(学生分析然后讲解)
乒乓球运动员和篮球运动员。
乒乓球教练和篮球教练。
为了出国交流,跟乒乓球相关的人员都需要学习英语。
请用所学知识:
分析,这个案例中有哪些抽象类,哪些接口,哪些具体类
//接口
publicinterface LearnEnglish {
publicabstractvoidLearnEnglish();
}
//运动员的抽象类
publicabstractclass Athletes {
//成员变量
private Stringname;
privateintage;
public Athletes(){
super();
}
public Athletes(Stringname,intage) {
super();
this.name=name;
this.age=age;
}
//setXXX,getXXX
public String getName() {
returnthis.name;
}
publicvoid setName(Stringname) {
this.name=name;
}
publicint getAge() {
returnthis.age;
}
publicvoid setAge(intage) {
this.age=age;
}
//抽象功能
publicabstractvoid train();
publicabstractvoid competition();
//非抽象功能
publicvoid sleep() {
System.out.println("训练完就睡觉");
}
}
//子类
publicclass Paddlerextends Athletes {
public Paddler() {
super();
}
public Paddler(Stringname ,intage) {
super(name,age);
}
@Override
publicvoid train() {
System.out.println("乒乓球训练");
}
publicvoid competition() {
System.out.println("乒乓球比赛");
}
}
//子实现类
publicclass LearnEnglishHoopmanextends Hoopmanimplements LearnEnglish {
public LearnEnglishHoopman() {
super();
}
public LearnEnglishHoopman(Stringname,intage) {
super(name,age);
}
@Override
publicvoid LearnEnglish() {
System.out.println("我要学英语");
}
}
//子实现类
publicclass LearnEnglishPaddlerextends Paddlerimplements LearnEnglish {
public LearnEnglishPaddler() {
super();
}
public LearnEnglishPaddler(Stringname,intage) {
super(name,age);
}
@Override
publicvoid LearnEnglish() {
System.out.println("我要学英语");
}
}
//测试类
publicclass InterfaceTest3 {
publicstaticvoid main(String[]args) {
LearnEnglishHoopmanhp =new LearnEnglishHoopman();
hp.LearnEnglish();
hp.setAge(25);
hp.setName("姚明");
hp.competition();
hp.sleep();
hp.train();
System.out.println(hp.getAge()+"----"+hp.getName());
}
}
抽象类:Athletes
接口:LearnEnglish
具体类: Paddler LearnEnglishHoopman LearnEnglishPaddler InterfaceTest3
2.final关键字
a.final修饰类
final如果修饰一个类,该类不能被继承.
b.final修饰类的成员变量
该成员变量的值不可修改。
3. 问题: 那么什么时候初始化这个值?
在对象创建之前都可以.
a.构造代码块中可以进行初始化
b.构造方法中可以进行初始化
c.定义成员变量的时候,可以直接进行初始化.
注意一点: 这三种方式同时只能用一种。
4:多态是什么,前提是什么?
多态:一个事物在不同时刻体现出来的不同状态
对于多态的三个前提条件
1)条件1:必须有继承关系(如果没有继承关系,谈不上多态!)
2)条件2:必须有方法重写
子类出现了父类一样的 方法声明
3)有父类引用指向子类对象:向上转型
Fu f = new Zi() ;
多态的三个条缺一不可!
5:多态中成员访问的特点?
成员变量:
编译看左边,运行看左边
成员方法(非静态的成员方法):
编译看左,运行看右;由于存在方法重写,所以就运行最终的就是子类的成员方法
静态成员方法:(静态方法算不上方法重写,静态直接跟类有关系!)
编译看左,运行看左
构造方法:还是对象进行初始化,由于是一种继承关系,还是分层初始化!
6:多态的好处及弊端?如何解决多态的弊端?
多态的好处(特点):
1)提高代码的维护性(由继承保证)
2)提高代码的扩展性(由多态保证)
多态的弊端:
不能访问子类的特有功能
解决方案:
1)创建子类的具体对象,来访问自己的特有功能;虽然可以解决多态的弊端,但是从内存角度考虑,需要创建子类对象,那么必须在堆内存开辟空间,耗费内存,浪费空间!
2)既然多态的第三个前提条件:父类引用指向子类对象,那么可不可以将子类
可以的:向下转型:将父类的引用强制转换为子类的引用:前提必须有父类的引用存在;
向下转型必须依赖于向上转型!
7:什么是向上转型?什么是向下转型?
向上转型:父类引用指向子类对象
Fu f = new Zi();
向下转型:子类引用指向父类对象
Zi z = (Zi)f;
8. 抽象类概述及其特点?
当一个类中如果有抽象功能(抽象方法)的时候,那么这个类一定要定义为抽象类!
抽象类不能实例化:抽象类不能创建对象
9:抽象类成员特点?
成员变量:
可以是变量也可以是自定义常量
构造方法:
抽象类可以有构造方法:包括有参构造和无参构造
作用:通过抽象类多态的形式:让子类进行数据的初始化
成员方法:
可以有抽象方法,也可以有非抽象方法
10:抽象类的小问题
A:一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
B:abstract不能和哪些关键字共存
可以
不能让其创建对象!
abstract不能和哪些关键字共同使用?
private 和abstract不能共同使用
final和abstract不能共同使用
static和abstract不能共同使用
11:接口的概述及其特点?
接口体现的是一种:扩展功能: 比如:猫可以跳高(并不是所有的猫都具有跳高功能)
接口的特点:不能实例化(不能直接创建对象)
12:接口的成员特点?
成员变量:
只能是常量:存下默认修饰符:publicstatic final (永远建议自己给出默认修饰符)
构造方法:
接口是没有构造方法的
成员方法:
接口中的成员方法默认修饰符:publicabstract(永远建议自己给出默认修饰符)
13:抽象类和接口的区别?
1)成员的区别:
成员变量:
抽象类:成员变量可以是常量,也可以是变量
接口:成员变量只能是一常量:存在默认修饰符:publicstatic final
构造方法:
抽象类:可以有无参构造,有参构造方法
作用:通过子类进行数据初始化(通过子类创建对象)
接口:没有构造方法的
成员方法的区别:
抽象类:可以有抽象方法,也可以有非抽象方法
接口:只能是抽象方法:存在默认修饰符:publicabstract
2)关系的区别:
类与类的关系:
继承关系:extends,java中只支持单继承,不支持多继承,但是可以多层继承!
类与接口的关系:
实现关系:implements,并且,一个类在继承另一个类的同时,可以实现多个接口
(class子实现类名 enxtends Object implements 接口名1,接口名2...)
接口与接口的关系
继承关系:extends,可以支持单继承,也可以多继承!
3)设计理念的区别:
抽象类:
体现的是一种"isa"的关系,存在继承关系!(抽象类多态)
接口:
体现的是一种"likea"的关系,由于接口的一种扩展功能
D09
1. 内部类的概述及访问特点
在一个类中定义另一个类,那么把这种情况:内部类
内部类是直接可以访问外部类的成员,包括私有外部类想要访问内部类的成员,必须通过创建内部类的对象访问该内部类的成员
2.内部类的分类
成员内部类:在外部类的成员位置
局部内部类:在外部了的局部位置定义的这个类
3.匿名内部类的格式和应用及面试题
匿名内部类
是内部类的简化版格式
前提条件:
必须存在一个接口或者是一个类(可以是具体类,也可以是一个抽象类)
书写的格式:
new 接口名或者类名(){
方法重写;
}
匿名内部类的实质:
继承了该类(抽象类)或者是实现了该接口的子类对象!
匿名内部类面试题:
按照要求,补齐代码
interfaceInter { void show(); }
classOuter { //补齐代码 }
classOuterDemo {
publicstatic void main(String[] args) {
Outer.method().show();
}
}
要求在控制台输出”HelloWorld”
//接口
interface Inter2{
// voidshow() ;
publicabstract void show() ;
}
class Outer8{
//补齐代码
publicstatic Inter2 method(){ //返回值是一个接口
returnnew Inter2(){
@Override
publicvoid show() {
System.out.println("helloworld");
}
};
}
}
//测试类
public class InnerClassTest2 {
publicstatic void main(String[] args) {
Outer8.method().show();
//当前method()能直接被类名调用---->method()方法是一个静态方法 static
//Outer8.method().show()---->Outer8.method()返回的是一个对象,拿对象调用show()方法
//由于接口只有一个show()方法,最终要去重写show()方法
}
}
- 10.21作业(Java)
- JAVA作业
- Java作业
- Java作业
- java作业
- java作业
- JAVA作业
- java作业
- java作业
- Java作业。。。
- java作业。。。
- Java作业
- java作业
- java作业
- java作业
- java作业
- java作业
- java作业
- 序列化与反序列化
- codeforces 572A Arrays
- python mysqldb 包编译后测试 警告
- 保存内容到本地(下载到本地)
- CURLE_WRITE_ERROR
- 10.21作业(Java)
- 【bzoj4260】Codechef REBXOR
- SpringBoot 中文手册 --Part IV --28 安全
- python3 time模块解释
- 测试
- 为何不用stop()和如何终止线程
- C# partial
- TomCat与Jvm关系
- c++primer第六章课后习题