一、数据传递及内存分析

1、基本数据类型

基本数据类型是直接存放的值,传递时传递的是:值;

2、引用数据类型

引用数据类型传递的是:引用地址。

3、内存分配

(1)局部变量:
声明在方法内。
声明时,在栈内存中分配存储空间。
(2)成员变量:
声明在类中,方法外。属于对象
New出的对象存放在堆中,在new对象的时候,在堆中为成员变量分配存储空间。

4、内存图示例

  1. public class TestNei {
  2. public static void main(String[] args) {
  3. test1();
  4. }
  5. public static void test1() {
  6. //基本数据类型传递测试:性别————》传递的是值:“男”,传递后方法的操作不影响原来的值。
  7. char sex = '男';
  8. System.out.println("参数传递前,sex="+sex); //sex=男
  9. test1_1(sex);
  10. System.out.println("参数传递后,sex="+sex); //sex=男
  11. //引用数据类型传递测试:stu————》传递的是引用地址:相同引用地址的方法,不管哪一个有操作,都会作相应的改变。
  12. //创建学生对象
  13. Student stu = new Student();
  14. Phone phone = new Phone();
  15. //把手机给stu
  16. stu.phone = phone;
  17. stu.phone.brand = "Iphone";
  18. System.out.println("参数传递前,stu.phone.brand="+stu.phone.brand); //stu.phone.brand=Iphone
  19. test1_2(stu);
  20. System.out.println("参数传递后,stu.phone.brand="+stu.phone.brand); //stu.phone.brand=huawei
  21. }
  22. //传递基本数据类型
  23. public static void test1_1(char sex) {
  24. sex = '女';
  25. System.out.println("sex="+sex); //sex=女
  26. }
  27. //传递引用数据类型
  28. public static void test1_2(Student stu) {
  29. System.out.println("改变前,stu.phone.brand="+stu.phone.brand);//stu.phone.brand=Iphone
  30. stu.phone.brand = "huawei";
  31. System.out.println("改变后,stu.phone.brand="+stu.phone.brand); //stu.phone.brand=huawei
  32. }


以上代码内存分析如下图:
20180927面向对象:数据传递 构造器 垃圾回收机制 This关键字 - 图1

二、构造器(构造方法)

1、定义及作用

  1. 构造器定义在类中,是特殊的成员方法。<br /> 作用:为创建的对象初始化属性。

2、语法:

   public 类名(参数列表){   }<br />       **注意:**<br />**       (1)构造器的名字与类名相同;**<br />**       (2)构造器没有static修饰;**<br />**       (3)构造器没有void或者设置返回值。**

3、this关键字

使用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;
        }
    }
}