1.对象的定义和调用
- 定义格式为 class + 类名 此时的类名就相当于新定义的一个数据类型(作用如同 int)
- 创建一个class对象,格式:类名 + 类变量名 = new 类名();
- 用变量名.属性的方法,可以改变属性值,不改变为默认值(String 为null,int 为0)
- 在对象内定义方法(或者称函数)格式为:关键字 + 返回值类型 + 函数名 +(参数)+函数体
public class dx1
{
public static void main(String args[])
{
Person p1 = new Person();
p1.name = "小明";
p1.age = 99;
p1.changename(p1);
System.out.print("名字是:" + p1.name + "\n年龄是:" +p1.age);
}
}
class Person //Person类/对象
{
String name;
int age;
public void changename(Person p) //可以在类定义里面写方法,参数为自己
{
p.name = "小红";
}
}
2.值传递和引用传递
值传递和引用传递的基本区别就是当调用函数时,实参传入形参中,形参的改变是否会造成实参的改变。
- 值传递形参不会改变实参。
当函数发生调用时,实参传入形参。调用函数实质上是在程序栈中新开辟了一段临时空间,而指向这部分临时空间的是一个临时地址。在这部分空间中,形式参数a,b的地址也是被重新指定的与实际参数地址不一样,只是他们被赋予了实际参数的值。而内存中的存储空间与地址相对应。因此此时改变形式参数的值,改变的是形式参数地址所指向的、刚开始被赋予实际参数的值。其实并不是改变实际参数地址所指向的值。因此,此时形式参数改变,而实际参数不改变。当函数调用完成返回时,这段临时空间又被系统自动回收,临时变量(也就是形参)的地址也被回收,因此称他们为临时,他们的作用域随着函数的调用而存在,随着函数的返回而销毁。
- 引用传递
调用时同上,引用传递的参数并非普通数据类型,而是引用数据类型,也可以认为此时传递的是实参对应的地址,把地址传递给了形参变量。这样传递后。虽然也是在程序中开辟了一段新空间,但是此时引用传递的引用类型变量的地址与实参的地址是相同的,指向的是同一片存储空间,因此,此时对形参做出的改变与对实参做出的改变等价。当然,形参的变量也并不是与实参变量就是一个东西了,他们只是两个不同的变量,但是所指向同一片存储空间罢了,如果修改形参变量的地址指向,然后再对形参变量所存储的是数据做出改变,那么此时是不会影响实参变量的数据。
public class dx2
{
public static void main(String args[])
{
Person p1 = new Person();
p1.name = "小红";
p1.age = 99;
p1.fn1(p1);
System.out.println("外" + p1 ); //外 有地址
}
}
class Person
{
String name;
int age;
public void fn1(Person p)
{
p = null; //形参改变了指向,此时p.name,p.age的改变不会影响p1了
System.out.println("里" + p); //里地址为null
}
}
3.可变参数
基本语法 访问修饰符+返回类型+函数名+(数据类型 …形参名)
- 可变参数对应的实参可以是0个或多个
- 可变参数本质为数组,可直接接受数组传参
- 参数列表中普通数据类型放在前,可变参数放最后
- 参数列表中最多只能出现一个可变参数
public class chongzai
{
public static void main(String[] args)
{
cjlmethod c1 = new cjlmethod();
c1.show("小明",90.0,80.0);
}
}
class cjlmethod
{
public void show(String name,double ...nums)
{
double totals = 0.0;
for(int i = 0 ;i < nums.length;i++ )
{
totals += nums[i];
}
System.out.println("姓名为:" + name + "\n总成绩为:" + totals + "分");
}
}
/*输出结果为:姓名为:小明
总成绩为170.0分*/
4.作用域
- 全局变量也称属性,在函数外声明,声明时可以不赋初始值(有默认值)。局部变量声明必须赋初值(无默认值)。
- 局部变量随着函数的调用而生成,随着函数的结束而销毁。全局变量在类的范围一直存在
- 全局变量和局部变量可以重名,调用时按就近原则
- 全局变量前可加修饰符,局部变量不可加修饰符
5.构造器(构造函数)
构造函数用来完成对新对象的初始化(而不是创建对象)
- 函数名与类名相同
- 无返回值
- 创建对象时系统自动调用
- 若没有定义构造函数,系统会自动生成一个默认构造函数,若定义则会覆盖默认构造函数,若需要无参构造函数,需要自己再重载一个显示构造函数(类一定有构造函数的原因)
6.this关键字
使用细节
- this指向当前类,用以区分全局变量和局部变量
- this可用在构造函数中(而且必须放在第一条语句中):this(参数列表)
- 哪个类变量调用该类,this就指向哪个类变量
- this只能在类定义的函数内使用,不可在外部使用
- this可访问当前类的变量、函数。
public class ex03
{
public static void main(String[] args)
{
book bk = new book("数据结构",199);
System.out.println("书名为:" + bk.name + "\n价格为" + bk.price );
bk.updateprice();
System.out.println("书名为:" + bk.name + "\n价格为" + bk.price );
}
/*书名为:数据结构
价格为199
书名为:数据结构
价格为150
*/
}
class book
{
String name;
int price;
public book(String name ,int price )
{
this.name = name; //构造函数
this.price = price;
}
public void updateprice()
{
if(this.price >= 150)
this.price = 150;
else if(this.price >= 100)
this.price =100;
}
}