JAVA_SE复习(OOP1)
面向对象编程(一)
一、继承
1. 在类图表示中,使用一个分为三块的矩形表示一个类。矩形的第一块表示类名,第二块描述这个类的属性及属性的数据类型,第三块描述这个类的操作,也就是方法以及返回类型。
2. 访问控制
修饰符 类自身 同包内 子类 所有其他类
private Yes
default Yes Yes
protected Yes Yes Yes
public Yes Yes Yes Yes
3. 覆盖方法的注意点:
方法覆盖必须保证方法名、返回类型、参数列表都必须相同。另外,子类中的覆盖方法的可访问范围不能比其在父类中被覆盖的方法的访问范围小
4. 方法的重载必须注意:
Ø 方法名必须相同
如果方法名都不同,重载方法就根本无从谈起。
Ø 参数列表必须不同(参数的类型或者个数不同即可)
调用语句的参数列表之间的差别必须足够清晰。例如println(inti) println(int k)就完全不是重载,而是重复了,虽然参数名称不同,但参数列表的类型是相同的。
返回类型可以不同,也可以相同
5. 可变参数的方法:
public double avg(int... nums){}
6. 调用父类构造器:
注意:a.super()或this()调用必须放在构造器的第一行。然而,super 和this 调用不能同时显式存在在同一个构造器内,如果显式调用了super,就不能再写this 调用;同样有了this 调用就不能显示调用super。
b.不能继承构造器。尽管子类从父类集成了所有方法和变量,但它不能继承构造器。一个类只有两种方法获得构造器:编写构造器或者由于没有编写任何构造器而获得一个默认构造器。子类只能调用父类构造器。
7. 构造和初始化对象的完整过程:
对象初始化是一个相当复杂的过程。首先,为整个对象分配内存和为属性赋默认初始值。(静态变量优先于普通变量)然后,调用顶层构造器,并且按照如下步骤递归继承树:
1、绑定构造器参数
2、如果显式调用this(),递归调用,然后跳至第5 步
3、递归调用隐式或显式的super(…)(Object 除外,因为Object 没有父类,Object 是所有类的父类,将在下一节作详细介绍)。
4、执行显式的实例变量初始化。
5、执行当前构造器的构造体。
例:构造new Manager(1, “Burns”, 10000, 8000)的步骤
1. 基本初始化
1.1为整个Manager对象分配内存
1.2将所有属性初始化为默认初始值
2. 调用构造器:Manager(int id, String name, double salary, double bonus)
2.1绑定构造器参数 id=1, name=“Burns”, salary=10000, bonus=8000
2.2没有显式的this()调用
2.3调用 Employee(int id, String name, double salary)的super(id, name, salary)
2.3.1 绑定构造器参数 id=1, name=“Burns”, salary=10000
2.3.2 没有显式的this()调用
2.3.3 隐式调用Object的super()
2.3.3.1 不需要参数绑定
2.3.3.2 没有this()调用
2.3.3.3 没有super()调用(Object是根)
2.3.3.4 没有Object的显式变量初始化
2.3.3.5 没有要调用的方法体
2.3.4 显式初始化Employee属性(如果没有则继续使用默认初始值)
2.4显式初始化Manager的属性
2.5执行构造体this.bonus = 8000;
8. Object 类
Java 中,只有基本数据类型不是对象,其他每个类、数组等都是由Object 类扩展而来的
9. 强烈建议给每个自定义类增加一个toString方法。这样在调试过程中可以随时输出对象的状态信息,而且对团队开发的所有使用到该类的程序员有利。
二、 多态
1.多态的声明:
Employee m = new Manager(); //也是合法的
但是这个时候使用变量m,只能访问Employee 中的属性和调用Employee 类中声明的方法,而Manager部分的属性和方法被隐藏。例如:
m.setBonus(8000); //错误
2.虚方法调用:
如果出现如下情况:
Employee e = new Manager();
e.getDetails();
事实上虽然声明的e 是Employee 类型,但实际上实例化出来的是Manager 对象。也就是说,获得的是运行时与变量引用的对象相关的行为而不是编译时的变量类型决定的。这一行为通常称为虚拟方法调用。上面的示例中,执行的e.getDetails()源于对象的真实类型Manager,它将执行Manager 的getDetails()方法。
3.多态参数
多态参数是一个可以接受普通对象的方法参数,这种参数除了可以接收某个类的对象外还能接收该类任意子类的对象。
4.异类集合
Employee[] emp = new Employee[3];
emp[0] = new Employee(1, “Homer”, 6000);
emp[1] = new Manager(2, “Jam”, 8000);
emp[2] = new Programmer(3, “Fred”, 6000);
5. Wrapper 类,装箱和拆箱
a.各基本数据类型对应的Wrapper 类:
基本 Wrapper 默认值
byte Byte 0
short Short 0
int integer 0
long Long 0L
double Double 0.0D
float Float 0.0F
char character ‘\u0000’
Boolean Boolean false
拆包、装包:
int myInt = 100;
Integer wInt = new Integer(myInt);
int p2 = wInt.intValue();
//把基本数据转换成字符串引用类型
String s = String.valueOf(100);
int x = Integer.valueOf(s).intValue();
或者
//取得字符串引用数据类型的数值
int x = Integer.parseInt(s);
三、 枚举
public enum Season
{
SPRING("Spring"),
SUMMER("Summer"),
FALL("Fall"),
WINTER("Winter");
private String name;
private Season(String name) //必须标记为private,只在枚举类内部使用
{
this.name = name;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
PS:
1. * 正则表达式语法
*
* 字符
x 字符 x
字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
边界匹配器
^ 行的开头
$ 行的结尾
Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
Logical 运算符
XY X 后跟 Y
X|Y X 或 Y
(X) X,作为捕获组
*/
2. Integer num4 = 128;//autoBoxing 自动打包
Integer num5 = 128;
System.out.println(num4 == num5); //false
因为//-128~127 cache赋值 之外的为new XXX(value)