一、概述
继承是面向对象的三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法
格式:public class 子类名 extends 父类名 ()
//父类
public class Fu {
public void show(){
System.out.println("show方法被调用");
}
}
//子类
public class Zi extends Fu{
public void method(){
System.out.println("method方法被调用");
}
}
//测试类
public class Test {
public static void main(String[] args) {
Fu f=new Fu();
f.show();
Zi z=new Zi();
z.method();
z.show();
}
}
二、继承的好处与弊端
1.好处:提高了代码的复用性(多个类相同的成员可以放到同一个类中)
提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
2.坏处:继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性
3.什么时候使用继承
假设有两个类A和B,如果满足A是B的一种,或者B是A的一种,就说明他们存在继承关系,这个时候就可以使用继承来体现,否则就不能滥用继承,例如苹果和水果,猫和动物
三、继承中变量的访问特点
在子类方法中访问一个变量:1.子类局部范围找
2.子类成员范围找
3.父类成员范围找
如果都没有则报错。
四、super
关键字 | 访问成员变量 | 访问构造方法 | 访问成员方法 |
this | this.成员变量 访问本类成员变量 |
this(...) 访问本类构造方法 |
this.成员方法(...) 访问本类成员方法 |
super | super.成员变量 访问父类成员变量 |
super(...) 访问父类构造方法 |
super.成员方法(...) 访问父类成员方法 |
//父类
public class Fu {
public int age = 40;
}
//子类
public class Zi extends Fu{
public int age = 20;
public void show(){
int age = 30;
System.out.println(age);
//访问本类成员变量,即输出age=20
System.out.println(this.age);
//访问父类成员变量,即输出age=40
System.out.println(super.age);
}
}
//测试类
public class Test {
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
五、继承中构造方法的访问特点
1.子类中所有的构造方法默认都会访问父类中的无参构造方法
原因:因为子类会继承父类中的数据,可能还会使用父类中的数据。所以,子类初始化之前,一定要先完成父类数据的初始化;每个子类构造方法的第一条语句默认都是super()。
2.如果父类中只有带参构造方法,该怎么办呢?
通过使用super关键字去显示的调用父类的带参构造方法;在父类中自己提供一个无参构造方法
六、继承中成员方法的访问特点
通过子类对象访问一个方法:子类成员范围寻找;父类成员范围寻找;如果没有就报错
七、方法重写
概述:子类中出现了和父类一样的方法声明
应用:当子类需要父类的功能,而功能主体子类有自己特有的内容时,可以重写父类中的方法,这样既沿袭了父类的功能,又定义了子类特有的内容
//手机类
public class Phone {
public void call(String name){
System.out.println("给"+name+"打电话");
}
}
//新手机类
public class NewPhone extends Phone{
@Override
public void call(String name){
System.out.println("开始视频功能");
super.call(name);
}
}
//测试类
public class PhoneDmeo {
public static void main(String[] args) {
Phone p = new Phone();
p.call("蟹老板");//给蟹老板打电话
NewPhone np = new NewPhone();
np.call("蟹老板");//开始视频功能,给蟹老板打电话
}
}
注意事项:私有方法不能被重写;子类方法访问权限不能更低(public>默认>私有)
八、java中继承方法的注意事项
java中类只支持单继承,不支持多继承;java中类支持多层继承
九、修饰符
1.包
概述:其实就是文件夹,对类进行分类管理
定义格式:package 包名;例:package com.hello;
带包的java类编译和执行:
手动建包:
按照以前的格式编译java文件 | javac HelloWorld.java |
手动创建包 | 在c盘建立文件夹com,然后在com下建立文件夹hello |
把class文件放到包的最里面 | 把HelloWorld.class文件放到com下hello这个文件夹下 |
带包执行 | java com.hello.HelloWorld |
自动建包:javac -d.HelloWorld.java java.com.hello.HelloWorld
2.导包
概述:使用不同包下的类时,使用的时候要写类的全路径,写起来太麻烦了,为了简化带包的操作,java提供了导包的功能
格式:import 包名;
范例:import cn.itcast.Teacher
3.修饰符
(1)权限修饰符
修饰符 | 同一个类中 | 同一个包中子类无关类 | 不同包中的子类 | 不同包的无关类 |
private | √ | |||
默认 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
(2)状态修饰符
1.final
final关键字是最终的意思,可以修饰成员方法、成员变量、类
final修饰的特点:
修饰方法:表明该方法是最终方法,不能被重写
修饰变量:表明该变量是常量,不能再次被赋值
修饰类:表明该类是最终类,不能被继承
final修饰局部变量:
变量是基本类型:final修饰指的是基本类型的数据值不能发生改变
变量是引用类型:final修饰指的是引用类型的地址值不能发生改变,但地址里面的内容是可以改变
2.static
static关键字是静态的意思,可以修饰成员方法、成员变量
static修饰的特点:
被类的所有对象共享:判断是否使用静态关键字的条件
可以通过类名调用,也可以通过对象名调用,推荐使用类名调用
static访问特点:
静态成员方法只能访问静态成员