*************************构造函数(构造方法、构造器)Constructor************

一.why 为什么用

Student s1 = new Student();

s1.sno = 1;//破坏程序的封装性
s1.name = "aaa";
s1.age = 20;

//推荐

s1.setSno(1);
s1.setName("aaa");
s1.setAge(20);

假设对象有10个属性,为了创建这个对象并且为该对象的10个属性赋值,需要调用10次
setters()方法,显然是比较麻烦!有没有一种方式,可以一句话就能创建对象 同时为
该对象的所有属性赋值?

有的.使用构造函数

二.what

构造函数 是一个特殊的函数...

作用: 是用来给对象的属性进行初始化的...

构造函数也叫做构造方法、构造器... 英文叫做Constructor...

三.how

public class Student{

public Student(){

}
}

特点:

1. 与类同名

2. 没有返回值(连void也不要写)

演示代码:

package com.chapter6.演示构造函数;

public class Student {

private int sno;
private String name;
private int age;

public Student(int sno,String name){
System.out.println("使用两个参数的构造函数创建对象int sno,String name");
this.sno = sno;
this.name = name;
}
//构造函数
//特点:
//1.与类同名
//2.没有返回值(连void也不需要写)
public Student(int sno,String name,int age){
System.out.println("使用三个参数的构造函数来创建对象 int sno,String name,int age");
this.sno = sno;
this.name = name;
this.age = age;
}

public void study(){
System.out.println("我在学习");
}

public static void main(String[] args) {
//Student s1 = new Student(1,"aaa",20);

Student s1 = new Student(1,"bbb");
}
}

*************************构造函数不写返回值的实质**********************

其实构造函数是有返回值的,返回值是刚刚创建出来的对象的引用...

public Student Student(int sno,String name){
System.out.println("使用两个参数的构造函数创建对象int sno,String name");
this.sno = sno;
this.name = name;

return new Student(1,"aaa",20);
}

或者

public void Student(int sno,String name){
System.out.println("使用两个参数的构造函数创建对象int sno,String name");
this.sno = sno;
this.name = name;

}

以上两种都不是构造函数,它是一个普通的方法,只不过碰巧和构造函数同名罢了...

构造函数不写返回值,是java设计人员的一个规定, 编译器也是根据这个规定来找到哪个方法是构造函数的.....

而不是说构造函数真的没有返回值

*************************默认的构造函数**********************

Student s1 = new Student(1,"aaa",20);//底层调用了构造函数 来创建对象

Student s1 = new Student();//之前我们没有学构造函数的时候 也可以创建对象

为什么呢? 原因是虽然我们没有写构造函数,编译器会自动帮我们提供一个不带参数的
构造函数,这个不带参数的构造函数,叫做默认的构造函数,也叫做缺省的构造函数

一.what 什么是默认的构造函数

不带参数的构造函数, 也叫做缺省的构造函数、无参的构造函数...

public class Student{

//默认的构造函数
public Student(){
//super();
}
}

注意: 一旦程序员写上一个带参数的构造函数,编译器就不会帮你提供那个默认的构造函数了

程序员要养成习惯,一旦写了带参数的构造函数,自己要主动把不带参数的默认的构造函数也加上.

*************************对象的初始化块************************************

一.why

问题:既然初始化块和构造函数功能是完全一样的,这样既然有了构造函数,为什么还需要初始化块??

初始化块是多余的吗???

不是!

当多个构造函数中,如果出现相同的代码,可以把这些相同的代码提取出来,抽取到对象初始化块中...

由于对象初始化块 是优先于构造函数执行的,这样就解决了代码冗余问题....

二.what

作用: 和构造函数一样, 是用来给对象的属性进行初始化...

public class Student{

//1.属性

//4.对象初始化块
{

}

//3.构造函数

//2.方法
}

演示代码:

package com.chapter6.对象的初始化块;

public class Student {
private int sno;
private String name;
private int age;

private int grade;//年级

//对象初始化块
{
System.out.println("对象初始化块执行");
this.grade = 1;
}

public Student(){
System.out.println("默认的构造函数执行");
}

public Student(int sno,String name){
System.out.println("两个参数的构造函数执行int sno,String name");
this.sno = sno;
this.name = name;
}

public Student(int sno,String name,int age){
System.out.println("三个参数的构造函数执行int sno,String name,int age");
this.age = age;
this.sno = sno;
this.name = name;
}

public static void main(String[] args) {
Student s1 = new Student(1,"aaa",20);
}
}

*******************************对象初始化过程(或 使用new创建对象 底层到底做了什么)******************

Student s1 = new Student(1,"aaa",20);//对象初始化

一.给对象的实例变量分配空间、默认初始化

二.声明时初始化、对象初始化块初始化(按照写代码的顺序 从上到下执行)

三.构造函数初始化

执行完以上三步以后,对象被创建完毕,返回刚刚创建的对象的地址

