Java学习笔记——第四章 认识对象

第四章 认识对象

4.1 类与对象

使用Java撰写程序几乎都在使用对象(Object),要产生对象必须先定义类(class),类是对象的设计图,对象是类的实例

4.1.1 定义类

类定义时使用class关键词,利用类作为设计图,建立实例,要使用new关键词。 Clothes c1;在Java属于中,叫做声明参考名称、参考变量或者参考。

class Clothes{
	String color;
	char size;
}

在Clothes类中,定义了两个变量color和size,叫作定义两个值域成员,或叫作定义两个对象数据成员,表示每个新建的Clothes实例,可以拥有个别color和size值。

class Clothes{
	String color;
	char size;
}
public class Field{
	public static void main(String[] args){
		Clothes sun = new Clothes();
		Clothes spring = new Clothes();

		sun.color = "red";
		sun.size = 'S';
		spring.color = "green";
		spring.size = 'M';
		
		System.out.printf("sun (%s,%c)%n", sun.color, sun.size);
		System.out.printf("spring (%s,%c)%n", spring.color, spring.size);
	}
}

注:
一个原始码中可以有多个类定义,但只能有一个是公开类,且文档中的主文档名必须与公开类名称相同。
只要有一个类定义,编译程序就会产生一个.class文档。
如果想在建立对象时,一并进行某个初始流程,像是指定数据成员值,则可以定义构造函数。构造函数是与类名称同名的方法。
使用构造器创建对象时,必须传入指定类型的参数值且参数一一对应。使用this关键词,将参数的值指定给调用对象的属性值。

4.1.2 使用标准类

4.1.2.1 使用java.util.Scanner
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();

Scanner的nextInt()方法会查看你的标准输入有没有下一个字符串(以空格或者换行分隔),有就将其解析为int类型。Scanner对每个基本类型,都会有对应的next***()方法,如nextByte()、nextShort()、nextLong()、nextFloat()、nextDouble()、nextBoolean()等,如果直接取得上一个字符串(以空格或换行分隔),则使用next(),如果想取得整行文字,则使用nextLine()(以换行分隔)。

4.1.2.2 使用java.util.BigDecimal

Java(包括其他语言)遵守IEEE754浮点数运算规范,使用分数与指数来表示浮点数。例如,0.5会使用1/2表示,0.875会使用1/2+1/4+1/8来表示,0.1会使用1/16+1/32+1/256+1/512+...无限循环下去,无法精确表示,因而造成计算上的误差。
如果要求精度,就要小心使用浮点数,并且不使用==直接比较浮点数运算结果。为了得到更好的精确度,就要使用/java.util.BigDecimal/类。
BigDecimal提供的方法有plus()、substract()、multiply()、divide()。

4.1.3 对象指定与相等性

在操作对象时,=是用在指定参考名称参考某个对象,而==使用在比较两个参考名称是否参考同一对象

BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.1");
System.out.println(a == b);//false
System.out.println(a.equals(b));//true

上述程序中,ab指的是对象a和对象b是否为同一对象,显然不是!a.equal(b)指的是对象a和对象b内含值是否相同,显然相同都是0.1。
**
用在对象类型,是比较两个名称是否参考同一对象!**

4.2 基本类型打包器

4.2.1 打包基本类型

将基本类型打包在对象中,这样就可以操作这个对象,就像是将基本类型当做是对象操作。
Integer提供compareTo()方法,与另一个Integer进行对比,如果打包值相同就返回0;小于compareTo()传入对象打包值就返回-1,否则就返回-1。

4.2.2 自动装箱、拆箱

Integer data1 = 10;
Integer data2 = 20;
System.out.println(data1.doubleValue() / 3);//3.3333333333333335
System.out.println(data1.compareTo(data2));//-1

使用equals()比较两个对象的实质内容值是否相同!

Integer i1 = 200;
Integer i2 = 200;
if(i1.equals(i2)){
	System.out.println("i1 == i2");	
}else{
	System.out.println("i1 != i2");
}

4.3 数组对象

4.3.1 数组基础

在Java中数组是对象,而不是单纯的数据集合。
数组基本上是用来收集数据的,是具有索引的数据结构,在Java中要声明数组并初始化,可以如下:int[] scores = {67, 78, 98};
增强for循环:

for(int score : scores){
	System.out.printf("学生分数:%d %n",score);
}

4.3.2 操作数组对象

