目录
继承(extends)
概念: 从一个类中衍生出(派生出)其他类的过程
原有的类: 父类、超类、基类
其他类: 子类 、派生类
好处:
1.让类与类间产生了–继承关系
2.提高了代码的复用性
3.有了第三特征—多态
弊端: 增强了耦合性
格式:
class A extends B{}
extends : 继承、 扩展的意思
A 是子类, B 是父类
子类继承父类后,子类对象可以直接操作父类中的成员(父类中的成员被子类继承了)。
子类中除了继承的父类成员外,还可以有自己特有的属性和行为。
注意:
1.私有成员不被继承的
但实际上,子类还是继承了继承私有成员,只不过子类不能直接操作私有成员,相当于把私有权限也继承了,想要操作只能过程继承的get和set方法间接操作。
2.构造方法不被继承
假设继承了,方法名就是类名,但是继承的方法名是父类类名,此时方法名冲突。
特点:
在Java中,一个子类只能有一个父类,这个特点称为—单继承
一个父类可以有多个子类。
为什么不允许多继承呢?(一个子类可以有多个父类)
假设允许多继承,多个父类中有相同的方法声明,但是方法体不同,创建子类对象,调用该方法,不能确定执行哪个,因此不允许多继承。
在Java中,不允许多继承,但是允许多层继承(类似与家谱)
相当于是A 继承 B ,B 继承C ,C 继承 D…, 这种模式称之为叫做继承体系。
功能最多的是:A类 ;功能是整个体系中最共性的:D类。
学习这样的体系,从上到下去学习,意思就是先学最顶层的,依次向下学习。使用最子类的。
在Java中,有一个最顶层的父类,是Object类。我们所学习的类或自己创建的类都是该类的直接或间接子类。
注意:不能为了提高代码的复用性,而乱使用继承,必须有is–>a关系才可以使用(子是父一种)
例子: class Cat{ eat(){} }
class Dog{ eat(){} }
这两个类中有共性内容,但是它俩不能继承,没有is-a关系。
可以将共性内容进行向上抽取,抽取到Animal类中。Animal分别与Cat和Dog
有继承关系,即is-a关系。
继承出现后,类中成员的变化
变量:
当子类和父类中出现同名的变量,创建子类对象,访问该属性,访问的是子类中的。
如果想要访问父类中的该变量,使用关键字super来访问。
this和super
这两个关键字的用法是相同的
区别是
this:代表的是当前类对象自己的引用,可以访问属性和方法 (子类中和父类中)
调用重载的构造方法,必须写在第一行
super:代表的是当前类对象的父类的引用,可以访问属性和方法(父类中的)
调用构造方法,必须写在第一行(父类)
注意:“就近原则”
方法:
当子类中和父类中出现了相同的方法声明,但是方法体不同,创建子类对象,调用该方法运行的是子类中的方法体内容,这种现象称之为叫做:方法的重写(覆盖)。
方法重载(overload)
在一个类中,方法名相同,参数列表不同,与返回值类型无关。
参数列表不同: 个数、顺序、类型
方法重写(override)
在子类中,对父类中的方法进行重写。
重写前提:
1.方法声明要与父类中的方法声明一致
2.访问权限修饰符大于等于父类的权限
3.可以通过注解@Override来验证是否是重写方法,不是则会在编译时期报错
该注解写在重写方法的上边(写在子类中)
4.jdk5.0版本后,允许重写的返回值类型是父类方法返回值类型的子类
即:返回值类型可以小于等于父类
5.私有方法不重写
为什么要重写?
父类方法的方法体不满足于子类的需求,有想要保留该方法的声明,因此进行重写。
想要在子类中调用父类中的方法,使用关键字super,格式:super.方法名();
构造方法:
当创建子类对象时,发现父类的构造方法也执行了,原因时在子类构造方法的第一行有一条隐藏的 super(); 语句,该语句的作用就是去调用父类中的无参数的构造方法。
如果父类中没有无参数的构造方法,那么子类必须在构造方法的第一行显示写出super(参数) 这样的动作目的就是为了让父类的构造方法先执行,即父类的属性先进行初始化。
在子类中定义的重载形式的构造方法中,使用this(参数) 语句调用了其他构造方法,那么这个构造方法的中不能出现super()语句,这两条语句都必须放在构造方法的第一行,不能共存。
问题:子类对象创建的同时,父类对象创建了吗?
并没有创建。仅仅是在子类中持有一个能访问父类中成员的变量,即super。
总结编写具有继承关系的对象类:
代码块
多条语句使用一对大括号包裹起来,这样的格式就是代码块。代码块放在类中不同的地方有不同的含义,因此分为:
局部代码块
构造代码块
静态代码块
同步代码块(线程)
局部代码块
格式:
{
代码
}
位置: 写在方法中
作用:控制局部变量的作用域
在块中定义的变量,出了块就不能再使用,因为出了块,该变量已消失。
在块外边定义了变量,在块中对该变量可以进行处理操作,出了块,该变量是处理后的结果。
在一个局部中 ,是可以定义多个局部块。
构造代码块
格式:
{
代码
}
位置: 定义在类中,与成员变量和方法是平级的
作用: 用于给所有对象进行统一初始化,并且优先于构造方法来执行。
创建对象时执行。
在类中,可以定义多个构造块,执行顺序就是从上到下依次执行。
静态代码块
格式:
static{
代码;
}
位置:类中,方法外
作用:用于给类或静态变量初始化。
当加载类时,某些动作需要此时完成,可以放在静态块中。
因为类只加载1次,因此,静态块也是只执行1次。
当类加载时就执行。
在类中,静态块也是出现多次的,执行顺序依次从上到下去执行。
final关键字
含义是:最终的,最后的意思。
是一个修饰符,可以修饰变量、方法、类。
特点:
修饰类: 最终类,不能有子类,即不能被继承
格式:final class 类名{}
修饰方法: 最终方法,不能被重写
格式:final 返回值类型 方法名(参数列表){}
修饰变量:
既可以修饰成员变量,也可以修饰局部变量,都代表着是最终变量,不能改值。
因此被final修饰的变量就是常量。
常量:
字面值常量、 符号常量
格式:
public/private static final 数据类型 常量名 = 数据;
eg: public static final double MY_PI = 3.14;
eclipse快捷键
复制代码: ctrl+alt+方向键上或下
移动代码: alt+方向键上或下
格式化代码: ctrl+shift+f
自动导包: ctrl+shif+o
删除: ctrl+d
注释: 单行注释添加和取消 : ctrl+/
多行注释添加和取消: ctrl+shift+/ ctrl+shift+\