java中方法的细分(普通方法,静态方法,构造方法)

简介: java中方法的细分(普通方法,静态方法,构造方法)

1.1普通方法

方法通俗点来讲用于描述一个对象的行为.例如一个人可以有很多行为,吃饭睡觉打豆豆,而这些行为是由方法来实现的。


行为也被称作方法或者函数.


代码示例:

class Person {
    public int age = 18;
    public String name = "张三";
    public void show() {
        System.out.println("我叫" + name + ", 今年" + age + "岁");
    }
}
class Test {
    public static void main(String[] args) {
        Person person = new Person();
        person.show();
    }
}
// 执行结果
我叫张三,今年18岁


此处的 show 方法, 表示 Person 这个对象具有一个 "展示自我" 的行为.


这样的 show 方法是和 person 实例相关联的. 如果创建了其他实例, 那么 show 的行为就会发生变化

Person person2 = new Person(); person2.name = " 李 四 "; 
person2.age = 20;
person2.show()
// 执行结果
我叫李四, 今年20岁

方法中还有一种特殊的方法称为 构造方法 (construction method)。


在实例化对象的时候会被自动调用到的方法, 方法名字和类名相同, 用于对象的初始化.虽然我们前面已经能将属性就地初始化, 但是有些时候可能需要进行一些更复杂的初始化逻辑, 那么就可以使用构造方法.后面我们会详细介绍构造方法的语法.


1.2静态方法

static关键字修饰方法,此方法称为静态方法,同时也成为类方法

1.访问方式:通过类名.静态成员方法名(),同时需要注意的是通过对象的引用也是可以访问静态成员变量的,虽然在书写时编译器(idea)可能会报错,但是运行时是不会报错的。


2.特点:


   静态方法属于类,而不属于类的对象。


  可以直接调用静态方法,而无需创建类的实例。


  静态方法可以访问静态数据成员,并可以更改静态数据成员的值。


代码示例:

class TestDemo {
    public int a;
    public static int count;
    public static void change() {
        count = 100;
        //a = 10; error 不可以访问非静态数据成员
    }
}
public class Main{
    public static void main(String[] args) {
        TestDemo.change();//无需创建实例对象 就可以调用
        System.out.println(TestDemo.count);
    }


注意事项:静态方法和实例无关, 而是和类相关. 因此会导致几种情况:


(1): 在静态方法的内部是不能访问实例成员变量的,同样也不能调用实例成员方法


(2): 注意不管是静态的方法还是非静态的方法中都不能定义静态的变量,但是可以定义非静态的

