一.继承
面向对象的三大特征:
1. 封装
2. 继承
3. 多态.
继承:继承是通过关键字extends体现的。
继承的格式:
class 类名1 extends 类名2{}
继承要注意的事项:
- 千万不要为了减少重复代码而去继承,只有真正存在着继承关系的时候才去继承
- 父类私有的成员不能被继承
- 父类的构造函数不能被继承
- 创建子类对象时默认会先调用父类无参的构造函数
4. 创建子类对象时默认会先调用父类无参的构造函数:
人类
class Person{
String name;
private int age;
public Person(String name){
this.name = name;
}
public Person(){
System.out.println("Person类的构造方法被调用了....");
}
public void eat(){
System.out.println(name+"在吃饭...");
}
}
学生类
class Student extends Person {
int num; //学号
public Student(){
System.out.println("Student类的构造方法被调用了....");
}
public void study(){
System.out.println(name+"good good study , day day up");
}
}
class Demo7
{
public static void main(String[] args)
{
Student s = new Student();
}
}
输出:Person类的构造方法被调用了....
Student类的构造方法被调用了....
java是单继承
一个类最多只能有一个直接的父类。但是有多个间接的父类。
class Ye{
String name;
}
class Fu extends Ye{
}
//ye是zi的间接父类
class Zi extends Fu{
}
class Demo6 {
public static void main(String[] args) {
Zi zi =new Zi();
zi.name = "狗娃";
}
}
二.super关键字
super关键字代表了父类空间的引用
super关键字的作用:
- 子父类存在着同名的成员(变量或方法)时,在子类中默认是访问子类的成员,可以通过super关键字指定访问父类的成员。
- 创建子类对象时,默认会先调用父类无参的构造方法,可以通过super关键字指定调用父类的构造方法。
super关键字调用父类构造方法要注意的事项:
1.如果在子类的构造方法上没有指定调用父类的构造方法,那么java编译器会在子类的构造方法上面加上super()语句;
2. super关键字调用父类的构造函数时,该语句必须要是子类构造函数中的第一个语句;
3. super与this关键字不能同时出现在同一个构造函数中调用其他的构造函数。因为两个语句都需要第一个语句。
super关键字与this关键字的区别:
- 代表的事物不一致:
1. super关键字代表的是父类空间的引用。
2. this关键字代表的是所属函数的调用者对象。
- 使用前提不一致:
1. super关键字必须要有继承关系才能使用。
2. this关键字不需要存在继承关系也可使用
- 调用构造函数的区别:
1. super关键字是调用父类的构造函数。
2. this关键字是调用本类的构造函数
class Fu{
int x = 10;
String name;
public Fu(){
System.out.println("Fu类无参的构造方法..");
}
public Fu(String name){
this.name = name;
System.out.println("Fu类带参的构造方法..");
}
public void eat(){
System.out.println("小头爸爸吃番薯..");
}
}
class Zi extends Fu{
int x = 20;
int num;
public Zi(String name,int num){
super(name); //指定调用了父类带参的 构造方法...
//this(); // 调用本类无参构造方法..
//super(); //指定调用了父类无参构造方法。。。
System.out.println("Zi类带参的构造方法..");
}
public Zi(){
System.out.println("Zi类无参的构造方法..");
}
public void print(){
System.out.println("x = " +super.x);
}
public void eat(){
System.out.println("大头儿子吃龙虾..");
}
}
class Demo9 {
public static void main(String[] args)
{
Zi z = new Zi("狗娃");
}
}
注意:以下编译会报错:
class Fu{
String name;
public Fu(String name){
this.name=name
}
public void eat(){
System.out.println(name+'吃饭')
}
}
class Zi extends Fu{
String num;
}
class Demo10{
public static void main(String[] args){
Zi z=new Zi();
}
}
**原因:new Zi会调用Zi类的无参构造方法,由于Zi继承于父类,那么首先会调用父类的
无参构造方法(因为没有子类没有指定调用父类哪个方法),而父类没有无参构造方法。
所以报错。**
三.方法重写
方法重写的前提: 必须要存在继承的关系。
方法的重写: 子父类出了同名的函数,这个我们就称作为方法的重写。
什么是时候要使用方法的重写:父类的功能无法满足子类的需求时。
方法重写要注意的事项:
1.方法重写时,方法名与形参列表必须一致
2.方法重写时,子类的权限修饰符必须要大于或者等于父类的权限修饰符
3.方法重写时,子类的返回值类型必须要小于或者 等于父类的返回值类型
4.方法重写时,子类抛出的异常类型要小于或者等于父类抛出的异常类型Exception(最坏)RuntimeException(小坏)
方法的重载:在一个类中 存在两个或者两个 以上的同名函数,称作为方法重载
方法重载的要求:
1.函数名要一致
2.形参列表不一致(形参的个数或形参 的类型不一致)
3.与返回值类型无关
四.练习
题目:
使用java描述一下普通的学生、 java基础班的学生、 就业班的学生。
所有的学生都会学习。但是学习的内容不一样。
普通 的学生: 马克思列宁主义。
基础班的学生:学习的是 javase。
就业班学生: javaee+android.
//普通的学生类
class Student{
String name;
//构造函数
public Student(String name){
this.name = name;
}
public void study(){
System.out.println(name+"学习马克思列宁主义");
}
}
//基础班的学生是属于学生中一种
class BaseStudent extends Student{
public BaseStudent(String name){
super(name);//指定调用父类构造函数
}
//重写
public void study(){
System.out.println(name+"学习javase..");
}
}
//就业班学生 也是属于普通学生中一种
class WorkStudent extends Student{
//构造 函数
public WorkStudent(String name){
super(name);
}
//重写
public void study(){
System.out.println(name+"学习javaee+android..");
}
}
class Demo11
{
public static void main(String[] args)
{
BaseStudent s = new BaseStudent("居东东");
s.study();
//创建一个就业班的学生
WorkStudent w = new WorkStudent("张三");
w.study();
}
}