一、使用访问控制符,实现封装
二、继承
三、super关键字
四、理解继承
五、方法重写
六、抽象类
七、final用法
八、Object类
一、使用访问修饰符,实现封装
▪成员(成员变量或成员方法)访问权限共有四种:
–public 公共的
▪可以被项目中所有的类访问。(项目可见性)
–protected 受保护的
▪可以被这个类本身访问;同一个包中的所有其他的类访问;被它的子类(同一个包以及不同包中的子类)访问
–default/friendly 默认的/友好的(包可见性)
▪被这个类本身访问;被同一个包中的类访问。
–private 私有的
▪只能被这个类本身访问。(类可见性)
▪类的访问权限只有两种
–public 公共的
▪可被同一项目中所有的类访问。 (必须不文件名同名)
–default/friendly 默认的/友好的
▪可被同一个包中的类访问。
封装要点:
•类的属性的处理:
1.一般使用private. (除非本属性确定会让子类继承)
2.提供相应的get/set方法来访问相关属性. 这些方法通常是public
,从而提供对属性的读取操作。 (注意:boolean变量的get方法是
用:is开头!)
•一些只用于本类的辅助性方法可以用private,
希望其他类调用的方法用public
关于面向对象OOP2的总结我放在了这里
▪ 方法调用中的参数传递(重中之重)
– 基本数据类型的参数传递:不能改变参数的值
– 引用数据类型的参数传递:不能改变参数的值
▪ this
– This代表当前对象自身的引用(必须new)
– This可以修饰属性,区别成员变量和局部变量
– This修饰方法
– This修饰构造方法(必须是第一条语句)
▪ static
– static变量:只有一份,属于类,可以类名. Static变量
– static方法: 类名. Static方法,不能出现this和super
– static代码块:只执行一次,最早执行的(类第一次调用)
▪ package import
– 包:作用
– 导入:import com.bjsxt.oop.*;
– 静态导入: import static java.lang.Math.PI;
接下来是面向对象3的内容
二、继承
这张图就是一个继承关系
1.1为什么要使用继承?
使用继承优化后:子类和父类是is-a的关系,方便修改代码,减少了代码量
1.2▪ 类是对对象的抽象,继承是对某一批类的抽象,从而实现对现实
世界更好的建模。
▪ 提高代码的复用性!
▪ extands的意思是“扩展”。子类是父类的扩展
▪ 不同的叫法:超类、父类、基类、子类、派生类
1.3继承的概述
继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法
1.4继承的格式
格式:public class 子类名 extends 父类名{ }
范例:public class Zi extends Fu{ }
Fu : 是父类,也被成为基类、超类
Zi : 是子类,也被称为派生类
1.5继承中子类的特点:
子类可以有父类的内容;子类还可以有自己特有的内容
1.6继承的好处和弊端
继承好处
提高了代码的复用性(多个类相同的成员可以放到同一个类中)
提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
继承弊端
继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性
1.7什么时候使用继承?
继承体现的关系:isa
假设法:我有两个类A和B,如果他们满足A是B的一种,或者B是A的一种,就说明他们存在继承关系,这个时候就可以考虑
使用继承来体现,否则就不能滥用继承
举例:苹果和水果,猫和动物,猫和狗
苹果可以说成水果,猫可以说成动物,但是猫说成狗就说不通了
1.8继承中成员方法的访问特点
通过子类对象访问一个方法
子类成员范围找
父类成员范围找
如果都没有就报错(不考虑父亲的父亲...)
1.9小结:
– 通过继承可以简化类的定义,实现代码的重用
– 子类继承父类的成员变量和成员方法,但不继承父类的构造方法
– java中叧有单继承 ,没有像c++那样的多继承。多继承会引起混乱,使得
继承链过于复杂,系统难于维护。就像我们现实中,如果你有多个父母亲,
那是一个多么混乱的世界啊。多继承,就是为了实现代码的复用性,却引入
了复杂性,使得系统类之间的关系混乱。
– java中的多继承,可以通过接口来实现
– 如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object。
三、super关键字
▪super是直接父类对象的引用。
▪可以通过super来访问父类中被子类覆盖的方法或属性。
▪普通方法:
▪没有顺序限制。可以随便调用。
▪构造函数中:
▪任何类的构造函数中,若是构造函数的第一行代码没有显式的调用super(...);那么
Java默认都会调用super();作为父类的初始化函数。 所以你这里的super();加不加
都无所谓。
小结:
super关键字来访问父类的成员
super只能出现在子类的方法和构造方法中
super调用构造方法时,只能是第一句
super和this不能同时出现在构造方法中
super不能访问父类的private成员
super和this都不能再static方法中
四、理解重载
子类可以继承父类的所有资源吗?
▪ 访问修饰符protected
– 可以修饰属性和方法
– 本类、同包、子类可以访问
▪ 访问修饰符总结
▪ 多重继承关系的初始化顺序是怎样的?
五、 方法重写
▪ 在子类中可以根据需要对从基类中继承来的方法进行重写。
▪ 重写方法必须和被重写方法具有相同方法名称、参数列表和返回
类型。
▪ 重写方法不能使用比被重写方法更严格的访问权限。(由于多态)
▪ 构造方法也会被重写吗?
不能被继承,因此不能重写
▪ 方法重写的规则
– 方法名相同
– 参数列表相同
– 返回值类型相同或者是其子类;
– 访问权限不能严于父类
▪ 方法重载与方法重写
六、抽象类
实例化一个抽象类没有什么意义
Java中使用抽象类,限制实例化
abstract也可用于方法——抽象方法
▪ 抽象方法没有方法体
– 抽象方法必须在抽象类里
– 抽象方法必须在子类中被实现,除非子类是抽象类
七、final用法
一个类不希望再被其他类继承?
– 使用final类
方法不希望被重写?
– 使用final方法
属性值不希望被修改
– 使用常量
使用final修饰引用型变量,变量不可以再指向另外的对象
使用final修饰引用型变量,变量的值是固定不变的,而变量所指向的对象的属性值是可变的
八、Object类
▪ Object类是所有类的父类
▪ 一个类如果没有使用extends显性的继承另外一个类,
▪ 那么这个类就继承自Object类。
▪ Object类的主要方法
▪ (1)toString()方法
public static void main(String [] args){
Person p=new Person();//创建Person的对象p;
System.out.println("不加toString()的输出:"+p);
System.out.println("加上toString()的输出:"+p.toString());
}
加与不加toString的效果相同,都会调用父类Object中的toString方法
▪ Object类的主要方法
▪ (2)equals()方法
public class TestPerson//声明类
{
public static void main(String [] args){
Person p1=new Person("王一",33,"220283...");//创建Person
的对象p1;
Person p2=new Person("王一",33,"220283....");//创建
Person的对象p2;
//调用父类Object的equals方法
System.out.println(p1.equals(p2)?"是同一个人":"不是同一个人");
}
对象的比较—==和equals()
▪ ==:
– 比较两基本类型变量的值是否相等
– 比较两个引用类型的值即内存地址是否相等,即是否指向同一对象。
▪ equals() :
– 两对象的内容是否一致
▪ 示例
– object1.equals(object2) 如:p1.equals(p2)
▪ 比较所指对象的内容是否一样
▪ 是比较两个对象,而非两个基本数据类型的变量
– object1 == object2 如:p1==p2
▪ 比较p1和p2的值即内存地址是否相等,即是否是指向同一对象。
▪ 自定义类须重写equals(),否则其对象比较结果总是false。
Object类是所有Java类的根基类
如果在类的声明中未使用extends关键字指明其基类,则默认基类为
Object类
public class Person { public class Person extends Object {
... ...
} }
根据对象内存位置生成,唯一不重复!
重写:toString方法:
默认返回:包名+类名+@+哈希码
可以重写!
打开API文档,开始熟悉!
继承深化:
▪ 父类方法的重写:
– “==”:方法名、形参列表相同。
– “≤≤”:返回值类型和异常类型,子类小于等于父类。
– “≥”:访问权限,子类大于等于父类
▪ 构造方法调用顺序:
– 根据super的说明,构造方法第一句 总是:super(…)来调用父类对应的构造
方法。
– 先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直
到当前子类为止。