      原因:因为静态的变量属于类并不属于方法,也就是我们俗称的类变量


(3):this和super两个关键字不能在静态上下文中使用(this 是当前对象的引用, super是父类对象的引用,而静态是不依赖对象的,所以不能在静态方法中使用this和super关键字).


(4):所有被static所修饰的方法或者属性,全部不依赖于对象。


1.3构造方法

1.3.1基本语法

构造方法是一种特殊方法, 使用关键字new实例化新对象时会被自动调用, 用于完成初始化操作.


实例化对象的过程分为两步:


1.为对象分配内存空间


2.调用合适的构造方法,合适意味着构造方法并不止一个。


语法规则

方法名称必须与类名称相同

每一个类中一定至少存在一个构造方法(没有明确定义,则系统自动生成一个无参构造)

构造方法没有返回值类型声明

注意事项

1.如果类中没有提供任何的构造函数,那么编译器会默认生成一个不带有参数的构造函数


2.若类中定义了构造方法,则默认的无参构造将不再生成


3.构造方法支持重载. 规则和普通方法的重载一致.


4.构造函数的作用就是构造对象,同时也可以在构造对象的同时对对象的成员进行初始化


5.不同的构造方法的调用主要是看括号内部参数是什么,就调用相对应的即可


代码示例:


class People {
    private String name;
    private int age;
    public String sex;
    public static int count;
    //构造方法
    People() {
        System.out.println("不带有参数的构造方法");
    }
    People(String name) {
        System.out.println("带有1个参数,String的构造方法!");
    }
    People(String name, int age) {
        System.out.println("带有2个参数,String,int的构造方法!");
    }
    People(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    public void print() {
        System.out.println("name=" + name + " " + "age=" + age + " " + "sex=" + sex);
    }
}
public class LeiHeDuiXiang3 {
    public static void main(String[] args) {
        //不同的构造方法的调用主要是看括号内部参数是什么,就调用相对应的即可
        //输出结果为 System.out.println("不带有参数的构造方法");
        People person = new People();
        //输出结果为 System.out.println("带有1个参数,String的构造方法!");
        People person1 = new People("songbiao");
        //输出结果为System.out.println("带有2个参数,String,int的构造方法!");
        People person2 = new People("songbiao", 100);
        System.out.println("==============================================");
        //构造函数的作用就是构造对象,同时也可以在构造对象的同时对对象的成员进行初始化
        People person3 = new People("songbiao", 100, "男");
        person3.print();
    }
}

在这里注意一个点。假若我们此时去掉People()这个任何参数的构造函数的话,当我们new People()的时候程序便会报错,为什么?

答:因为当我们不定义构造函数时,其实编译器会默认给我们生成一个无参数的构造函数,而当我们定义了其他的有参的构造函数而没有定义无参数的构造函数时,此时系统不会再默认为我们定义无参数的构造函数了,那么当我们通过语句new People()实例化一个对象时,便找不到对应的构造函数了,那么此时需要我们自己定义一个无参数的构造函数。


1.3.2this关键字(重点)

this表示当前对象引用(注意不是当前对象). 可以借助 this 来访问对象的字段和方法.


在这里讲下为什么this是对象的引用而不是对象?

答:首先来看下实例化一个对象分为几步吧:

第1步:为对象分配内存

第2步:调用合适的构造方法。注意:合适二字意味着构造函数可不止一个

this不是对象的原因是当我们完成对构造方法的调用后对象才会创建,而我们此时能在构造函数中去使用this,则说明this出现在对象创立之前,所以this并不是指对象

当我们在实例化对象的时候,第一步是为对象分配内存,既然有了内存就一定有了地址,地址是存在引用当中的,所以我们说此时this指的是对象的引用。


this的三种使用方式:


1:this访问成员变量

2:this调用成员方法

3:this调用构造方法:在一个方法内部调用另外一个构造方法


代码示例:

class People1 {
    private String name;
    private int age;
    public String sex;
    public static int count;
    //this调用构造方法
    People1() {
        /*
        注意this不能调用本身的构造函数,不然会陷入死循环
        this();
        */
        /*
        this在调用构造方法时只能放在第一行并且只能调用一次构造函数
        this在调用构造方法时只能用在构造方法中
        */
        this("songbiao");
        /*
        注意此时this如果想要调用第二个构造函数便会报错
        this("haha",10);
         */
        System.out.println("haha");
    }
    People1(String name) {
        System.out.println("hehe");
    }
    People1(String name, int age) {
        System.out.println("heheda");
    }
    //普通成员方法
    public void eat() {
        People1 p = new People1();
        System.out.println("吃饭");
    }
    /*1.普通的成员方法中是可以使用this来访问实例成员变量和静态成员变量的
      2.普通的成员方法中是可以使用this来调用实例成员方法和静态成员方法的
    */
    public  void print() {
        //使用this来访问实例成员变量
        System.out.println("name=" + this.name + " " + "age=" + this.age + " " + "sex=" + sex);
        //使用this来访问静态成员变量,虽然不妥但是编译时不会出错的
        System.out.println(this.count);
        //使用this来调用实例成员方法
        this.eat();
        //使用this来调用静态成员方法,虽然不妥但是编译时不会出错的
        this.func1();
        //可以直接调用静态成员方法
        func1();
        //可以直接调用实例成员方法
        eat();
         /*
         注意不管是静态的方法还是非静态的方法中都不能定义静态的变量,但是可以定义非静态的
         原因:因为静态的变量属于类并不属于方法,也就是我们俗称的类变量
         static int a=10;(不允许)
        */
        //可以直接访问静态成员方法
        count++;
    }
    public static void func1() {
        int a = 10;
        System.out.println("sss");
    }
    /*
    静态方法中是不能使用this的,原因是this代表对象的引用,而静态是不依赖对象的
     */
    public static void func() {
        // 静态方法中不能使用this访问实例成员变量或者静态成员变量
        //System.out.println(this.name);
        //System.out.println(this.count);
        //静态方法中不能使用this调用实例成员方法或者静态成员方法
        //this.print();
        //this.func1();
        //静态方法中不能直接调用非静态成员方法
        //print();
        //静态方法中可以直接调用静态成员方法
        func1();
        //静态方法中可以直接访问静态成员变量
        count++;
        /*注意不管是静态的方法还是非静态的方法中都不能定义静态的变量,但是可以定义非静态的
          static int a=10;(不允许)
        //总结:静态方法中不能访问成员变量,同时也不能调用成员方法,并且不能在静态方法中定义静态变量
        */
        System.out.println("此方法为静态方法");
    }
}
public class LeiHeDuiXiang4 {
    public static void main(String[] args) {
        People1 person = new People1();
        person.eat();
    }
}


下面我们来逐个分析:


1:this关键字可以在构造方法中使用,那么我们来看代码:

