类的继承格式
public class 子类 extends 父类{
}
Java继承的特点
a.单继承(一个子类只能有一个父类,一个父类可以有多个子类)
b.多层继承(一个子类可以有一个父类,该父类也可以有自己的父类)
子类调用父类的成员特点
如果子父类中有同名的成员变量/成员方法,根据Java就近原则,优先调用子类自己成员
如果子父类中不同名的成员变量/成员方法,根据变量或者方法名字调用,不存在歧义
构造方法,a.父类的构造子类无法继承 b.在子类的任何构造第一行,默认调用父类的无参构造,super()
方法重写的概念
方法重载(overload): 在同一个类中,方法名一样的,参数列表不一样
方法重写(override): 在继承关系中,子类中有一个和父类除了方法体(权限修饰符),其他一模一样的方法
this可以解决的问题
在本类中使用:
this.xxx 访问本类的成员变量
this.xxx() 调用本类的成员方法
this(...) 调用本类的其他构造
super可以解决的问题
在子类中使用:
super.xxx 访问父类继承的成员变量
super.xxx() 调用父类继承的成员方法
super(...) 调用父类构造方法
抽象方法的概念
抽象方法: 只有方法的声明,没有方法的实现(加上关键字abstract)
抽象类: 含有抽象方法的类一定是一个抽象类
如果是一个抽象类,其中不一定含有抽象方法
抽象类的格式
public abstract class 抽象类名{
抽象方法
正常方法
}
抽象方法的格式
public abstract void 抽象方法名();
父类抽象方法的存在意义
抽象类的意义: 给其他子类继承的,为子类提供模板(模板设计模式)
抽象方法的意义: 要求子类必须重写(如果不重写,子类还是一个抽象类)
---------------------
a.关键字final
b.关键字static
c.引用类型_接口
final在Java中是一个修饰符:
修饰类,修饰方法,修饰局部变量,修饰成员变量,修饰引用类型变量
final修饰类
被final修饰的类 不能被继承
注意: final修饰的类没有子类,并不是说它不能继承别的类
final修饰方法
被final修饰的方法,不能被重写!!
final修饰局部变量
被final修饰的局部变量,表示该变量只能赋值一次
final修饰引用类型的变量
final修饰引用类型的变量,表示该引用类型变量中保存的地址值不能改变量
注意:
final修饰d只表示d中地址不能改变,并不代表d中的成员变量值不能改变,
final修饰成员变量
被final修饰的成员变量,只能赋值一次,必须赋值
但是赋值可以有两种选择:
a.定义该成员变量的时候赋值
b.或者在构造方法中给该成员变量赋值
总之,final修饰的成员变量,必须在创建对象之前有值
static也是一个修饰符,用于修饰类中成员变量/成员方法,被static修饰的成员我们称之为静态成员/类成员
"被static修饰的成员,不属于任何一个对象,属于整个类,被所有对象共享"
类变量:就是使用static修饰的成员变量,我们称为类变量/静态变量
"被static修饰的成员变量,不属于任何一个对象,属于整个类,被所有对象共享"
//静态变量,类变量,在内存的方法区中的静态区,只有一份(所有对象共享它)
静态方法
静态方法也叫类方法,由static修饰的方法
特点: 正常的方法必须通过对象才能调用,静态方法不需要通过对象,通过类名就可以直接调用
静态和非静态之间的相互调用
静态成员变量
静态成员方法
与类是同级,只要类加载到内存,静态的成员变量/成员方法就存在(对象不一定存在)
非静态成员变量
非静态成员方法
必须创建对象之后才能访问/调用
生命周期看:
静态出现的比非静态要早!!!!
结论:
a.静态与静态之间,非静态与非静态之间是可以相互访问的
b.非静态可以访问静态,但是静态不能访问非静态
静态的成员变量
对象名.静态的成员变量 【可以访问的,但是我们不建议】
类名.静态的成员变量 【建议访问的方式】
静态的成员方法
对象名.静态的成员方法() 【可以访问的,但是我们不建议】
类名.静态的成员方法() 【建议访问的方式】
总结: 静态成员虽然可以通过对象名去访问/调用,但是我们更建议直接使用类名去访问/调用
什么是接口:
也是一种引用类型,接口是方法的集合(接口中主要写方法)
//抽象方法【主要】,只有接口中抽象方法 public abstract 关键字可以省略(省略不代表没有,编译器会自动添加)
a.和抽象类类似,接口也是不能创建的对象的
b.接口也是作为父接口使用的,用于被其他类"实现"的
c.继承使用extends关键字,实现使用"implements"关键字
使用方式:
public class 实现类 implements 接口名{
//a.必须重写接口中所有的抽象方法
//b.选择性重写接口中的默认方法,但是重写后不能有default
//c.静态方法没有重写的说法,因为它是通过所在类/接口的名字直接调用的
}
接口的多实现
格式:
public class 实现类 implements 接口1,接口2,..{
//a.实现类需要重写所有接口中的所有抽象方法
//如果有抽象方法是一样的,那么实现类只需要重写一次
//b.实现类可以选择性重写所有接口中的默认方法
//如果接口中有一样的默认方法,实现类必须重写一次
//c.静态方法没有重写的概念,就算多个接口中有一样的静态方法
//也不冲突,通过各位所在的接口名调用,没有歧义
}
实现和继承的优先级问题
一个类 可以在继承一个父类的同时实现多个接口(继承和实现可以同时存在)
格式:
public class 子类/实现类 extends 父类 implements 接口,...{
}
继承的优先级 高于 实现,所以必须先extends后implements
//如果父类中的正常方法和接口中的默认方法一样了
//a.那么子类需要不需要对同名的show方法进行重写呢??
//子类可以不重写该方法,调用优先调用父类中的show
//b.那么子类能不能重写show方法呢???
//可以重写,重写后,优先调用子类重写后的方法
接口的多继承
类和类之间: 单继承
类和接口之间: 多实现
接口和接口之间: 多继承
格式:
public interface MyInter extends Inter1,Inter2{
MyInter接口包含Inter1和Inter2接口所有东西
}
a.接口中,无法定义成员变量,但是可以定义常量(字面值常量,由public static fina修饰的常量)
其值不可以改变,默认使用public static final修饰(可省略,但是编译器会自动添加)
【public static final】 数据类型 常量名 = 值; 【常量名一般纯大写,多个单词之间使用_分隔】
b.接口中,没有构造方法,不能创建对象。
c.接口中,没有静态代码块
描述final
修饰类: 该类不能被继承
修饰方法: 该方法不能被重写
修饰变量: 该变量只能赋值一次
局部变量: 可以在定义时赋值,可以先定义后赋值
成员变量: 可以在定义时赋值,可以在构造方法中赋值
引用类型变量: 表示该引用类型变量的地址值不能改变,但是地址内成员变量的值是可以改变
能够掌握static关键字修饰的变量调用方式
类名.成员变量名【建议的使用方式】
能够掌握static关键字修饰的方法调用方式
类名。成员方法名() 【建议的使用方式】
能够写出接口的定义格式
public interface 接口名{
//抽象方法【我们最最最常写】
//默认方法
//静态方法
}
能够写出接口的实现格式
public class 实现类 implements 接口名,...{
//a.重写所有抽象方法,如果有相同只需要重写一次
//b.选择性重写默认方法,如果相同必须重写一次
//c.静态方法没有重写的概念
}
能够说出接口中的其他成员特点
a.没有成员变量,只有常量
[public static final] 数据类型 常量名 = 值;
b.没有构造方法,也不能创建对象
c.也没有静态代码块