当前位置: 首页 > article >正文

java中的方法的重载和重写、构造器

目录

  • 方法的重载和重写、构造器
    • 1.java的修饰符:
    • 2.普通方法
    • 3.构造器(也叫构造方法/构造函数)
    • 4.方法的重载
    • 5.补充
    • 6.方法的重写
    • 7.类的执行顺序
    • 8.再看方法的重写

方法的重载和重写、构造器

1.java的修饰符:

在这里插入图片描述

public修饰的代码,本类和其他类都是可以访问的

private修饰的代码,本类可以访问,但是其他类不可以访问的

2.普通方法

(1)方法是有访问权限的

(2)方法必须写上返回数据的类型,如果不需要返回数据就写void

void stu(){
    System.out.println("学生好好学习");
    return;
}
private int age(){
    return 18;
}

(3)在同一个类当中,方法名可以相同但是方法的签名不能相同(方法的签名=方法名+参数列表的类型(string,int,double…))

例:

void stu(){
    System.out.println("学生好好学习");
}
void stu(String name){
    System.out.println("学生好好学习");
}
void stu(int name){
    System.out.println("学生好好学习");
}
void stu(int name, String a){
    System.out.println("学生好好学习");
}

void stu(int name){
    System.out.println("学生好好学习");
}
void stu(int age){
    System.out.println("学生好好学习");
}

(4)方法上可以用其他的关键字进行修饰,比如 static 和 final,他们有不同的意义

3.构造器(也叫构造方法/构造函数)

作用:在创建对象的时候给对象的变量赋值

(1).在类中构造函数必须和类名相同

(2).在类中有一个默认的不显示的无参数的构造器,

一旦你在类中写一个构造器,那么那个无参构造器就会被覆盖

(3).构造器不需要写返回值

(4).一个类中可以有多个构造函数

public class A {
    private String name;
    private int age;
    private char sex;
    private int sno;
   
    public A(String name){
        this.name=name;
    }//这就是一个构造器
    public A(String name,int age){
        this.name=name;
        this.age=age;
    }
}
public class B {
    public static void main(String[] args) {
        A a=new A("张三");
    }
}

4.方法的重载

发生在本类中; 在同一类中,方法名相同但是列表不同就是方法的重载;能提高方法的功能

这就是方法的重载:

public void stu(){

}
public void stu(String name){

}
public void stu(String name,int age){

}

5.补充

这个时候没有任何方法

在这里插入图片描述

这个时候可以调用很多方法

在这里插入图片描述

原因:

方法的执行流程是不断入栈出栈,一个方法想要入栈,只能被另一个方法调用,main方法本身就需要入栈

6.方法的重写

(1)发生在父子类当中,子类重新实现父类方法的功能

(2)为什么会重写?

继承的本质是代码的复用,在复用的过程中,父类的方法的实现不一定完全使用子类,这个时候就涉及到方法的重写

方法重写之后,子类对象调用的也是重写后的方法

重写前:

A:

public class A{
    public void run(){
        System.out.println("A跑的很快");
    }
}

B:

public class B extends A{
    
}

Test:

public class Test {
    public static void main(String[] args) {
        B b=new B();
        b.run();
    }
}

运行:

在这里插入图片描述

重写后:

A:

public class A{
    public void run(){
        System.out.println("A跑的很快");
    }
}

B:

public class B extends A{
    public void run(){
        System.out.println("B跑的很快");
    }
}

Test:

public class Test {
    public static void main(String[] args) {
        B b=new B();
        b.run();
    }
}

运行:

在这里插入图片描述

7.类的执行顺序

static修饰的代码块在main方法执行之前执行,其目的是修饰 main方法

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");
    }
}

运行结果:

在这里插入图片描述

这样输出的原因:

在这里插入图片描述

先扫描再编译;先执行父类,再执行子类

程序执行先去找main()方法启动程序

1.扫描Test类,发现有父类Base类,先去扫描父类,发现Base类没有父类*

2.将Base.class加载进方法区,此时Base类中的static代码块执行*

3.将Test.class加载进方法区,此时Test类中的static代码块执行*

4,main方法入栈,main执行new Test();去创建Test类的对象*

5.创建子类对象之前先创建父类对象,所以先执行Base()构造器,再执行Test()构造器*

(1)先扫描Test,因为这里有main方法,扫描之后发现有父类Base,就扫描Base(直到没有父类为止)

(2)然后执行Base,static修饰的代码块在main方法执行之前执行,其目的是修饰main方法,所以先输出 base static,

(3)然后执行Test, 先执行static修饰的代码块,所以接下来输出 test static

(4)然后main方法入栈,调用Test(),创建子类对象,一定先去创建父类对象,所以先执行Base类的构造器,再执行Test类的构造器,所以接下来输出 base constructor,

(5)最后输出 test constructor

8.再看方法的重写

重写前

(子类访问不到父类私有的变量和方法)

在这里插入图片描述

重写后

(一旦发生重写,子类对象优先调用自身重写的方法)

在这里插入图片描述


http://www.kler.cn/a/447662.html

相关文章:

  • 机器学习基础算法 (二)-逻辑回归
  • Vue3之状态管理Vuex
  • Spring Boot 2.1.7 数据源自动加载过程详解
  • 【ETCD】【源码阅读】深入分析 storeTxnWrite.Put方法源码
  • 日本充电桩标准--CHAdeMO介绍
  • 使用vcpkg安装opencv>=4.9后#include<opencv2/opencv.hpp>#include<opencv2/core.hpp>无效
  • MySQL基础笔记(三)
  • 鸿蒙开发(16)使用DevEco Studio上的Git工具进行多远程仓管理
  • Redis分片集群学习总结
  • ROS2学习配套C++知识
  • Pika Labs技术浅析(五):商业智能技术
  • 【Linux】ubuntu通过远程命令行启动桌面应用
  • 前端监控之sourcemap精准定位和还原错误源码
  • 队列+宽搜
  • 力扣-图论-70【算法学习day.70】
  • 【LeetCode热题100】BFS解决拓扑排序
  • 基于K8S的微服务:一、服务发现,负载均衡测试(附calico网络问题解决)
  • 中研博硕英才网举办中国北京千名博士项目对接暨人才引进签约洽谈会
  • 37.1 prometheus管理接口源码讲解
  • 使用FakeSMTP创建本地SMTP服务器接收邮件具体实现。
  • 【学习总结|DAY022】Java网络编程
  • 学习笔记:Verilog过程结构及在线仿真
  • MFC 实现动态控件调整和主题切换
  • 驾驶证识别API-JavaScript驾驶证ocr接口集成-场景解析
  • xcode15 报错 does not contain ‘libarclite‘
  • 2-Gin 框架中的路由 --[Gin 框架入门精讲与实战案例]