一、数据传递及内存分析
1、基本数据类型
2、引用数据类型
3、内存分配
(1)局部变量:
声明在方法内。
声明时,在栈内存中分配存储空间。
(2)成员变量:
声明在类中,方法外。属于对象
New出的对象存放在堆中,在new对象的时候,在堆中为成员变量分配存储空间。
4、内存图示例
public class TestNei {
public static void main(String[] args) {
test1();
}
public static void test1() {
//基本数据类型传递测试:性别————》传递的是值:“男”,传递后方法的操作不影响原来的值。
char sex = '男';
System.out.println("参数传递前,sex="+sex); //sex=男
test1_1(sex);
System.out.println("参数传递后,sex="+sex); //sex=男
//引用数据类型传递测试:stu————》传递的是引用地址:相同引用地址的方法,不管哪一个有操作,都会作相应的改变。
//创建学生对象
Student stu = new Student();
Phone phone = new Phone();
//把手机给stu
stu.phone = phone;
stu.phone.brand = "Iphone";
System.out.println("参数传递前,stu.phone.brand="+stu.phone.brand); //stu.phone.brand=Iphone
test1_2(stu);
System.out.println("参数传递后,stu.phone.brand="+stu.phone.brand); //stu.phone.brand=huawei
}
//传递基本数据类型
public static void test1_1(char sex) {
sex = '女';
System.out.println("sex="+sex); //sex=女
}
//传递引用数据类型
public static void test1_2(Student stu) {
System.out.println("改变前,stu.phone.brand="+stu.phone.brand);//stu.phone.brand=Iphone
stu.phone.brand = "huawei";
System.out.println("改变后,stu.phone.brand="+stu.phone.brand); //stu.phone.brand=huawei
}
以上代码内存分析如下图:
二、构造器(构造方法)
1、定义及作用
构造器定义在类中,是特殊的成员方法。<br /> 作用:为创建的对象初始化属性。
2、语法:
public 类名(参数列表){ }<br /> **注意:**<br />** (1)构造器的名字与类名相同;**<br />** (2)构造器没有static修饰;**<br />** (3)构造器没有void或者设置返回值。**
3、this关键字
4、创建对象的过程
(1)在堆内存总创建该对象,并分配存储空间;
(2)根据参数列表调用合适的构造器,并初始化对象;
(3)返回对象的引用地址。
5、构造器重载
构造器也成为构造方法,可以通过不同的参数列表构成重载(参数类型,参数个数,参数顺序)。
6、空构造器
如果类中没有定义构造器,则系统会默认添加一个空构造器;如果定义有构造器,空构造器被覆盖,需手动添加。一般情况下,为保证代码的严谨性,一般都手动添加空构造器。
三、垃圾回收机制
(1)Java中的垃圾回收机制用于回收没有引用指向的对象。
(2)Java会自己执行垃圾回收器;程序员无权调用;
(3)程序员可通过system.gc来通知JVM回收垃圾。
四、this关键字
1、用法位置
(1)普通方法:用于指向正在调用该方法的对象;
(2)构造器:用于指向正在初始化的对象;
(3)构造块:
2、注意
this关键字不能用在用static修饰所有方法和语句块内。
3、就近原则
Java中变量的就近原则:指相同的变量名,通常指向当前方法中的变量。在构造器中可用this关键字区分。
如:this.x指Point类中的x,x指形式参数x;
//定义类:点
class Point{
double x;
double y;
double z;
//构造方法:可以设置三个坐标
public Point(double x,double y,double z) {
this.x = x;
this.y = y;
this.z = z;
}
4、this关键字例题
package my_practice;
/*
* 1、定义一个“点”(Point)类用来表示三维空间中的点(有三个坐标:x,y,z)。
每一个点都需要存储一份x,y,z的值,要求如下:
1)提供可以设置三个坐标的构造方法和可以设置两个坐标(x,y)(另一个坐标z默认为0)的构造方法。-- 要求使用到this
2)提供可以计算一个“点”到另外一个"点"的距离的方法。-- 要求使用到this
-- 两个点-(一个点利用this表示,另一个点用参数传入)
-- 距离计算公式-自己查询
-- 计算平方根的方法:Math.sqrt();
3)提供比较两个点是否相等的方法(利用this)
*/
public class PracticeThis {
public static void main(String[] args) {
test();
}
public static void test() {
//创建点p1
Point p1 = new Point(0, 0, 0);
//创建点p2
Point p2 = new Point(1,1,1);
//调用方法distance()计算p1和p2之间的距离
double distance = p1.distance(p2);
System.out.println("点(1,1,1)到点"+"("+p1.x+","+p1.y+","+p1.z+")的距离是:"+distance);
//调用方法isSame()比较两个点是否为同一点点
boolean resault = p1.isSame(p2);
System.out.println("p1和p2是否为同一个点?"+resault);
}
}
//定义类:点
class Point{
double x;
double y;
double z;
//1)提供可以设置三个坐标的构造方法和可以设置两个坐标(x,y)(另一个坐标z默认为0)的构造方法。-- 要求使用到this
//构造方法1:可以设置三个坐标
public Point(double x,double y,double z) {
this.x = x;
this.y = y;
this.z = z;
}
//构造方法2:可以设置两个坐标
public Point(double x,double y) {
this.x = x;
this.y = y;
}
//构造方法3:可以设置一个坐标
public Point(double x) {
this.x=x;
}
/*2)提供可以计算一个“点”到另外一个"点"的距离的方法。-- 要求使用到this
-- 两个点-(一个点利用this表示,另一个点用参数传入)
-- 距离计算公式-自己查询
-- 计算平方根的方法:Math.sqrt();
*/
//定义一个功能,计算一个点到另一个点的距离
public double distance(Point p) {
//计算两点间的距离,传入点p
double distance =Math.sqrt(Math.pow((this.x-p.x), 2)+Math.pow((this.y-p.y), 2)+Math.pow((this.z-p.z), 2));
//返回距离值
return distance;
//3)提供比较两个点是否相等的方法(利用this)
//定义功能:比较两个点是否相等
public boolean isSame(Point p) {
if(this.x==p.x && this.y==p.y &&this.z==p.z) {
return true;
}else {
return false;
}
}
}