实例变量是隶属于对象的,每个对象有自己的一份实例变量

*******************************this指针********************************

this 指向的是自己 翻译成中文 "我"

一.构造函数中

指向的是 正在初始化的对象

二.用在方法中

指向的是 正在调用该方法的对象

s1.study();//在study()中的this 指向的是s1

三.使用this可以来调用其他的构造函数

public Student(int sno,String name,int age){

this(sno,name);//调用其他的构造函数 int String 这句话必须要写到当前构造函数的第一句 否则编译报错

System.out.println("使用三个参数的构造函数int sno,String name,int age");

this.age = age;
}

*******************************重载(Overload)********************************

一.what 什么是重载

方法的名称相同,参数列表不同的方法之间叫做重载....

参数列表不同体现在三个方面:

1. 个数不同

2. 类型不同

3. 顺序不同

编译器决定到底调用哪个方法,首先是通过方法名判断,如果introduce有多个重载的方法,编译器通过参数的类型、个数、顺序

来判断到底调用哪一个,如果碰到两个相同类型的方法(例如参数都是int类型,编译器就糊涂了,有句话叫 不要让计算机糊涂 让计算机糊涂就是你错了)

面试题: 方法的名称相同,参数列表也完全相同,只有返回值不同的方法之间 叫不叫重载???

不叫重载. 编译报错 . 重复的方法 Duplicate Method 编译器认为它是一个重复的方法..所以不叫重载...

重载: 也叫做静态联编、静态绑定、前期绑定..

联编(binding绑定): 给定一个方法名, 通过该方法名 决定 到底执行 哪一块代码的过程,叫做联编...

静态联编: 在 编译的 时候 决定到底执行哪一块代码...

演示代码:

package com.chapter6.演示重载;

/**
* 作者: zhangzy 公司: 蓝桥软件学院 时间: 2017年7月3日 上午11:15:30 功能: 演示重载
* 方法的名称相同,参数列表不同的方法之间叫做重载.... 参数列表不同体现在三个方面:1. 个数不同 2. 类型不同 3. 顺序不同.
*/
public class Student {

private int sno;
private String name;
private int age;

/*public int introduce(int sno) {

System.out.println("我是学生,我的学号是:" + sno);
return 1;
}

public long introduce(int age){
System.out.println("我是学生,我的年龄是:" + age);
return 1;
}*/

public void introduce(String name) {

System.out.println("我是学生,我的名字是:" + name);
}

public void introduce(int sno, String name) {
System.out.println("我是学生,我的学号是:" + sno + ",姓名是:" + name);
}

public void introduce(String name, int sno) {
System.out.println("我是学生,我的姓名是:" + name + ",学号是:" + sno);
}

public static void main(String[] args) {
Student s1 = new Student();

s1.introduce(1);

}
}

********************************构造函数也是可以重载的*****************************

**************************static 静态的************************************

一.修饰方法

1. 静态方法

类名.方法名();

二.修饰成员变量

1. 静态变量(类变量)

如何访问静态变量 :

类名.属性名

隶属于类的,类的所有对象 共享一份 静态变量....

需求: 统计使用Student类总共创建了多少个对象

演示代码:

package com.chapter6.演示static;
/**
* 作者: zhangzy
* 公司: 蓝桥软件学院
* 时间: 2017年7月3日 下午2:11:12
* 功能: 演示static
* 需求: 统计使用Student类创建了多少个对象
*/
public class Student {

private int sno;
private String name;
private int age;

private static int sum;

//静态初始化块
//作用: 给类的静态属性初始化的
static{
System.out.println("静态初始化块执行");
sum = 10;
}

public Student(){
sum++;
}

public Student(int sno,String name,int age){
sum++;
this.sno = sno;
this.name = name;
this.age = age;
}

public static void study(){
System.out.println("我在学习");
}

public static void main(String[] args) {
Student s1 = new Student(1,"aaa",20);//1.类初始化 2.对象初始化

Student s2 = new Student(2,"bbb",25);//只执行对象初始化

s1.sum = 50;
System.out.println(s1.sum);//50
System.out.println(s2.sum);//50
System.out.println(Student.sum);//推荐
//System.out.println("一共创建了" + Student.sum + "个对象");
}

}

*****************************类的初始化过程****************************
对象初始化时机: new 对象的时候

类的初始化时机: 第一次使用类的时候

1.使用该类来创建对象的时候

Student s1 = new Student();

2.调用类的静态方法

Student.study();

3.访问类的静态属性

Student.sum

类初始化过程

1. 类加载

把类的二进制文件(.class)读到方法区

2.给类静态变量分配空间、默认初始化

3.声明时初始化、静态初始化块初始化(从上到下的顺序)

静态初始化块

作用: 给类的属性(静态变量)赋值

static {

}

**************************实例变量和静态变量的区别*****************************

一.实例变量

隶属于对象的,每个对象都有自己的一份实例变量,实例变量是分配在堆里的

