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代表对象的引用,而静态是不依赖对象的。
所以在静态成员方法中只能访问静态的成员变量以及调用静态成员方法。
在这里再次强调下:注意不管是静态的方法还是非静态的方法中都不能定义静态的变量,但是可以定义非静态的,因为静态的变量属于类并不属于方法,也就是我们俗称的类变量
java中方法的细分(普通方法,静态方法,构造方法)相关推荐
- 在Java中实现单例模式的有效方法是什么? [关闭]
在Java中实现单例模式的有效方法是什么? #1楼 我使用Spring框架来管理我的单身人士. 它不会强制类的"单一性"(如果涉及多个类加载器,您将无法真正做到),但是它提供了一种 ...
- 【转】Java中获取文件大小的正确方法
[转]Java中获取文件大小的正确方法 本文出处:http://blog.csdn.net/chaijunkun/article/details/22387305,转载请注明.由于本人不定期会整理相关 ...
- Java中图形界面重绘方法
** Java中图形界面重绘方法 ** 在我们编写图形界面程序的过程中,我们就会发现,当我们将窗体拉伸,缩小(或者最大化最小化)的时候,之前在窗体上画的图形会消失了. 这是为什么呢? 1)原来 ...
- java中的五种排序方法_用Java排序的五种有用方法
java中的五种排序方法 Java排序快速概述: 正常的列表: private static List VEGETABLES = Arrays.asList("apple", &q ...
- java double add,Java中的DoubleStream.Builder add()方法
add()Java中DoubleStream.Builder类的方法将元素添加到正在构建的流中.该方法返回此构建器. 语法如下default DoubleStream.Builder add(doub ...
- Java中String类的concat方法___java的String字符串的concat()方法连接字符串和“+“连接字符串解释
Java中String类的concat方法 在了解concat()之前,首先需要明确的是String的两点特殊性. 长度不可变 值不可变 这两点从源码中对String的声明可以体现: private ...
- js解析java对象数组_js接收并转化Java中的数组对象的方法
在做项目时,要向ocx控件下发命令,就要在js中得到java中的对象,然后拼成一种格式,下发下去...当对象是一个时比较简单,但如果对象是一个数组时,就略显麻烦了. 开始我以为有简单的方式,可以直接进 ...
- java 跨类 调用 model_Model.java中的这两个方法,为什么不能在子类中调用,或者包内调用也行啊。...
@JFinal 你好,想跟你请教个问题: Model.java中的这两个方法,为什么不能在子类中调用,或者包内调用也行啊. /** * Find model. */ @SuppressWarnings ...
- java中多态案例工厂类,Java中构造器内部的多态方法的行为实例分析
本文实例讲述了Java中构造器内部的多态方法的行为操作.分享给大家供大家参考,具体如下: 这篇文章主要讨论的是,若在一个构造器中调用正在构造的对象的某个动态绑定的方法时会出现的情况.在此之前,我们需要 ...
- Java 中Date类getTime()的方法
Java 中Date类getTime()的方法 1.getTime() /**Returns the number of milliseconds since January 1, 1970, 00: ...
最新文章
- 《H5 App开发》移动端IOS click 事件响应缓慢的解决方案
- linux wchar t char,linux 下 Linux 下char转换为wchar_t
- 数据库-数据库的介绍
- oracle为空替换为0_详解Oracle如何用Translate来统计字符出现的次数
- docker 查看日志_8个优秀Docker容器监控工具,收藏了
- 面试必备:CAS无锁机制
- python网络编程初级
- 2019年计算机学业水平测试填空题,2019年计算机学业水平模拟测试选择题80题Word(含参考答案)...
- android gettext方法,方法getText()必须从UI线程(Android Studio)调用
- bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序(置换)
- 从纯技术到技术管理,那些跌宕起伏的转型经历
- emu8086打印等腰三角形
- 前端数据可视化—Echart——笔记整理
- 机器人系统 是局域linux,一种基于命令行接口的机器人测试系统及测试方法
- vue router.beforeEach(),详解
- 炼狱与逐光——我的十杰博客获奖感言
- 人生不同年龄阶段该怎么买保险?
- 智云通CRM:做销售一定要慎说六种话,不然快成交的订单也会跑?
- Blender齿轮制作
- 一套免费开源Java充电桩平台
热门文章
- 【JUC源码专题】Striped64 核心源码分析(JDK8)
- django MVT模式介绍
- 【Codecs系列】双帧参考特性
- 2019TFE计算机科学排名,美国留学|2019TFE Times 硕士专业排名
- 争议不断的AI绘画,靠啥成为了顶流?
- android5.1内核版本,Msm8909+android5.1 user和eng版本对应的内核配置文件
- Creo5.0 永久修改尺寸单位为毫米(mmns)
- sql语句用法的一部分整理
- mobi怎么在iphone上打开?
- php 微盟,微盟开放授权并获取ACCESS_TOKEN方法(新版)