1.继承的概述
继承是面向对象三大特征之一。可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。
继承的格式:
·格式:public class 子类名 extends 父类名{ }
·范例:public class Zi extends Fu{ }
·Zi:是子类,也被称为派生类
·Fu: 是父类,也被称为基类、超类
2.子类的特点
子类可以有父类的内容
子类还可以有自己特有的内容
3.代码演示
package com.aynu1;
public class Fu {
public void show(){
System.out.println("show方法被调用");
}
}
package com.aynu1;
public class Zi extends Fu{ //Zi类继承了Fu类的方法
public void method(){
System.out.println("method方法被调用");
}
}
package com.aynu1;
public class Demo {
public static void main(String[] args) {
Fu f =new Fu();
f.show();
Zi z =new Zi();
z.method();
z.show();
}
}
运行结果 :
show方法被调用
method方法被调用
show方法被调用
4.继承的好处和弊端
继承好处:
1.提高了代码的复用性(多个类相同的成员可以放到同一个类中)
2.提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
继承弊端:
继承让类与类之间产生了关系,类的耦合性增强了,当父类发生改变时子类实现也不得不跟着变化,削弱了子类的独立性
什么时候使用继承:
继承体现的关系: is a
假设法:我有两个类A和B,如果他们满足A是B的一种,或者B是A的一种,就说明他们存在继承关系,这个时候就可以考虑使用继承来体现,否则就不能乱用继承。
举例: 苹果和水果,猫和动物,猫和狗 (苹果是水果的一种可以使用继承;猫是动物的一种可以使用继承;猫和狗不能用继承。)
5.继承中变量的访问特点
在子类方法中访问一个变量
子类局部范围找
子类成员范围找
父类成员范围找
如果都没有就报错(不考虑父亲的父亲...)
代码演示:
package com.aynu2;
public class Fu {
public int age=40;
}
package com.aynu2;
public class Zi extends Fu{ //zi类继承fu类
//身高
public int height=175;
//年龄
public int age=20;
public void show(){
int age=30;
System.out.println(age);
System.out.println(height);
//报错
// System.out.println(weight);
}
}
package com.aynu2;
public class Demo {
public static void main(String[] args) {
//创建对象调用方法
Zi z=new Zi();
z.show();
}
}
输出结果:
30
175
6.super
super关键字的用法和this关键字的用法相似
this:代表本类对象的引用
super:代表父类存储空间的表示(可以理解为父类对象的引用)
关键字 | 访问成员变量 | 访问构造方法 | 访问成员变量 |
this | this.成员变量 访问本类成员变量 | this(...) 访问本类构造方法 | this.成员方法(...) 访问本类成员方法 |
super | super.成员变量 访问父类成员变量 | super(...) 访问父类构造方法 | super.成员方法(...) 访问父类成员方法 |
代码演示:
package com.aynu3;
public class Fu {
public int age = 40;
}
package com.aynu3;
public class Zi extends Fu{
public int age=30;
public void show(){
int age=20;
System.out.println(age);
//我要访问本类成员变量age
System.out.println(this.age);
//我要访问父类的成员变量age
System.out.println(super.age);
}
}
package com.aynu3;
public class Demo {
public static void main(String[] args) {
Zi z=new Zi();
z.show();
}
}
运行结果:
20
30
40
7.继承中构造方法的访问特点
子类中所有的构造方法默认都会访问父类中的无参构造方法
因为子类会继承父类中的数据。所以初始化之前,一定要先完成父类数据的初始化
每一个子类构造方法的第一条语句默认都是 super()
如果父类中没有无参构造方法,只有带参构造方法应该怎么办
通过使用super关键字去显示的调用父类的带参构造方法
在父类中自己提供一个无参构造方法
推荐:自己提供无参构造方法
8.继承中成员方法的访问特点
通过子类对象访问一个方法
子类成员范围找
父类成员范围找
如果没有就报错(不考虑父亲的父亲)
9.方法重写
方法重写的概述
子类中出现了和父类一模一样的方法声明
方法重新的应用
当子类需要父类的功能,而功能主题子类有自己特有的内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容
/*
* 手机类
* */
public class Phone {
public void call(String name) {
System.out.println("给" + name + "打电话");
}
}
/*
* 新手机
* */
public class NewPhone extends Phone{
/* public void call(String name) {
System.out.println("开启视频功能");
// System.out.println("给" + name + "打电话");
super.call("郭帅龙");*/
@Override
public void call(String name) {
System.out.println("开启视频功能");
// System.out.println("给" + name + "打电话");
super.call("郭帅龙");
}
}
/*
测试类
* */
public class PhoneDemo {
public static void main(String[] args) {
//创建对象
Phone p =new Phone();
p.call("郭帅龙");
System.out.println("--------");
NewPhone np =new NewPhone();
np.call("郭帅龙");
}
}
运行结果:
给郭帅龙打电话
--------
开启视频功能
给郭帅龙打电话
@Override
是一个注解(可以帮助我们检查重写方法的方法声明的正确性)
方法重写注意事项:
私有方法不能被重写(父类私有成员子类是不能继承的)
子类方法的访问权限不能更低(public>默认>私有)
private修饰的只能在本类中被访问
10.java继承中的注意事项
java中类只支持单继承,不支持多继承。
Java中类支持多层继承。(例如 父亲继承爷爷,儿子继承父亲)
修饰符 | 同一个类中 | 同一个包中子类无关类 | 不同包的子类 | 不同包的无关类 |
public | √ | |||
默认 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
final
final关键字是最终的意思,可以修饰成员方法、成员变量、类
final修饰的特点
修饰方法:表面该方法是最终方法,不能被重写
修饰变量:表面该变量是常量,不能再次被赋值
修饰类:表面该类是最终类,不能被继承
final修饰局部变量
变量是基本类型:final修饰指的是基本类型的数据值不能发生改变。
变量是引用类型:final修饰指的是引用类型的地址值不能发生改变,但是地址里面的内容是可以发生改变的。
public class FinalDemo {
public static void main(String[] args) {
//final修饰基本类型变量
final int age=20;
// age=100;
System.out.println(age);
//final修饰引用类型变量
Student s=new Student();
s.age=100;
System.out.println(s.age);
// s=new Student();
}
}
public class Student {
public int age=20;
}
运行结果:
20
100
static 关键字是静态的意思,可以修饰成员方法,成员变量
static 修饰的特点 举例: public static String xxx
被类的对象所共享
这也是我们判断是否使用静态关键字的条件
可以通过类名调用
当然,也可以通过对象名调用
推荐使用类名调用
static访问特点
非静态的成员方法:
能访问静态的成员变量
能访问非静态的成员变量
能访问静态的成员方法
能访问非静态的成员方法
静态的成员方法:
能访问静态的成员变量
能访问静态的成员方法
简而言之就是:静态成员方法只能访问静态成员。