【基础训练 1】循序渐进了解对象知识。
【目标】了解对象与对象引用的关系
(1) 构建 Point 类
(2) 创建对象。
当我们直接调用对象的时候会输出 类名@对象的哈希码
(3) 编写一个 toString()方法
增加了一个方法之后,发现结果截然不同。
为什么会出现不一样的结果呢?
在没有加toString()方法时,默认使用的Object类的toString方法返回一个字符串:
此时,当我们重写toString方法时,会return返回对应的字符串:return x+","+y;
只不过这里初值默认为0。
(4) 在 main 方法添加如下代码,定义另一对象引用变量 b,让 b 和 a 引用同一对象。
其实a与b指向同一内存地址。
(5) 定义构造方法。
所以这里需要再添加默认的构造方法。
(6) 用新定义的构造方法创建对象,改变引用变量 b,让其指向新建对象。
(7) 定义一个对象数组c:Point c[ ]={a,b};输出 c[0],c[1]:
(8) 定义一个更大数组并循环输出整个数组:
(9)添加如下代码:
c[6] = new Point(4,6);
重新观察输出。
(10) 添加如下代码: c[7] = new Point( );
观察编译错误,体会默认构造方法什么时候系统会自动提供。
我似乎这里没有编译出错。
(11) 编写无参构造方法。
public Point( ) {
this(10,10); //用 this 调用另一构造方法,等价于x=10;y=10
}
重新观察输出结果,注意 c[0]和 c[7] :
(12) 将有参构造方法的参数名定为 x,y,则程序做如下修改:
public Point(int x,int y) {
this.x = x;
this.y = y;
}
理解 this 的作用。没有 this 会如何?
Java中为解决变量的命名冲突和不确定性问题,引入关键字this代表其所在方法的当前对象的引用:
1)构造方法中指该构造器所创建的新对象;
2)方法中指调用该方法的对象;
3)在类本身的方法或构造器中引用该类的实例变量(全局变量)和方法。
【思考】toString()方法能写成如下形式否?
public String toString() {
return this.x + "," + this.y;
}
可以,但没有必要,因为直接写 x,y 也是指对象的 x,y 属性。
【基础训练 2】类成员与对象成员
【目标】理解类成员和对象成员的访问特点。
(1) 没有 static 修饰的成员为对象成员
(2) 在静态方法中能直接访问实例变量吗?
在 main 方法中增加一条输出语句,直接输出 value 值
System.out.println(value);
分析编译错误指示,解析错误原因。
静态方法不能直接访问对象成员。
(3)将 value 属性改为 static 修饰,新的程序代码如下:
类成员(用static修饰)依托类,具有唯一性,表示类的共享数据。
(4) 在实例方法中能访问类成员吗?
在类 Counter 中增加一个实例方法
public void incValue( int x){
value += x;
}
在 main 方法中增加 2 行代码:
incValue(5);
System.out.println(value);
调用该方法并输出结果。
1、有static修饰的成员变量或成员函数称为静态成员。
2、在内存中,类的静态数据成员占有一块特定的内存空间,被该类的所有实例(对象)共享。而同一个类的不同对象的实例数据成员相互独立,占有各自的存储空间。
3、静态变量不能在构造函数中初始化,必须在类外的文件作用域中定义静态数据成员,即为它们分配存储空间。
4、在静态函数中,只能访问类的静态成员变量和静态函数,而不能访问类的实例数据成员。
5、静态函数和普通函数的本质区别:编译时,编译器没有为静态函数指定this参数,而普通函数有this参数。
参考链接:
https://www.cnblogs.com/almm/p/toString.html
https://www.cnblogs.com/zheting/p/7751752.html