 People1() {
        /*
        注意this不能调用本身的构造函数,不然会陷入死循环
        this();
        */
        /*
        this在调用构造方法时只能放在第一行并且只能调用一次构造函数
        this在调用构造方法时只能用在构造方法中
        */
        this("songbiao");
        /*
        注意此时this如果想要调用第二个构造函数便会报错
        this("haha",10);
         */
        System.out.println("haha");
    }


1.首先我们可以使用this关键字在一个构造方法中去调用另一个构造方法,但是不能调用本身,这样会陷入死循环。


2.this方法在调用当前类的其他构造方法时只能将调用语句放在构造方法中的第一行并且只能调用一次。


3.this如果想要调用第二个构造函数便会报错,说明一个构造函数中只能调用一次其他构造函数。


2.this可以在普通成员方法中使用,下面来看代码:

public void print() {
        //使用this来访问实例成员变量
        System.out.println("name=" + this.name + " " + "age=" + this.age + " " + "sex=" + sex);
        //使用this来访问静态成员变量,虽然不妥但是编译时不会出错的
        System.out.println(this.count);
        //使用this来调用实例成员方法
        this.eat();
        //使用this来调用静态成员方法,虽然不妥但是编译时不会出错的
        this.func1();
        //可以直接调用静态成员方法
        func1();
        //可以直接调用实例成员方法
        eat();
         /*
         注意不管是静态的方法还是非静态的方法中都不能定义静态的变量,但是可以定义非静态的
         原因:因为静态的变量属于类并不属于方法,也就是我们俗称的类变量
         static int a=10;(不允许)
        */
        //可以直接访问静态成员方法
        count++;
    }

1.在普通成员方法中可以使用this关键字来访问成员变量,调用成员方法,虽然使用this关键字访问静态成员变量和调用静态成员方法时编译器(idea)会报错,但是运行时是不会出错的。


2.在普通成员方法中也可以直接访问成员变量和成员方法。


3. this不可以在静态成员方法中使用,下面来看代码:

public static void func() {
        // 静态方法中不能使用this访问实例成员变量或者静态成员变量
        //System.out.println(this.name);
        //System.out.println(this.count);
        //静态方法中不能使用this调用实例成员方法或者静态成员方法
        //this.print();
        //this.func1();
        //静态方法中不能直接调用非静态成员方法
        //print();
        //静态方法中可以直接调用静态成员方法
        func1();
        /*注意不管是静态的方法还是非静态的方法中都不能定义静态的变量,但是可以定义非静态的
          static int a=10;(不允许)
        //总结:静态方法中不能访问成员变量,同时也不能调用成员方法,并且不能在静态方法中定义静态变量
        */
        //静态方法中可以直接访问静态成员变量
        count++;
        System.out.println("此方法为静态方法");
    }
}

此时我们会发现this不可以在静态方法中使用,这是为什么呢?


答:因为this代表对象的引用,而静态是不依赖对象的。


所以在静态成员方法中只能访问静态的成员变量以及调用静态成员方法。


在这里再次强调下:注意不管是静态的方法还是非静态的方法中都不能定义静态的变量,但是可以定义非静态的,因为静态的变量属于类并不属于方法,也就是我们俗称的类变量


相关文章
|
1月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
221 18
|
1月前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
196 4
|
2月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
134 11
|
1月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
262 5
|
2月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
Java
JAVA方法的定义
JAVA方法的定义
222 0
|
8月前
|
存储 JSON Java
《从头开始学java,一天一个知识点》之:方法定义与参数传递机制
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问"`a==b`和`equals()`的区别",大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 🚀 这个系列就是为你打造的Java「速效救心丸」!我们承诺:每天1分钟,地铁通勤、午休间隙即可完成学习;直击痛点,只讲高频考点和实际开发中的「坑位」;拒绝臃肿,没有冗长概念堆砌,每篇都有可运行的代码标本。上篇:《输入与输出:Scanner与System类》 | 下篇剧透:《方法重载与可变参数》。
175 25
|
安全 Java 编译器
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
166 1
|
存储 Java
Java数组与带参数方法:定义、调用及实践
Java数组与带参数方法:定义、调用及实践
216 1
|
存储 Java
Java中带返回值方法的定义与调用技术
Java中带返回值方法的定义与调用技术
285 1
下一篇
oss云网关配置