第一部分:面向对象编程的四个基础特点 : 封装 : ch06/Encapsulation.java
1,属性的封装 : 将类中的数据【隐藏】
主要属性的访问权限进行控制
public 任何对象可以方法
protected 当前类对象和子类对象可以访问
private 只能在当前类中访问
发现问题:如果属性加上了private修饰,那么这个属性在其他类中都无法访问。
解决:
2,方法的封装 : 将类中方法的具体实现隐藏
为了提高代码的重用
第二部分:方法的重载
1,定义:
【方法名相同】,
【方法的参数列表不同】
不讨论返回值 , 的多个方法 这些方法被称为方法的重载
ch06/Overload.java
参数列表不同:
个数和数据类型的排列都不一样
public void show(int a){}
public voud show(short b){}
public void show(long c){}
public void show(double d){}
问题一: 方法1 和 方法2 是否是重载?
问题二: 方法1 和 方法3 是否是重载?
问题三: 方法1 和 方法4 是否是重载?
问题三: 方法3 和 方法4 是否是重载?
问题三: 方法5 和 方法6 是否是重载?
问题三: 方法7 和 方法8 是否是重载?
2,好处: 给用户对功能的调用和使用提供了很大的灵活性
注 : 重载可以是和父类中的方法进行
知识点速记:方法名相同和参数列表不同的方法就是方法的重载.
第三部分:构造方法
1,定义:在类中 方法名和类名一致,没有返回值的方法就是构造方法.
2,作用:
2.1:给属性初始化值
2.2:配合new关键字创建对象
3,小问题:
3.1:类中不写构造方法时,会有默认的构造方法 ,无参构造方法
3.2:类中手动编写构造方法以后,类中不会有默认的构造方法
3.3:在构造方法中可以调用其他的构造方法 , 其他的构造方法必须在第一行
3.4:构造方法可以重载
第四部分:对象的创建和初始化
1,对象的创建 : 以类为模板创建个体
语法: 类名 变量名 = new 构造器;
内存中过程:
1.为对象分配内存空间,
将对象的实例变量自动初始化默认值;
2.如实例变量显示初始化,
将初始化值赋给实例变量(把默认值覆盖掉);
3.调用构造方法;
4.返回对象的地址值;
class Student{
private int id = 30;
}
id = 0;
id = 10;
2,对象的初始化:
使用有参数构造器给对象进行初始化
类名 变量名 = new 类名(参数列表);
class Student{
private int id;
private String name;
public Student(int id,String name){
this.id = id;
this.name = name;
}
}
main(){
new Student(1,“tom”);
}
第五部分: 面向对象编程的四个基础特点 : 继承
1,一个类想具备某些特殊功能,可以继承具有特殊功能的父类,从而达到效果。
2,语法:
public class Zi extends Fu{}
3,特点:java中是单继承。
如果不写extends某一个父类,
那么所有类都默认继承Object
4,父类中什么会被继承:
1,父子类同包,子类继承父类中public、protected和默认访问级别的成员变量和成员方法;
2,父子类不同包,子类继承父类中public、protected的成员变量和成员方法;
3,构造器不能被继承
4,方法和实例变量可以被继承
5,子类构造器隐式地调用父类的默认无参构造器;
public class Z extends F{
public Z(){
}
}
public class F{
}
6,如果父类中没有定义无参构造器,只定义了有参构造器,那么子类构造器则必须显式地调用父类的有参构造器(通过super(…)),且必须放置在第一条语句,否则会有语法错误。
7,this()和super()在构造器中都必须为第一条语句,两者不能同时出现。
8,当一个子类继承了一个父类后,父类中所有的字段和方法都被子类继承拥有,子类可以任意的支配使用,每个子类对象中都拥有了父类中的所有字段。当构造一个子类的实例对象时,该对象的实例变量包括了子类本身以及父类中的所有实例变量,实例方法也包括了子类和父类中的所有实例方法。
9,子类构造器用来初始化子类中所有的实例变量,而父类构造器super(实参)用来初始化父类中所有的实例变量。所以在堆中为子类实例对象分配的内存区域中包括了子类和父类中所有初始化后的实例变量
5,继承现象大总结:
1. 子类重写父类方法,调用子类方法;
2. 子类属性与父类同名(不管子类属性前修饰符如何均允许),如获取属性,看获取属性方法位置,如在父类中,获取的是父类属性,如在子类中,获取的是子类属性;
3. 子类私有方法与父类私有方法同名,如调用该方法,看私有方法被调用的位置,如在父类中,调用的是父类方法,如在子类中,调用的是子类方法;
4. 子类静态方法与父类静态方法同名,子类静态方法屏蔽父类静态方法。如调用该静态方法,看实例化对象时所声明的类型,如声明为父类,调用的是父类中静态方法,反之是子类中静态方法。
----------------------------day6 end----------------------
第一部分:方法的重写 ch06/Override.java
1,重写发生在子父类中,在同一个类中方法只能被重载,不能被覆盖。
2,特点:方法名 参数列表 需要保持一致,异常不能被放大,权限不能被缩小。
3,静态方法不存在重写这一说法:子类可以定义与父类的静态方法同名的静态方法(但是这个不是覆盖)
4,父类中静态方法不能被子类覆盖为非静态方法
5,父类的非静态方法不能被子类覆盖为静态方法;
6,抽象方法:
a. 父类的抽象方法可以被子类覆盖为非抽象方法: 子类实现父类抽象方法;
b. 父类的抽象方法可以被子类覆盖为抽象方法: 重新声明父类的抽象方法;
c. 父类的非抽象方法可以被子类覆盖为抽象方法;
第二部分:super关键字
1,作用:调用和区分子类和父类的方法
子类中调用父类中的方法或者构造器或者成员变量
调用方法: super.show();
调用构造器: super(参数); 只能位于构造器第一句
2,子类构造方法中如没有使用this关键字,会隐式调用父类的无参构造方法
第三部分:面向对象编程的四个基础特点 : 多态
父类的引用指向子类的对象
父接口的引用指向实现类的对象
多态的好处:代码更加灵活
多态出现在 具有继承关系的两个类对象之间,
语法: 父类 变量名 = new 子类();
接口 变量名 = new 实现类();
使用多态的对象调用方法时:
编译: 看父类中是否有这个方法/接口中是否有这个方法
运行: 执行具体实现类中的方法
ch06/Polym.java
第四部分:引用数据类型的 转换
隐式转换 : 小类型转换为大类型
Student stu = new Student();
Object obj = stu;//正常
强制类型转换: 大类型转换为小类型
PoFu f = new PoFu();
PoZi z = (PoZi)f;//错误
PoFu f = new PoZi();
PoZi z = (PoZi)f;//正确
得到结论:只能强制转换为 对象的实质数据类型