1、继承是面向对象的三大特征之一(封装,继承,多态)。
2、继承基本作用:代码复用。但是继承最重要的作用是:有了继承之后的“方法覆盖”和“多态机制”。
3、java当中的继承只支持单继承,一个类不能同时继承很多类,只能继承一个类。C++当中支持多继承。
4、继承语法格式:
[修饰符列表] class 类名 extends 父类名{
类体=属性+方法;
}
5、关于继承当中的一些术语:
6、在java当中子类继承父类继承了哪些数据?
7、虽然java当中只支持单继承,但是一个类也可以间接继承其他类,例如:
C extends B{
}
B extends A{
}
A extends T{
}
8、java中假设一个类没有显示的继承任何类,则该类默认继承JAVASE当中提供的java.lang.Object类
查找类的快捷键:CTRL+N

9、java中任何一个类中都有Object类的特征
public class Test04 extends Object{
public static void main(String[] args) {
Test04 tt=new Test04();
tt.toString();
//这里编译通过了,说明可以调用toString方法
//即Test04当中有toString方法,是从其父类Object当中继承过来的
}
}
回顾方法重载:
方法重载又称为Overload
方法重载的使用时间:当在一个类当中,方法完成的功能类似时,建议方法名相同,这样方便程序员编程
满足方法重载的条件:
方法重载和以下无瓜:
重写
1、方法覆盖又被称为方法重写(Override)
2、 什么时候使用方法重写?
3、什么条件满足之后方法发生重写?
4、注意
public class Animal {
public void move(){
System.out.println("动物在移动");
}
}
public class Cat extends Animal{
public void move(){
System.out.println("猫在走猫步");
}
}
public class Bird extends Animal{
public void move(){
System.out.println("鸟在飞翔");
}
}

关于java当中的多态语法机制:
Animal a=new Cat();
上面的代码分析如下:表示猫是一个动物(等号的右边先执行)
a1.move();

上面的代码分析如下:
a1.catchMouse()
上面的代码无法运行,原因如下:
什么时候需要使用向下转型?
当调用的方法是子类型当中特有的,在父类型当中不存在,则必须进行向下转型。
a1.catchMouse()
如果想让上面的代码可以运行的话,就需要使用向下转型:
将a1强制类型转换成为Cat类型,a1的类型是Animal类型,转换成为Cat类型,被称为强制类型转换。
Cat a2=(Cat)a1;
a2.catchMouse();
分析:
以上程序编译是没有问题的,因为编译器检查到a2的数据类型是Animal,而Animal和Cat之间存在继承关系,并且Animal是父类型,Cat是子类型,父类型转换成子类型叫做向下转型,语法合格。
Animal a3=new Bird();
Cat a4=(Cat)a3;

分析:以上程序虽然在编译期通关了,但是程序在运行阶段会出现异常,因为JVM堆内存当中真实存在的类型是Bird类型,Bird对象无法转换成Cat对象,因为两种类型之间不存在任何继承关系,此时出现了异常:java.lang.ClassCastException
如何避免出现向下转型异常?
在进行强制类型转换之前,建议采用instanceof运算符进行判断,避免异常的发生。
语法格式:
引用 instanceof 数据类型
以上运算符的执行结果是布尔类型,结果可能是true或者false
a instanceof Animal
关于运算结果:
例子:
测试类:
public class Test05 {
public static void main(String[] args) {
Master m=new Master();
LittleCat c=new LittleCat();
m.feed(c);
}
}
master主人类:
public class Master {
public void feed(LittleCat c){
c.eat();
}
}
小猫类:
public class LittleCat {
public void eat(){
System.out.println("小猫正在吃鱼!");
}
}

以上代码扩展力太差,因为如果要写一个小狗类的话就需要重新建立一个Dog类。
下面是使用多态之后重新写的代码:
分析:让每一个动物类都继承Pet类,这样就使用了多态。
public class Test05 {
public static void main(String[] args) {
Master m=new Master();
LittleCat c=new LittleCat();
m.feed(c);
Snake s0=new Snake();
m.feed(s0);
Dog d=new Dog();
m.feed(d);
}
}

多态的作用:
1、final是一个关键字,表示最终的,不可变的。
2、final修饰的类无法被继承。
3、final修饰的方法无法被覆盖。
4、final修饰的变量一旦赋值之后,不可重新赋值。
5、final修饰的局部变量一旦赋值之后,不可重新赋值【二次赋值】
6、java语言规定实例变量使用final修饰之后,必须手动赋值,不能采用系统默认值
public class Final {
final int age=10;
// final int b;//报错,这里必须赋值
public static void main(String[] args) {
final int m;
m=10;
// m=20;//报错
final int k=10;
// k=20;//报错
}
}
7、final修饰的引用一旦指向某个对象之后,就不能再指向其他对象,被指向的对象无法被垃圾回收器回收
public static void main(String[] args) {
//创建新用户对象
User u=new User(100);
//又创建一个新的用户对象,执行到此处的时候以上对象已经变成垃圾数据,等待垃圾回收器的回收
u=new User(20);
//创建用户对象
final User user=new User(30);
// user=new User(40);这里报错,因为final修饰的引用一旦指向某个对象之后,就不能再指向其他对象
user.id=50;//不会报错,final修饰的引用虽然指向某个对象之后不能指向其他对象,但是所指向的对象内部的内存是可以被修改的
}
8、final修饰的引用虽然指向某个对象之后不能指向其他对象,但是所指向的对象内部的内存是可以被修改的
常量的语法格式:
public static final 类型 常量名=值
例子:
public class Test01 {
public static void main(String[] args) {
System.out.println(Chinese.GUO_JI);
System.out.println(Math.PI);
}
}
class Math{
public static final double PI=3.1415926;
}
//中国人
class Chinese{
//需求:每一个中国人的国籍都是中国人,而且国籍不会发生改变,为了防止国籍被修改,建议加上final
//final修饰的实例变量是不可变的,这种变量一般和static一起联用,被称为常量
//
public static final String GUO_JI="中国";
}

关于java当中的包机制:
1、包又称为package,java中引入package这种语法机制主要是为了方便程序的管理。不同功能的类被分门别类的放到不同的软件包当中,查找比较方便,易于维护。
2、如果定义package语句?
语法结构:
package 包名;
例如:
org.apache.tomcat.core;
com.bjpowernode.oa.user.service;
package com.bjpowernode.oa.user.service;
public class Test01 {
}
方法:建包
com.bjpowernode.oa.user.service.Test01,当然,相应的文件目录也是如此的java com.bjpowernode.oa.user.service.Test01;import 类名;
import 包名.*;
java.lang*;不需要手动引入,系统自动引入。lang表示java语言的核心类,不需要手动引入。public class Test01 {
public static void main(String[] args) {
//`java.lang*;`不需要手动引入,系统自动引入。lang表示java语言的核心类,不需要手动引入。
//其中String就在lang包当中
String s="abc";
System.out.println(s);
//直接编写以下程序错误,因为Date类没有被自动导入,需要我们手动导入
// Date d=new Date();
//在类名之前写上包名
java.util.Date d=new java.util.Date();
}
}
导入以下两个包,就可以直接使用Date类了:
import java.util.*;
import java.util.Date;
最终结论,什么时候需要引入import:
1、访问控制权限修饰符来控制元素的访问范围。
2、访问控制权限修饰符包括:
3、访问控制权限修饰符可以修饰类变量,方法。
4、当某个数据只希望子类使用,则使用protected进行修饰。
5、修饰符的范围:private < 缺省 < protected < public
6、类只能使用public和缺省的修饰符进行修饰。(内部类除外)