Java方法及构造方法

Posted 菜菜小谭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java方法及构造方法相关的知识,希望对你有一定的参考价值。

*************************构造函数(构造方法、构造器)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 {


}

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


一.实例变量


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


二.静态变量

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

 

三.局部变量


在栈里

 


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

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

 


















































































































































































































































以上是关于Java方法及构造方法的主要内容,如果未能解决你的问题,请参考以下文章

Java之构造方法及thissuper关键字

Java—面向对象—构造方法及相关思维导图

java构造器的使用及意义

java中无参,有参,默认构造方法的应用及举例

Java构造方法及类的初始化

java-方法及构造方法的使用