教材学习内容总结
1.接口
eg:
interface Printable { //interface是关键字
public static final int MAX = 100; //public static final可省略,因为所有常量的访问权限一定是public,而且是static常量。
public abstract void add ();//public abstract可省略,因为所有的抽象方法都是public(不然怎么重写)。
public abstract float sum (float x,float y);//抽象方法
}
2.接口的实现
eg:
class A implements Printable,Addable
//类A实现Printable,Addable接口,implements为关键字,接口与接口间用“,”间隔。
如果一个非抽象类实现了某个接口,那么这个类必须重写这个接口中的所有方法。
接口中的方法一定是public abstract 方法,所以重写时不仅要去掉abstract 修饰符,给出方法体,而且方法的访问权限一定要用public 修饰。
如果一个类声明实现一个接口,但没有重写接口中的所有方法,那么这个类必须是抽象类(抽象类既可以重写接口中的方法,也可以直接拥有接口中的方法)。
2.1细节
类实现了接口后,可以在类体中使用该接口的常量。
interface前加了public的接口可以被任何类实现。如果没有就属于友好接口,可以被包内的类实现。
父类已实现了的接口,子类无需显式用implements声明。
接口也可以被继承。用关键字extends声明。子接口将继承父接口的全部方法和常量。
3.接口回调
接口和类一样,也是一种数据类型。用接口声明的变量称作接口变量。
3.1接口回调
把实现某一接口的类创建的对象的引用赋值给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口方法。实际上,当接口变量调用被类实现的接口方法时,就是通知相应的对象调用这个方法。
注:接口无法调用类中的其他的非接口的方法。
eg:
interface ShowMessage {
void 显示商标(String s);
}
class TV implements ShowMessage {
public void 显示商标(String s) {
System.out.println(s);
}
}
class PC implements ShowMessage {
public void 显示商标(String s) {
System.out.println(s);
}
}
public class Example6_2 {
public static void main(String args[]) {
ShowMessage sm; //声明接口变量
sm=new TV(); //接口变量中存放对象的引用
sm.显示商标("长城牌电视机"); //接口回调。
sm=new PC(); //接口变量中存放对象的引用
sm.显示商标("联想奔月5008PC机"); //接口回调
}
}
4、abstract类与接口的比较
abstract类与接口 都可以有abstract方法;
接口中只可以有常量,不能有变量,而abstract类中既可以有常量也可以有变量;
abstract类中也可以有非abstract类方法,接口不可以。
设计程序时应该根据具体分析来确定使用抽象类还是接口。
abstract类除了提供重要的需要子类重写的abstract方法外,也提供了子类可以继承的变量和非abstract方法。如果某个问题需要使用继承才能更好的解决问题(比如子类除了需要重写父类的abstract方法,还需要从父类继承一些变量或者重要的非abstract方法),就可以考虑使用abstract类。若某个问题不需要继承,只是需要若干个类给出某些abstract方法的实现细节,就可以考虑接口。(需要继承用abstract类,不需要继承用接口)
5、接口参数
如果一个方法的参数是接口类型,我们就可以将任何实现该接口的类的实例的引用传递给该接口参数,那么该接口参数就可以回调类实现的接口方法。
interface SpeakHello {
void speakHello();
}
class Chinese implements SpeakHello {
public void speakHello() {
System.out.println("中国人习惯问候语:你好,吃饭了吗? ");
}
}
class English implements SpeakHello {
public void speakHello() {
System.out.println("英国人习惯问候语:你好,天气不错 ");
}
}
class KindHello {
public void lookHello(SpeakHello hello) { //接口类型参数
hello.speakHello(); //接口回调
}
}
public class Example6_5 {
public static void main(String args[]) {
KindHello kindHello=new KindHello();
kindHello.lookHello(new Chinese());
kindHello.lookHello(new English());
}
}
6、面向接口编程
6.1理解:
和面向对象编程相似,面向接口编程主要编写接口表达功能,用实现类实现功能,可以通过在接口中声明若干个abstract方法,表面这些方法的重要性,方法体的内容细节有实现接口的类去完成。使用接口进行程序设计的核心思想是使用接口回调,即接口变量存放实现该接口的类的对象的引用,从而接口变量就可以回调类实现的接口方法。
6.2优点:
1 降低程序的耦合性;
2 易于程序的扩展;
3 有利于程序的维护;
6.3实例
public interface Advertisement { //接口
public void showAdvertisement();
public String getCorpName();
}
public class AdvertisementBoard { //负责创建广告牌
public void show(Advertisement adver) {
System.out.println(adver.getCorpName()+"的广告词如下:");
adver.showAdvertisement(); //接口回调
}
}
public class BlackLandCorp implements Advertisement {
public void showAdvertisement(){
System.out.println("**************");
System.out.printf("劳动是爹\n土地是妈\n");
System.out.println("**************");
}
public String getCorpName() {
return "黑土集团" ;
}
}
public class WhiteCloudCorp implements Advertisement { //PhilipsCorp实现Avertisement接口
public void showAdvertisement(){
System.out.println("@@@@@@@@@@@@@@@@@@@@@@");
System.out.printf("飞机中的战斗机,哎yes!\n");
System.out.println("@@@@@@@@@@@@@@@@@@@@@@");
}
public String getCorpName() {
return "白云有限公司" ;
}
}
public class Example6_6 {
public static void main(String args[]) {
AdvertisementBoard board = new AdvertisementBoard();
board.show(new BlackLandCorp());
board.show(new WhiteCloudCorp());
}
}
7.内部类
定义:在一个类中定义的另一个类被称作内部类,包含内部类的类叫做外嵌类。
关系:内部类的外嵌类的成员变量在内部类中仍然有效,内部类的方法也可以调用外嵌类的方法;
内部类的类体不可以声明类变量和类方法。外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员;
内部类仅供他的外嵌类使用,其他类不可以用某个类中的内部类声明对象。
8.匿名类
没有显示一个类的子类,直接使用一个类的子类的类体创建一个子类对象,此类体被认为是一个子类去掉类声明后的类体,称为匿名类。匿名类就是一个子类,由于无名可用,所以不能用匿名类声明对象,但可以直接使用匿名类创建一个对象。
与子类有关的匿名类:
new Bank () {
匿名类的类体
};
与接口有关的匿名类:
new Computable () {
实现接口的匿名类的类体
};
9.异常类:
try-catch语句:
try {
包含可能发生异常的语句
}
catch (ExceptionSubClass1 e){
...
}
catch (ExceptionSubClass2 e){
...
}
//各个catch参数中的异常类都是Exception 的某个子类,如java.io.IOException,NumberFormatException,...
//也可以扩展Execption类定义自己的异常类
断言语句:
断言语句一般用于程序不准备通过捕获异常来处理的错误
格式:
assert booleanExpression;
assert booleanExpression:messageException;
eg :
assert number >= 0;//如果表达式的值为true,程序继续执行,否则立即结束执行;
assert booleanExpression:messageException;//当booleanExpression的值为true时,程序从断言语句处继续执行;值为false时,程序从断言处停止执行,并输出messageException表达式的值;
启用断言:
java -ea mainClass
小结:
(1)接口的接口体中只能有常量和abstract方法;
(2)和类一样,接口也是Java中一种重要的引用型数据类型,接口变量就可以调用类实现的接口方法,这一过程被称为接口回调;
(3)当接口变量中存放了实现接口的类的对象的引用后,接口变量就可以调用类实现的接口方法,这一过程被称为接口回调;
(4)和子类体现多态类似,由接口产生的多态就是指不同的类在实现同一个接口时可能具有不同的实现方式;
(5)在使用多态设计程序时,要熟练使用接口回调技术以及面向接口编程的思想,以便体现程序设计所提倡的“开-闭原则”;
(6)Java支持在一个类中声明另一个类,这样的类称作内部类,包含内部类的类称作内部类的外嵌类;
(7)和某类有关的匿名类就是该类的一个子类,该子类没有明显地用类声明来定义,所以称匿名类;和某接口有关的匿名类就是实现该接口的一个类,该子类没有明显地用雷胜明来定义,所以称匿名类。
教材学习中的问题与解决过程
无
代码调试中的问题与解决过程
无
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第七周 | 100/1017 | 1/6 | 8/56 | 接口的使用 |
第六周 | 325/917 | 1/5 | 10/48 | 抽象与继承 |
第五周 | 443/592 | 1/4 | 16/38 | 类的用法 |
第四周 | 96/149 | 1/3 | 8/22 | 基本语句的复习 |
第二周 | 35/53 | 1/2 | 6/14 | 数据类型应用 |
第一周 | 18/18 | 1/1 | 8/8 | eclipse的使用 |