一、继承:
1.父类(基类):
- 父类可以有多个子类
- 父类是被继承的类。它包含子类所继承的属性和方法。
- 父类可以是一个具体的类,也可以是一个抽象类。
2.子类(派生类):
- 子类只能有一个父类,且不能互相继承
- 子类是从父类继承的类。它可以继承父类的成员(字段和方法),并且可以添加自己的成员或重写父类的方法。
继承的本质就是代码的复用,是子类用父类的代码,父类用不了子类的代码
例:
public class Person {
public Double height;
public String name;
public char sex;
public void run(){
System.out.println("任何人都可以跑!");
}
public void a(){
System.out.println(".............");
}
}
-------------------------------------------------------
public class Student extends Person{
}
-------------------------------------------------------
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.run();
}
}
内存图以及流程:
此时,Test可以调用run方法,因为Student继承了来自Person的方法,由此可得出,继承是代码的复用。
二、类的加载顺序:
1.先完成扫描:寻找父类
2.编译:父类.java----->父类.class,子类.java -------->子类.class
3.把父类.class和子类.class放入方法区中,接着main方法入栈
4.先创建父类对象,在创建子类对象。如果调用子类对象,也要先创建父类对象
5.static在main方法前执行
例:如当前代码,
1.扫描发现父类,编译父类Base.class进入方法区,子类Test.class进入方法区
2.执行Base里的static方法--------------->输出base static
3.执行Test里的static方法 ---------------> 输出test static
4.Test中的main方法入栈,创建子类对象,但是前提创建父类对象---------->输出base constructor
5.创建完父类对象,创建子类对象-------------->输出 Test constructor
public class Test extends Base{
public Test(){
System.out.println("test constructor");
}
public static void main(String[] args){
new Test();
}
static {
System.out.println("test static");
}
}
class Base{
static {
System.out.println("base static");
}
public Base(){
System.out.println("base constructor");
}
}
-----------------------------------------------
//运行结果:
// base static
// test static
// base constructor
// test constructor
三、方法的重载和重写:
1.方法的重载:
定义:
它指的是在同一个类当中,方法名相同但参数列表不同
例:
public class A {
public void study(){
}
public void study(String name){
}
//同在A类,方法名同为study,但参数列表不同
}
作用:
1. 增强代码的可读性和可维护性
2. 支持不同的参数组合,只要它们的参数列表不同(包括参数类型、数量和顺序)。这样可以提供对不同参数组合的处理方式
3. 增加灵活性和功能
4. 简化API设计, 重载帮助设计更简洁、易用的API。它允许用户用一致的方法名来调用不同的操作,而无需记住多个方法名。例如:
public class FileReader {
public void read(String fileName) {
// 从文件中读取内容
}
public void read(String fileName, String encoding) {
// 从文件中读取内容,指定编码
}
public void read(InputStream inputStream) {
// 从输入流中读取内容
}
}
5. 与继承和多态的配合 方法重载是多态的一部分,使得子类能够根据需要实现或扩展方法的功能,而不需要改变方法名。重载方法可以提高代码的复用性和扩展性。
2.方法的重写:
定义:
发生在父子类当中,子类重新实现父类方法的功能。方法重写之后,子类对象调用的也是重写后的方法
例:
public class A {
public void study(){
}
public void study(String name){
}
public void run(){
System.out.println("A跑的很快!");
}
}
----------------------------------------------
public class Test {
public static void main(String[] args) {
B b = new B();
b.run();
}
}
--------------------------------------------
public class B extends A{
public void run(){
System.out.println("B跑的很快!");
}
}
此时的运行结果:B跑的很快!
存在意义:
在复用的过程当中,父类的方法不一定完全适用于子类,在这个时候就涉及到方法的重写了。
四、Java修饰符、普通方法、构造器:
1.Java修饰符:
本类 | 子类 | 同包 | 不同包 | |
public | 可以访问 | 可以访问 | 可以访问 | 可以访问 |
protected | 可以访问 | 可以访问 | 可以访问 | 无法访问 |
不写 | 可以访问 | 可以访问 | 可以访问 | 无法访问 |
private | 可以访问 | 无法访问 | 无法访问 | 无法访问 |
public 修饰的代码,其他类都可以访问
private 修饰的代码,本类是可以访问的,但是其他类不可以访问
2.方法的特点
1.方法是有访问权限的
2.方法必须写上返回数据的类型,如果不需要返回数据就写void
3.在同一个类当中,方法名可以相同但是方法的签名不能相同(方法的签名=方法名+参数列表的类型) ------>从此引申出方法的重载
4.方法上可以使用其他的关键字进行修饰,比如static和final,它们有这不同的意义
3.构造器、构造器的特点
1.构造器是指在创建对象的时候,给对象赋值赋初始值
特点:
1.在类当中构造函数必须和类名相同
2.在类当中有一个默认的不显示的无参数的构造器,一旦在类当中写一个构造器时,无参数的构造器会被覆盖掉。
3.构造器不需要写返回类型
4.一个类当中可以有多个构造函数