如果事先不知道元素值,只知道元素个数,那可以使用new关键词指定长度建立数组。例:
int[] scores = new int[10];
new建立数组后,每个索引元素会有默认值
(引自:http://blog.csdn.net/zhhstudy/article/details/7374825)
1.数组元素的类型是基本类型中的整数类型(byte、short、int和long),则数组元素的值是0。
2.数组元素的类型是基本类型中的浮点类型(float、double),则数组元素的值是0.0。
3.数组元素的类型是基本类型中的字符类型(char),则数组元素的值是'\u0000'。
4.数组元素的类型是基本类型中的布尔类型(boolean),则数组元素的值是false。
5.数组元素的类型是引用类型(类、接口和数组),则数组元素的值是null。
如果默认初始值不符合要求,可以使用java.util.Arrays的fill()方法设定新建数组的元素值。也可以在new数组时一并指定初始值,不必指定数组长度:
int[] scores = new scores[]{88, 81, 74};
使用new建立二维数组,声明如下:int[][] scores = new int[2][3];,语法上,实际上是建立一个int[][]类型的对象,里面有2个int[]类型的索引,分别是参考长度为3的一维数组对象,初始值默认为0。
如果将int[][] scores看成是(int[])[] scores{此处用()代表下划线},int[]就相当于一个类x,实际是声明x的一维数组,也就是x[]。Java中的多位数组基本上都是由一维数组组成
Integer[] score = new Integer[3];此语句建立了0个对象。
注意:如果是类类型建立的数组,每个索引值都是参考至null

4.3.3 数组复制

1、基本类型数组的复制
如果要进行数组的复制,基本做法是建立新的数组

int[] scores = new int[]{78, 88, 98};
int[] scores1 = new int[scores.length];
for(int i = 0; i < scores.length; i++){
	score1[i] = score[i];
	System.out.println(score1[i] + " ");
}

注:数组一旦建立,长度就固定了,如果事先建立的数组长度不够,只能建立新的数组,将原数组的内容复制到新数组中。
2、类类型数组的复制
浅层复制(参考复制):将数组c1的内容复制到c2中时,仅将c1每个索引处所参考的对象给c2每个索引来参考,并没有实现复制出类的对象,即c2同样指向c1所参考的对象,改变c1中的值同样会改变c2中的值。

Clothes[] c1 = {new Clothes("red", 'L'), new Clothes("blue", 'M')};
Clothes[] c2 = new Clothes[c1.length];
for(int i = 0; i < c1.length; i++) {
	c2[i] = c1[i];
}
c1[0].color = "yellow";
System.out.println(c2[0].color);//输出结果为yellow

深层复制:将数组c1的内容复制到c2中时,将c1每个索引处所参考的对象复制给c2,分别指定给c2的每个索引,即c2同样指向另一个参考的对象,改变c1中的值不会改变c2中的值。

Clothes[] c1 = {new Clothes("red", 'L'), new Clothes("blue", 'M')};
Clothes[] c2 = new Clothes[c1.length];
for(int i = 0; i < c1.length; i++) {
	Clothes c = new Clothes(c1[i].color, c1[i].size);//自行复制元素
	c2[i] = c;
}
c1[0].color = "yellow";
System.out.println(c2[0].color);//red

4.4 字符串常量

4.4.1 字符串基础

字符串在Java中是对象,可使用length()获取字符串长度,使用charAt() 指定取得字符串中某个字符,索引从0开始,使用toUpperCase()将原本大小写的字符串内容转化为大写的字符串内容,使用toCharArray()将字符串以char[]数组返回。
如果将字符串转换为整数、浮点数等基本类型,使用一下方法:

  1. Byte.parseByte(number)            将number剖析为byte整数
  2. Short.parseShort(number)         将number剖析为short整数
  3. Integer.parseInt(number)           将number剖析为int整数
  4. Long.parseLong(number)          将number剖析为long整数
  5. Float.parseFloat(number)          将number剖析为float浮点数
  6. Double.parseDouble(number)    将number剖析为double浮点数

4.4.2 字符串特性

1、字符串常量与字符串池
以" "包括的字符串,只要内容相同(序列、大小写相同),无论在程序代码中出现几次,JVM都只会建立一个String实例,并在字符串池中维护。
用" "写下的字符串称为字符串常量
如果要比较对象实质内容是否相同,要使用equals()。
如果要比较字符串实际字符内容是否相同,要使用equals()。
2、不可变动字符串

String name1 = "java";
String name2 = "Hello" + name1;
System.out.println(name2);

使用+连接字符串,会变成建立java.lang.StringBuilder对象,使用其append()方法进行+左右两边的字符串附加,最后在转换为toString()返回。
使用+连接字符串会产生新的String实例,而不是在原有的基础上进行连接!

4.4.3 字符串编码

使用Windows默认的纯文本编辑器,是GB2312编码;
如果在NetBeans中建立.java原始码,默认UTF-8编码;
如果在eclipse中建立.java原始码,默认使用GB2312编码;
使用Javac -encoding UTF-8 Main,java,在编译时指定-encoding为UTF-8,编译程序时知道如何编译读取.java的内容。

学习体会

第二次看Java认识对象部分的内容了,每次看总有新的感受,新的理解,结合书本上的图解对此部分内容有了新认识,理解上有了一定提高。语言的学习很枯燥,应该以一种更好的图文结合方式去学习,这部分是后面的基础,应该把基础打牢!

posted on 2018-03-24 20:41  20169305孙德洋  阅读(190)  评论(1编辑  收藏  举报