java中的继承
1、继承的概念:
继承是类与类的一种关系,是一中 “is a”的关系。
注:java中的继承是单继承
2、继承的好处
子类拥有父类的所有的属性和方法,但是父类中的private修饰符无效
实现代码复用
eg:生活有要是有个好爹,就可以少奋斗几年;如果继承了父亲的权力,那就是官二代
3、语法
1 | class 子类 extends 父类 |
1 | //父类 |
方法的重写
1、概念:
如果子类对继承父类的方法不满意,是可以重写父类继承的方法的,当调用方法时会优先调用子类的方法。
2、语法规则
语法规则
返回值类型
参数类型及个数
都要与父类继承的方法相同,才叫方法的重写。
final关键字
概念:使用final关键字做标识有”最终的”含义。
final可以修饰类、方法、属性和变量
- final修饰类,则该类不允许被继承
- final修饰方法,则该方法不允许被覆盖(重写)
- final修饰属性,则该类的属性不会进行隐式的初始化(类的初始化属性必须有值)或是构造方法中赋值(但只能选其一)[就是属性只能赋值一次,不管是构造方法还是main方法都无法再次进行赋值]
- final修饰变量,则该变量的值只能赋一次值,即为常量。
super关键字
super关键字:在对象的内部使用,可以代表父类对象
- 访问父类的属性: super.love
- 访问父类的方法: super.work()
1 | package com.imooc; |
- super的应用*
- 如果子类的构造方法中没有显示调用父类的构造方法,则系统默认调用父类无参的构造方法。
- 如果显示的调用构造方法,必须在子类的构造方法的第一行。
- 如果子类构造方法中既没有显示调用父类的构造方法,而父类又没有无参的构造方法,则会编译出错。
Object类
object类是所有类的父类,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object类。
object类中的方法,适合所有的子类。
常用的方法:
1、toString() 方法 返回值:字符串
直接输出对象只能是返回哈希码生成的一个对象的内存地址,重写toString()方法能够清晰展现对象的属性值。
2、equals()方法 返回值:bool
比较的是对象的引用是否指向同一块内存地址
一般情况下比较两个对象时比较他的值是否一致,所以要进行重写。
多态 **
概念:对象的多种形态
1、引用的多态
父类的引用可以指向本类的对象
父类的引用可以指向子类的对象
eg:Dog类extends Animal类
Animal obj1 = new Animal();
Animal obj2 = new Dog(); //父类的引用是可以指向子类对象的
//Dog obj3 = new Animal(); //X 这种就是错误的
2、方法多态
创建本类对象时,调用的方法为本类的方法
创建子类对象时,调用的方法为子类重写的方法或者继承的方法。(__也就是说,子类里面非继承和重写的方法,是不能调用的__)
多态中的引用类型转换
- 1、向上类型转换(隐式/自动类型转换),是小类型到大类型的转换;
- 2、向下类型转换(强制类型转换),是大类型到小类型;
- 3、instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题。
1 | package com.imooc; |
抽象类 **
1、语法定义:
抽象类前使用abstract关键字修饰,则该类为抽象类。
2、应用场景:
- 在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法;
- 从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。
3、作用 *
限制规定子类必须实现某些方法,但是不关注实现细节。
4、使用规则
- abstract定义抽象类
- abstract定义抽象方法,只有声明,不需要实现
- 包含抽象方法的类是抽象类
- 抽象类中可以包含普通的方法,也可以没有抽象方法
- 抽象类不能直接创建,可以定义引用变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46package com.abstracttest;
//图形抽象类
public abstract class Mould {
//面积的实现
public abstract double area(double chang,double kuan);
//周长的实现
public abstract double girth(double chang,double kuan);
}
package com.abstracttest;
//矩形
public class Rectangle extends Mould {
@Override //矩形面积的计算
public double area(double chang, double kuan) {
// TODO Auto-generated method stub
double newArea = chang * kuan; //长*宽
return newArea;
}
@Override //矩形的周长
public double girth(double chang, double kuan) {
// TODO Auto-generated method stub
double newGirth = 2*chang + 2*kuan; //2*长+2*宽
return newGirth;
}
}
package com.abstracttest;
//调用方
public class init {
public static void main(String[] args) {
// TODO Auto-generated method stub
Mould mould = new Rectangle(); //父类引用指向子类对象
double newArea = mould.area(150, 145.55); //求面积
double newGirth = mould.girth(150, 145.55); //求周长
System.out.println("面积为:" + newArea);
System.out.println("周长为:" + newGirth);
}
}
接口 **
1、概述
类是一种具体实现体,而接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它只规定这些类里必须提供某些方法。
具有相同的功能,却不是同一个类的情况下,就可以使用接口
2、接口的定义
和类定义不同,定义接口不再使用class关键字,而是使用interface关键字。
3、接口定义的基本语法
1 | public interface [abstract] 接口名 [extends 父接口1,父接口2 ...] //可以多继承 |
接口就是用来被继承、被实现的,修饰符一般建议用public
注意:不能使用private和protected修饰接口
4、接口的定义
常量
接口中的属性是常量,即使定义时不添加, public static final修饰符,系统也会自动加上。
方法
接口中的方法只能是抽象方法,总是使用,即使定义时不添加public abstract修饰符,系统也会自动加上。
5、使用接口
(1)、一个类可以实现一个或者多个接口,实现接口使用implements关键字。java中一个类只能继承一个父类,是不够灵活的,通过实现多个接口可以做补充。
继承父类实现接口的语法为:
1 | [修饰符] class 类名 extends 父类 implements 接口1,接口2 ... |
注意:如果要继承父类,继承父类必须在实现接口之前。
根据下图实现接口实例:
实现如下:
1 | 【Telphone.java】 |
(2)、接口在使用过程当中,还经常与匿名内部类配合使用
匿名内部类就是没有名字的内部类,多用于关注实现而不关注实现类的名称。
语法格式:
1 | Interface i = new Interface(){ |
实例:
1 | package com.phone; |