第一:
使用abstract修饰的class是抽象类
抽象类不可以创建object
抽象类可以有construction method
抽象类中,可以包括:1.member variable
2.member method
3.static method
4.construction method
5.final method(final修饰的method,只
可以被子类调用,不可以
被子类重写)
- 使用abstract方法修饰的method是抽象方法。
- 抽象方法没有method body,只能以 ; 结尾。
- 一个class,只要用abstract method,就一定是abstract class
- 当然,abstract class 可以包含0个或多个abstract method
subclass必须实现superclass的abstract method,否则就报错(注:if subclass want to be a abstract class ,it can not override the superclass’abstract method.)
- 通过抽象类,可以避免子类设计的随意性。通过抽象类, 我们就可以做到严格限制子类的设计,使子类之间更加通 用。(程序的可扩展和可维护性) 什么情况下使用抽象类?父类的名称比较抽象,创建对象无 意义。
第二:
2.接口详解
如果一个类中所有的方法均为 abstract 方法,那么这个类就可以声明为接口
public abstract class MyClass {
public abstract void show();
public abstract String fun();
public abstract int [] method();
可以改为如下代码
public interface MyInterface {
void show();
String fun();
int [] method();
}
i注:nterface中,不允许定义construction method
2.2 接口的定义 使用 interface 修饰,是一种数据类型,引用数据类型
接口的定义:
public interface MyInterface { void show();
}
接口中可以包含什么?
(1) 抽象方法 public abstract 方法
(2) 非抽象方法
/**JDK1.8新特性 ,interface中,可以包含非抽象方法,但是定义非抽象方法前面必须有default modifier*/
public default void method2(){
}
(3) interface中定义的属性必须由public static final 这三个modifier 修饰,public static final 可以省略不写,eclipse会自动补齐。但是我们要知道,interface中的member variable是什么type的,这样就可以避免一些mistakes。
public interface MyInterface
{
String name="张三";
public static final String name2="张三";
}
接口中可不可以包含构造方法吗?
不允许,因为接口不是类
接口与类的关系?
(1) 类去实现接口中的抽象方法,实现关系 ,implements
public class InterfaceImpl implements MyInterface
{
//实现接口中的所有抽象方法
}
(2) 一个类存在继承关系,又存在实现关系?extends 前还是implements 在前?
继承 :父子关系 ——亲爹
实现 :实现关系——干爹
So,extends 在前,implements 在后
public class Stuent extends Person implements Play
{
}
(3) 如果父类与接口中有完全相同的方法(一模一样),子类 /实现类所实现的方法是父类的?接口的?
父类优先于接口,子类实现的是父类中的方法
(4) 如果父类中与接口中有同名方法,对子类/实现类有什 么要求呢?
如果父类与接口中的方法的method-name相同的话,在子类/实现类中必须构成构成method的overload。
Interface的modifier:abstract(默认不写)
interface中属性的修饰符:public static final
interface方法的修饰符:public abstract(默认不写)
第三:
3.接口的特征和使用接口的意义
3.1 接口的特征
1) 接口的传递性
package com.bjsxt.interfacepro;
public interface InterfaceA { public void show();
} interface InterfaceB extends InterfaceA{
} interface InterfaceC extends InterfaceB{
} class Impl implements InterfaceC{
@Override
public void show()
{
// TODO Auto-generated method stub
}
}
2) 接口的继承性 (interface可以多继承)
package com.bjsxt.interfacepro;
public interface InterfaceA { public void show();
} interface InterfaceB {
} interface InterfaceC extends InterfaceB,InterfaceA{
}
class Impl implements InterfaceC
{
@Override
public void show() { // TODO Auto-generated method stub
}
}
3.2 使用接口的意义: 可以实现设计和实现的分离,抽象出 N 多不同类的共同点。
举例:飞机,鸟,球,导弹,宇宙飞船......
***extend membership 要满足 is –a 关系
eg:三角形 is a 几何图形
鸟isa球? 不成立
***interface membership要满足 has–a关系
eg:手机has a 拍照的功能
飞机 has a 飞行的能力
鸟 has a 飞行的能力
interface体现的是一种能力 ,所以它比abstract class 更加抽象。
package com.bjsxt.interfacedemo;
public interface Fly {
public void flying();//飞行的能力
}
class AirPlane implements Fly
{
@Override
public void flying() { System.out.println("飞机在祖国的蓝天上自由飞
翔..........."); }
} class Bird implements Fly{
@Override
public void flying() { System.out.println("小鸟唱着动听的歌,在天空
}
package com.bjsxt.interfacedemo;
public class Test {
public static void main(String[] args)
{
//接口类型(引用数据类型)指向实现类的对象
Fly airPlane=new AirPlane();
Fly bird =new Bird();
Fly football=new FootBall();
//调用相同的方法
airPlane.flying();
bird.flying();
football.flying();
//运行结果,不相同
}
}
总结:使用接口实现多态的步骤
(1) 编写接口
(2) 实现类实现接口中的方法
(3) 接口(类型) new 实现类对象
我们以后要做到面向接口的编程 !
第四:
4.内部类详解
4.1 什么是内部类?
将一个类定义在另一个类的内部,该类就称为内部类
4.2 类中定义的内部类特点
- 1) 内部类作为外部类的成员,可以直接访问外部类的成员 (包括 private 成员),反之则不行。
(注:当innerclass与outerclass有相同的属性时,在访问outerclass的属性,要加上outerclass_name.this.field_name)
- 2) 内部类做为外部类成员,可声明为 private、默认、protected 或 public。
- 3) 内部类成员只有在内部类的范围之内是有效的。
- 4) 用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的 private 还要小的访问权限。
内部类的优缺点:
优点:内部类可以直接访问外部类的私有属性
缺点:破坏了类的结构
4.2 内部类的分类
1) 成员内部类
内部类相当于外部类的成员
2) 静态内部类
***不允许访问outerclass的非static method
***如果innerclass的method是static的,那么这个innerclass也 应该是static的。
***创建innerclass的object:
new outerclass_name.innerclass_name
3) 方法中的内部类
只能在方法中使用,相当于方法中的局部变量
JDK1.8 新特性
a) JDK1.8 之前方法中的内部类要访问外部类的局部变 量,必须加上 final 关键字 (常量)
b) JDK1.8开始,在访问外部类的局部变量时,则可以不加 final 关键字
4) 匿名内部类 (存在继承或实现关系)
- a) 可以实现一个接口,或者继承一个父类
- b) 只能实现一个接口
- c) 适合创建那种只需要一次使用的类,不能重复使用。 比较常见的是在图形界面编程 GUI 里用得到。
第五:
5.String 类常用方法_API 文档阅读
5.1String 类的定义
String 是不可变字符序列
(因为String类相当于char类型的array,而我们知道,数组一旦被声明,数组的length就是固定的了。而且,value的array还使用了final进行修饰。)
5.2String 类的常用方法
- 1) char charAt(int index)返回字符串中第 index 个字符。
- 2) boolean equalsIgnoreCase(String other) 如果字符串与other 相等(忽略大小写),则返回 true
- 3) int indexOf(String str) lastIndexOf() 查找指定字符串 出现的位置
- 4) int length()返回字符串的长度。
5) String replace(char oldChar,char newChar)返回一个新串,它是通过用 newChar 替换此字符串中出现的所有oldChar 而生成的 所以输出oldchar时,oldchar是不变的。
- 6) boolean startsWith(String prefix)如果字符串以 prefix 开始, 则返回 true
- 7) boolean endsWith(String prefix) 如果字符串以 prefix 结 尾,则返回 true
- 8) String substring(int beginIndex),
String substring(int beginIndex,int endIndex)返回一个新字符 串,该串包含从原始字符串 beginIndex 到串尾或 endIndex-1 的所有字符 9) String toLowerCase()返回一个新字符串,该串将原始字符串中的所有大写字母改成小写字母
*10) String toUpperCase()返回一个新字符串,该串将原始字符串中的所有小写字母改成大写字母
*11) String trim() 返回一个新字符串,该串删除了原始字符串头部和尾部的空格 ,但是原始字符串中间如果包含空格的话是不去的。
(但凡返回新字符串,老字符串都不变。)
第六:
6.String 类和常量池
6.1String 类详解
String 类的定义
String 类常用的构造方法
6.2 常量池 用于存储在编译期确定,并被保存在已编译的字节码文件
中的一些数据,包括 final 修饰变量及字符串变量,和符号引 用量。
在等号右侧,满足这两个条件时,会在stack中,开辟空间,会有地址。(stack中的address是不连续的)
第七:
7.字符串相等的判断
7.1“==” 比较两个字符串内存地址是否相等
7.2 equals(Object obj) 用于比较两个字符串对象的内容是否相等
(注:string class override object class’s equals method.)
第八:
8.设计模式_回调的实现_模板方法模式
8.1 应用场景 客户到银行办理业务
(1) 取号排队 (2) 办理具体现金/转账/企业/个人/理财业务 (3) 给银行工作人员评分 8.2 模板方法模式介绍
它定义了一个操作中的算法骨架,将某些步骤延迟到子类 中实现。这样,新的子类可以在不改变一个算法结构的前 提下重新定义该算法的某些特定步骤。
8.3 核心 处理某个流程的代码已经都具备,但是其中某个节点的代
码暂时不能确定。即:处理步骤在父类中定义好,具体实现
延迟到子类中定义
8.4 案例代码
1/3
8.5 方法回调(钩子方法) Don’t call me ,we’ll call you back 找工作的人把简历投递到 XX 公司,所能做的就是等待,
整个过程由公司控制,找工作的人只能等待(公司打电话通 知面试......)
在软件开发中,我们可以将 call 翻译为调用,子类(找工 作的人)不能调用父类(XX 公司),而是通过父类调用子类。 这些调用步骤已经在父类中写好了,完全由父类控制整个过 程。
8.6 什么时候用到模板方法模式
实现一个算法时,整体步骤很固定,但是,某些部分易变,
2/3
易变部分可以抽象成方法,供子类实现
3/3