二.静态变量

隶属于类的,类的所有对象 共享一份 静态变量,静态变量是在静态区的...

三.局部变量

在栈里

***************************************************************

类初始化 优先于 对象初始化

转载于:https://www.cnblogs.com/MrTanJunCai/p/9906774.html

Java方法及构造方法相关推荐

  1. Java方法与构造方法练习

    方法与构造方法练习 [练习题]1.构造方法与重载 定义一个牛肉面的类(Noodle),它的属性有, 牛肉面宽度 width 尺寸:size (大碗还是小碗) 大碗8元,小碗6元 是否加肉:beef : ...

  2. JAVA中的方法和构造方法有什么区别

    JAVA中的方法和构造方法有什么区别 1.方法有返回类型,方法名小写,不能和类名相同:构造方法没有返回类型,void也不行,名与类名相同. 2.构造方法是初始化对象的重要途径,所以就算你给一个类没有定 ...

  3. 【反射机制】Java中的反射机制,使用反射机制创建对象、访问属性、方法、构造方法等

    这篇文章主要是整理了Java中的反射机制,包括:反射机制概念.反射机制访问构造方法.反射机制访问普通方法.反射机制访问属性,反射机制访问修饰符. 目录 一.反射机制概念 二.反射机制使用 (1)加载C ...

  4. java重载方法与构造方法 区别

    java构造方法与重载方法 1.什么是构造方法和重载方法呢? 通俗来讲构造方法就是与类名相同的方法,而重载方法则是一个类中有多个相同方法名的方法 构造方法特点: 1.不需要void关键字修饰2.不需要 ...

  5. java this关键字表示当前对象,可以访问属性、方法、构造方法

    this关键字的三种访问方式:属性.方法.构造方法 1.访问属性 为了命名的规范,利用this关键字区分了属性与局部变量 public class Persion {String name;char ...

  6. 【Android FFMPEG 开发】C++ 回调 Java 方法 模板 ( JavaVM *vm | JNIEnv *env | jobject instance | 引用类型 | 模板代码示例 )

    文章目录 I . Native 调用 Java 方法 II . JNIEnv *env 与 jobject instance III . JavaVM *vm IV . 局部引用 与 全局引用 分析 ...

  7. 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )

    文章目录 I . 调用 Java 方法流程 II . 获取 jclass 对象 ( GetObjectClass ) III . 获取 jclass 对象 ( FindClass ) IV . JNI ...

  8. java中的构造方法,this、super的用法

    1.构造方法 定义:与类同名没有返回值的方法称为构造方法: public class test1 { private String name; private int age; public test ...

  9. java方法带参数返回值_Java方法中的参数太多,第6部分:方法返回

    java方法带参数返回值 在当前的系列文章中,我正在致力于减少调用Java方法和构造函数所需的参数数量,到目前为止,我一直专注于直接影响参数本身的方法( 自定义类型 , 参数对象 , 构建器模式 , ...

最新文章

  1. 【Angular4】英雄指南demo
  2. SSC:基于点云语义上下文的大规模激光SLAM的位置识别方法
  3. OpenStack部署
  4. VBA学习笔记(9)--生成点拨(1)
  5. 释疑のABAP输入框字符自动变成大写问题
  6. AMBA、AHB、APB、AXI总线
  7. 微型计算机电源的选购应注意哪些问题,购买小功率ups电源的注意事项
  8. 微信小程序--家庭记账本开发--01
  9. 解决opensips NAT 问题和ACK不能正常转发问题
  10. CentOS下编译安装Gcc-4.9
  11. 多个 Linux 发行版考虑移除 Chromium 软件包
  12. HTML的a标签href设为零操作的原因和方式
  13. 敏捷开发的相关学习文档路径
  14. 旧的起点(开园说明)
  15. HIVE存储(五)HIVE文件的性能测试
  16. 【算法】路径规划中的Dijkstra(狄克斯特拉)与A星算法
  17. linux如何查看内存?
  18. 未来人类笔记本 T5 67SH2 扩展内存条
  19. AM3352 bootloader引导程序开发
  20. IT行业主要职业有什么?

热门文章

  1. linux7编译mysql5.7安装,CentOS 7.4 使用源码包编译安装MySQL 5.7.20
  2. 在设计四人抢答器中灯全亮_数字电子技术课程设计报告(四人抢答器).doc
  3. centos桌面系统怎么退回终端系统_【社群话题分享】Linux 各大发行版你怎么选?...
  4. ntp协议中 服务器失效怎么办,排除网络时间协议(NTP)故障
  5. python 列表操作详解,Python列表解析操作实例总结
  6. Flask cookie API(response.set_cookie,request.cookies)
  7. http.server模块
  8. layui 读取本地excel内容_Python操作Excel基础(1)
  9. 信息安全完全参考手册之本书框架(目录)
  10. Linux学习总结(74)——wget 命令详解