1.7构造方法的讲解
关于java类的构造方法
意义就是通过定义一个构造方法,使得其所在的类能够在主程序中随时创建一个位于堆内存的这个函数就对象,
这样的话,只要new能创建一个对象随时访问。
1、构造方法又被称为构造函数/构造器/constructor
2、构造方法语法结构:
[修饰符列表]构造方法名(形式参数列表)
{
构造方法体;
}
3、回顾普通方法的语法结构:
[修饰符列表]构造方法名(形式参数列表)
{
方法体;
}
4、对于构造方法来说“返回值类型”不需要指定,并且也不能写void,
只要写上void,那么这个方法就成为了普通方法。
5、对于构造方法来说,构造方法的方法名和类名保持一致。
6、构造方法的作用:
构造方法存在的意义是,通过构造方法的调用,可以创建对象。
7、构造方法应该怎么调用?
普通方法是这样调用的:方法修饰符中有static的时候:类名:方法名(实参列表),方法修饰符列表中没有static的时候:引用.方法名(实参列表)
构造方法调用的方式:new构造方法名()
8、构造·方法调用执行之后有返回值吗?
每一个构造方法实际执行结束之后都有返回值,但是这个return值;这样的语句不需要写,构造方法结束的时候java程序自动返回值。
并且返回值类型是构造方法所在类的类型,由于构造方法的返回值类型是类本身,所以返回值类型不需要编写。
9、myeclipse注释和取消注释快捷键ctrl+/,多行注释ctrl+shift+/;
10、当一个类中没有定义任何构造方法的话,系统默认给该类提供一个无参数构造方法,这个构造方法被称为缺省构造器。
11、当一个类显示的将构造方法定义出来了,那么系统则不再默认为这个类提供缺省构造器,建议开发中手动的为当前类提供无参数构造方法,因此无参数构造方法太常用了。
12、构造方法支持重载机制,在一个类当中编写多个方法,这多个构造方法显然已经构成方法重载机制。(即通过不同类型的实参,调用同一个方法实现不同功能)
public class User()
{
public User(int i)//1
{
}
}
public class ConstructorTest
{
public static void main(String[]args)
{
//创建User对象
//调用User类的构造方法来完成对象的创建
User u=new user()
}
}
如果1处注释掉,则情况就是第十个情况系统会给给这个类提供一个无参数构造方法
如果1处不注释掉,则会报错,因为user()与user(int i)不同,因此报错会提示没有定义user()。
public class User()
{
public User()//1
{
System.out,println("user's Default Constructor Invoke!");
}
public User(int i)//1
{
System.out,println("int");
}
public User(string i)//1
{
System.out,println("string");
}
public User(int i,string j)//1
{
System.out,println("int,string");
}
}
public class ConstructorTest
{
public static void main(String[]args)
{
//创建User对象
//调用User类的构造方法来完成对象的创建
//以下程序创建了4个对象,只要构造函数调用就会创建对象,并且一定是在“堆内存”中开辟内存空间。
User u=new user();//user()实际上是构造方法的方法名。
User u=new user(10);
User u=new user(“张三”);
User u=new user(10,“张三”);//方法的重载
//调用static的方法:类名.
ConstructorTest.dosome();//执行一遍dosome
dosme();//类内方法的调用,再次执行一遍dosome
//调用没有static的方法:引用.
//doOther方法在ConstructorTest对象,调用无参数构造方法。
//创建ConstructorTest01对象,调用无参数构造方法。
ConstructorTest t=new ConstructorTest();//一个类中没有任何构造方法的话,系统默认提供一个无参数构造器。
t.doother();
}
/**
*这是一个带有static的方法,方法名dosome
*/这个注释将会被放在系统的dosome解释中
public static void dosome()
{
System.out,println("dosome");
}
public void doother()
{
System.out,println("doother");
}
}
构造方法的另一个作用;
1、创建对象
2、创建对象的同时,初始化实例变量的内存空间。成员变量之实例变量没有手动赋值的时候,系统默认赋值,南无这个系统默认赋值是在什么时候完成的呢?
不是,因为在类加载的时候只加载代码片段,还没来得及创建对象。所以此时实例变量都没有初始化。
实际上,实测变量的内存空间是在构造方法执行过程当中完成开辟的。完成初始化的。
系统在默认赋值的时候,也是在构造方法过程当中完成的赋值。
实例变量默认值:
int short byte long 0
float double 0.0
boolean false true
实例变量是存储在jvm堆内存中
public class Account
{
private String actno;//赋初值null
private double balance;
}
public class ConstructorTest
{
public static void main(String[]args)
{
//在eclipse中查看访问的是哪个属性,查看访问的是哪个方法?
//按ctrl键,鼠标移动到查看的元素上;出现下划线时候开始单击。
//创建对象
Account act1=new Account();
System.out,println("账号"+);
}
}
ctrl+o:查看类中的元素
mydeclipse快速编辑支持多行同时编辑:块编辑
封装:属性私有化,set和get
对象和引用
引用:可以是局部变量也可以是成员变量。
public class Test
{
public static void main(String[]args)
{
int i=10;
add(i);
System.out,println("main-->"+i);//10
}
public static void add(int i)
{
i++;
System.out,println("add-->"+i);//11
}
}
因为当方法调用完i后并不会返回i的值,因此i会恢复原来的值。
从内存的角度来说是main中的i内存地址中的10复制了之后给了add方法中,让add进行操作,这并不会影响main中i的值。因此,参数传递时,实际上传递的是参数值而非地址。
public class Test
{
public static void main(String[]args)
{
user u=new User(20);
add(u);
System.out,println("main-->"+u.age);//21
}
public static void add(int i)
{
u.age++;
System.out,println("add-->"+u.age);//21
}
}
class User
{
int age;
public User(int i)
{
age=i
}
}
这里体现出了变量和引用之间的区别,引用的自加是从被指向对象的真实地址上进行操作,因为引用中保存的是对象的地址。因此可以做到即使函数结束改变的量依旧被改变
而变量赋值改变仅仅是将复制的值传给函数,并未从实际意义上改变变量的值,也就是用完就丢弃,不会重新传给变量。
方法调用的时候,关于参数传递问题,传递的时候,java只遵循一种语法机制,就是将变量中保存的“值”传递过去了,只不过有的时候这个值是一个字面值10,有的时候是另一个Java对象的内存地址0x1234