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方法及构造方法的主要内容,如果未能解决你的问题,请参考以下文章