zoukankan      html  css  js  c++  java
  • 【JavaSE】3、方法

    1.何谓方法

    方法:解决一类问题的步骤的有序组合,包含于类或对象中;方法在程序中被创建,在其他地方被引用。

    设计方法的原则:保持方法的原子性,就是一个方法只完成1个功能,这样利于后期的扩展。

    tips:System.out.println(),那么它是什么呢?调用系统类System中的标准输出对象out的printIn方法。

    2.方法的定义及调用

    方法包含一个方法头和一个方法体。

    1、方法定义:

    • 修饰符:可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。如public。
    • 返回值类型:是方法返回值的数据类型。有些方法没有返回值,这时returnValueType是void。
    • 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
    • 参数:是可选的。形式参数:在方法被调用时用于接收外界输入的数据。实参:调用方法时实际传给方法的数据。
    • 方法体:方法体包含具体的语句,定义该方法的功能。
    • return:如果有返回值,return需要放在最后。还可被用来终止方法。

    2、调用方法:对象名.方法名(实参列表)

    Java支持两种调用方法的方式,根据方法是否返回值来选择:

    • 当方法返回一个值的时候,方法调用通常被当做一个值。

    • 如果方法返回值是void,方法调用一定是一条语句。

    3.按值调用&按引用调用

    java是按值调用。方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值,这句话相当重要,这是按值调用与引用调用的根本区别。

    1、按值调用(call by value):表示方法接受的是——调用者提供的值。

    package github.method;
    
    public class HomeWork01 {
        private static int x = 10;
    
        public static void updataeValue(int value){
            value = 3 * value;
            System.out.println("value的值:" + value);
        }
    
        public static void main(String[] args) {
            System.out.println("调用前的值:" + x); // 10
            updataeValue(x); // 30,方法中value被初始化为x的一个拷贝,方法结束后,value被回收。
            System.out.println("调用后的值:" + x); // 10
        }
    }
    

    结论:当传递方法参数类型为基本数据类型(数字以及布尔值)时,一个方法是不可能修改一个基本数据类型的参数。

    2、按引用调用(call by reference):表示方法接收的是——调用者提供的变量地址(C语言是指针,当然java没有指针的概念)

    java中除了基本数据类型还有引用数据类型,也就是对象引用,对于这种数据类型是什么情况呢?看下面例子:

    // 一、声明一个User对象类型
    package github.method;
    
    public class User {
        private String name;
        public User(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    
    // 二、执行class
    package github.method;
    
    public class HomeWork02 {
        public static void updateUser(User student){
            student.setName("subeiLY"); // 2、student的setName作用在引用对象上,User对象内部值被修改。
        }
    
        public static void main(String[] args) {
            User user = new User("SUBEI");
            System.out.println("调用user前:" + user.getName()); // SUBEI
            updateUser(user); // 1、student变量被初始化为user值的拷贝,这里是一个对象的引用
            // 3、updateUser方法结束后,student被释放,但user还没有变,依然指向User对象。
            System.out.println("调用user后:" + user.getName()); // subeiLY
        }
    }
    

    结论:User的值被改变了,但这是将最开始所对应得值改变了,把User的本身属性改变了,才会进行值得变化,虽然看似是按引用传递值,但是实际上是将值改变了。

    到这里可能有些蒙逼,下面通过一个反例来说明:

    package github.method;
    
    public class HomeWork03 {
        public static void swap(User x,User y){ 
            User temp = x;
            x = y;
            y = temp;
        }
    
        public static void main(String[] args) {
            User user = new User("user");
            User stu = new User("stu");
            System.out.println("调用前user:"+ user.getName()); // user
            System.out.println("调用前stu:"+ stu.getName()); // stu
            swap(user, stu); // x、y被初始化为两个对象引用的拷贝,方法并没有改变存储在变量user和stu中的对象引用
            System.out.println("调用后user:"+ user.getName()); // user
            System.out.println("调用后stu:"+  stu.getName()); // stu
        }
    }
    

    这个过程说明了java对对象采用的不是引用调用,而是对象引用进行的是值传递,这里可以简单理解为这就是按值调用和引用调用的区别。

    必须明白即使java函数在传递引用数据类型时,只是拷贝了引用的值,之所以能修改引用数据是因为它们同时指向了一个对象,但这仍然是按值调用而不是引用调用。

    总结:

    • 一个方法不能修改一个基本数据类型的参数(数值型和布尔型)。
    • 一个方法可以修改一个引用所指向的对象状态,但这仍然是按值调用而非引用调用。
    • 上面两种传递都进行了值拷贝的过程。

    4.方法重载

    重载就是在一个类中,有相同的函数名称,但形参不同的函数

    1、方法的重载的规则:方法名称必须相同。参数列表必须不同(个数不同,或类型不同,参数排列顺序不同等)。方法的返回类型可以相同也可以不相同。

    实现理论:方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。

    tips:命令行传参——运行一个程序时传递给它消息,这要靠传递命令行参数给main()函数实现。(在文件所在目录编译java文件,在src下运行class文件)

    2、可变参数

    JDK1.5开始,Java支持传递同类型的可变参数(不定项)给一个方法。

    在方法声明中,在指定参数类型后加一个省略号(...)。一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。

    public void test(int... i){}

    5.总结:

    方法的调用:

    静态方法:可以通过类直接调用,在类加载时加载,不能调用非静态方法。

    非静态方法:通过实例化对象调用

    public class Demo {
        public static void main(String[] args) {
            Student1.say();  // 通过类调用静态方法(static)
            
            // Student2.say(); 会报错,不能通过类直接调用非静态方法(public)
            Student2 student2 = new Student2();  // 通过实例化对象调用非静态方法(public)
            student2.say();
        }
    }
    
    public class Student1 {
        public static void say(){
            System.out.println("学生说话了");
        }
    }
    
    public class Student2 {
        public void say(){
            System.out.println("学生说话了");
        }
    }
    
  • 相关阅读:
    JAVA代码覆盖率工具JaCoCo-原理篇
    (转载)比较web ui 框架
    sql拼接
    解决com.mysql.jdbc.PacketTooBigException: Packet for query is too large问题
    字符串中重复出现字符串个数
    Unable to load annotation processor factory
    三目运算符
    WSGI剖析
    深入剖析cpp对象模型
    Cpp下匿名对象探究
  • 原文地址:https://www.cnblogs.com/mind18/p/15408600.html
Copyright © 2011-2022 走看看