1.继承
- 1 类的继承格式
class supperClass {
}//父类
class subClass extends superClass{
}//子类
1.2 继承关键字: extends 和implement的区别:
- extends只能实现单继承,也就是说一个子类只能有一个父类,extends只能继承一个类
- implement关键字可以变相的使java有多继承的特性,适用范围为类继承接口的情况,可以同时继承多个接口,接口与接口之间采用逗号分隔
1.3 super与this关键字
- super 关键字可以实现对父类成员的访问,用来引用当前对象的父类
- this关键字:指向自己的引用
- final关键字可以把类定义为不能继承的,即最终类 ;或者用于修饰方法,且该方法不能被子类重写
class animal{
void eat();
}
class cat extends animal {
void eat();
void eatTest(){
this.eat();//指向自己的引用
super.eat();//调用父类的方法
}}
2.java重写(Override)与重载(Overload)
2.1重写
重写是子类对父类允许访问的方法的实现进行重写,外壳不变,核心重写
子类抛出异常时只能抛出父类异常的子类异常
2.1.1 方法的重写原则
- 父类和子类如果在同一个包中,那么子类可以重写除了被声明为private和final的父类所有方法
- 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法
- 重写的方法能够抛出任何非强制异常,无论是否被重写的方法是否抛出异常。但是重写的方法不能抛出新的强制性异常(符合继承的特性),或者比被重写方法声明的更广泛的强制性异常
- 构造方法不能被重写
- 不能重写无法被继承的方法(被final声明的方法),还有 static方法
JAVA中的异常分为两类
引用的博客链接
java中的异常分为两大类,强制性异常(CheckedException)和非强制性异常(UncheckedException)。而java中除了RuntimeException外,都是强制性异常。
- 强制性异常:所谓强制性异常就是在编写程序的过程中必需在抛出异常的部分try catch 或者向上throws异常。
- 非强制性异常:所谓非强制性异常就和上面相反了。虽然也可以try catch或者thows,只不过这不是强制性的。
2.2重载
- 重载是在一个类里面,方法名字相同,参数不同,返回类型可以相同可以不同
- 每个被重载的方法都需要一个独一无二的参数类型列表
最常用的方法就是构造器的重载
重载规则
被重载的方法必须改变参数列表
- 只要方法名字相同,参数顺序,参数名称,参数个数有一个以上不同就可以
- 被重载的方法声明异常不受限制
- 方法能够在同一个类或同一个子类中被重载
- 不能以返回值类型作为重载函数的区分标准,因为 返回类型可以相同可以不同
小结:
方法的重写和重载是java多态性的不同表现 ,方法重载是一个类的多态性表现,而方法重写是子类与父类 的一种多态性表现
3.多态
- 多态表示同一个行为在不同情况下有不同的表现,多态存在的三个必要条件:继承、重写、父类引用指向子类对象
- 使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,编译错误,如果有再去调用子类的同名方法。使得程序有良好的拓展
3.1虚方法
public class SuperClass {
void set();}
public class SubClass extends SuperClass{
void set();
}
public class Demo{
public static void main(String[] args){
SuperClass classA=new SubClass();
}}//编译的时候 用的是SuperClass 的set()方法,执行过程JVM调用的是SubClass里面的set方法
4.java抽象类
抽象类不能实例化对象,只有被继承以后才能被使用,java中抽象类表示一种 继承关系,一个类是能继承一个抽象类,而一个类可以实现多个接口。
- 只有非抽象类的抽象子类可以创建对象
- 抽象类不一定包含抽象方法,但有抽象方法的类必定为抽象类
- 抽象类中的抽象方法知识声明,不包含方法体,
- 构造方法,类方法static不能声明为抽象方法(不能被继承)
- 抽象类的子类必须给出抽象类中抽象方法的具体实现,除非该子类也是抽象类
5.java封装
封装可以防止该类的代码和数据被外部定义类随机访问和修改
实现封装的步骤
- 用访问控制修饰符,如private
- 对每个值提供对外的公共方法访问,创建一对赋取值方法,用于对私有属性的访问
class void setName(String name){
this.name=name;//this可以避免实例变量和局部变量之间发生同名的冲突}
6.java接口
接口 Interface 是抽象类的集合,接口的所有方法必须是抽象方法,没有构造方法,不能包含除了static 和final变量,接口不是被类继承,而是被类实现,支持多重继承
接口特性
- 接口中的每一个方法也是隐式抽象的,接口中的方法被指定为public abstract
- 接口中可以含有变量,但是接口中的变量会被指定为public static final (并且只能是public )
- 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法
对比抽象类和接口
- 抽象类中的方法可以有方法体,接口不可以(只要有抽象方法就会成为抽象类)
- 抽象类中的成员变量可以使各种类型的,而接口中的成员变量只能是public static final类型
- 接口 中不能含有静态代码块及静态方法(static),而抽象类可以
- 一个类只能继承一个抽象类,一个类可以实现多个接口
//接口的声明
[访问控制修饰符] interface 接口名称 [extends 其他的类名]{
//声明变量
//抽象方法
}
public interface NameOfInterface{
//任何类型 final,static 字段
//抽象方法}
接口有以下特性:
- 接口隐式抽象,声明接口及方法不用abstract关键字
- 接口中的方法都是公有的
interface Animal{
public void eat();
public void travel();
}
接口的实现
类用implement实现接口中的方法
public class cat implement Animal{
public void eat(){
System.out.println("Animal");
}
public void travel(){
System.out.println("Animal");
}
}
接口之间的继承
接口之间的继承使用extends关键字,
public interface Animal{
public void eat();
public void sleep();
}
public interface Animal_2{
public void eat();
public void sleep();
}
public interface cat extends Animal,Animal_2{
public void see();//cat 类继承了两个方法,自己声明了一个方法
}
接口允许多重继承
标记 接口
没有任何方法和 属性的接口,仅仅表明它的类属于一个特定的类型,供其他代码进行测试
标记接口的两个作用:
- 建立一个公共的父接口
- 向一个类添加数据类型(通过多态实现)
7.java包机制
为了更好的组织类,java提供了包机制,用于区别类名的命名空间
包的作用
- 把功能相似或相关的类组织在同一个包中,方便类的查找和使用
- 包可以避免名字冲突,通过不同的包名可以区分名称相同的类
- 包限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
java使用包这种机制是为了防止命名冲突,访问控制,提供搜索和定位类接口,枚举(enumerations)和注释(annotation)等
//java包的格式
package net.java.util;
public class Something{
...}
import关键字
使用某一个包的成员,必须在java程序中明确导入该包,用import语句完成。import语句应该放在package语句之后