【长沙校区】助你成功!【Java基础笔记】
——面相对象 下篇
上篇连接:【长沙校区】助你成功!【Java基础笔记】面相对象上篇
http://bbs.itheima.com/thread-275365-1-1.html
(出处: 黑马程序员IT技术论坛)
继承
概述:
1. 多个类中存在相同属性和行为时,将这些内容抽取到单个类中,那么继承类无需再定义被继承中已有非私有属性和方法,只需要继承即可;
2. 子类只能继承一个父类,但父类可被多个子类继承;通俗点说,也就是一个儿子只能有一个亲爹,但是一个爹可以有多个儿子;
3. 通过extends关键字让类与类之间产生继承关系;
4. 不要仅为了获取其他类中某个功能而去继承,类与类之间要有所属("isa")关系;
5. 继承提高了代码的复用性;
6. 继承是多态的前提;
代码举例:
super关键字概述:
1. this和super的用法很相似,this代表本类对象的引用,super代表父类的内存空间的标识;
2. 当本类的成员和局部变量同名用this区分,当子父类中的成员变量同名用super区分父类。
3. 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以复写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容;
代码举例:
- class Father{
- private double money;//私有属性 私房钱
- public String name; //非私有属性 姓名
- public int age; //非私有属性 年龄
-
- //非私有方法
- public void show(){
- System.out.println("父类-非私有方法!");
- }
- //私有方法
- private void show2(){
- System.out.println("父类-私有方法!");
- }
- }
- class Child extends Father{
- public int age; //非私有属性 年龄
- //子类方法
- public void show(){
- //在子类中是this关键字调用属性或方法时,如果子类有,就调用子类的,如果没有这个属性或方法,就会到它父类去找,如果父类也没有,就会报错。也就是说,this可以调用父类非私有属性或方法
- System.out.println("子类重写父类show()方法!通过this或super关键字可以调用父类非私有成员!"+this.age+this.name+super.show3());
- super.show();
- System.out.println("------下面是show2()-------");
- }
- //子类方法
- public void show2(){
- //通过this调用本类show()方法,this也可以调用父类其它非私有方法,但本来有父类重写的方法时,this调用的是本类的方法
- this.show();
- //通过super调用父类show()方法
- super.show();
- //super.show2(); 通过super也不能调用父类的私有方法
- }
- }
复制代码输出结果:
重载(overload)和重写(override)概述:
重载-overload:
1. 一个类中或者子父类关系中存在多个同名方法,并且参数列表不同的方法叫重载;
2. 子父类关系中:子类中的方法和父类中的方法构成了重载关系;
重写-override:
1. 子父类关系中,子类中存在与父类中方法声明完全一样的方法叫重写;
2. 父类私有方法,子类不能重写;
3. 重写时,子类修饰符权限要大于等于父类;
4. 使用被覆盖的方法可以通过super.函数名获取;
代码举例:
多态概述:
对象在不同时刻表现出来的不同状态;
前提:
1. 要有继承关系或实现关系;
2. 父类或者接口的引用指向或者接收自己的子类对象;
3. 要有方法重写或实现关系;
特点:
多态的存在提高了程序的扩展性和后期可维护性;
扩展性:同一个方法可以接收不通类型的数据;
可维护性:以前修改10行代码,现在只需要修改1行代码,减少了维护成本;
代码举例:
声明3个类,一个动物父类,一个猫子类,另一个狗子类,猫狗类继承动物父类;
Instanceof
抽象类概述:
1. 抽象就是从多个事物中将共性的、本质的内容抽取出来,不能实例化(不能创建对象);
2. 抽象类被abstract修饰,被abstract修饰的方法叫抽象方法,只有声明,没有方法体,继承了抽象类的类必须实现其中所有的抽象方法;
3. 成员变量:可以是抽象的也可以使非抽象的;
4. 构造方法:有构造方法,为了让子类来访问进行初始化;
5. 成员方法:可以有抽象方法,也可也没有抽象方法;
6. 抽象类中,abstract不允许与private、static、final关键字共存:
a) private : 被abstract修饰,就代表该方法或类必须被实现,所以就和private私有就冲突了;
b) static : static属于类,如果抽象方法设为static静态的,那么该方法没有方法,通过类名调用,没有意义;
c) final : final理解为最终形式,不允许被修改,而抽象方法必须被子类实现,和final不允许修改就冲突了;
代码举例:
需求:
公司中程序员有姓名,工号,薪水,工作内容。
项目经理除了有姓名,工号,薪水,还有奖金,工作内容。
分析:
在这个问题领域中,通过名词提炼法:
程序员:
属性:姓名,工号,薪水。
行为:工作。
经理:
属性:姓名,工号,薪水,奖金。
行为:工作。
程序员和经理不存在着直接继承关系,但是,程序员和经理却具有共性内容,可以进行抽取,因为他们都是公司的雇员,可以将程序员和经理进行抽取,建立体系。
接口概述:
1. 接口的出现将“多继承”通过另一种形式体现出来,即“多实现”;
2. 接口的成员变量都是静态常量,有默认修饰符:public static final;
3. 成员变量: 只能是常量,并且是静态公共的默认修饰符为:public static fina;
4. 构造方法:接口没有构造方法,因为没有任何一个类能来访问接口的构造方法;
5. 成员方法: 只能是抽象的方法(因为是抽象的,所以也不能和static共存)默认修饰符为 : public abstract;
代码举例:
接口和抽象类的特点和区别特点:
接口:系统拓展的功能,likea 的关系
(1)成员变量: 只能是常量,并且是静态公共的默认修饰符为: public static final ;
(2)构造方法:接口没有构造方法,因为没有任何一个类能来访问接口的构造方法;
(3)成员方法: 只能是抽象的方法(因为是抽象的,所以也不能和static共存)默认修饰符为 :public abstract;
抽象类:系统的共性 ,is a 的关系
(1)成员变量:可以是抽象的也可以使非抽象的
(2)构造方法:有构造方法,为了让子类来访问进行初始化
(3)成员方法:可以有抽象方法,也可也没有抽象方法
区别:
a) 抽象类可以有构造方法,接口不能有构造方法;
b) 抽象类可以有普通成员变量,接口中没有普通成员变量;
c) 抽象类中可以包含非抽象的普通方法,接口中所有方法必须都是抽象的,不能有非抽象的普通方法;
d) 抽象类中的抽象方法的访问类型可以是public,protected,但是接口中的抽象方法只能是public类型的,并且默认是public abstruct类型;
e) 抽象类中可以包含静态方法,接口中不能包含静态方法;
f) 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但是接口中定义的变量只能是;
g) public static final类型,并且默认是public static final;
h) 类只能单继承,而接口可以多继承;