发表于: 2018-03-03 23:21:36
2 671
今天完成的事情:
还是继续基础知识的学习
1.构造方法
a.作用:在创建对象时,就给对象进行赋值,而不用在创建完之后给对象变量一个个进行赋值。
b.分为有参构造方法和无参构造方法。
有参构造方法定义语法:[修饰符] 类名(形参类型1 形参名,...){赋值语句};
无参构造方法定义语法:[修饰符] 类名(){赋值语句(一般无)};
c.方法名与类名相同。
d.构造方法没有返回值,也没有返回值类型,但是方法体最后可以加return,起到一个终止方法体的作用,但是不会返回具体值。
e.在没有显示定义构造方法之前,系统有一个默认的无参构造方法,当程序员显示定义了构造方法之后,系统默认的无参构造就没有了,此时若还想按原来的一个一个进行赋值,需要再创建一个无参构造方法。
f.上述再创建就是利用的构造方法可以利用参数实现重载的特点,即可以定义多种参数数量不同的同一构造方法,系统在调用时会自动匹配最适合的使用。
g.构造方法在创建对象是,跟在new运算符后,由系统调用,如 Scanner sc=new Scanner(System.in);后一个Scanner(System.in)即为一个构造方法,注意其不能通过对象来调用。
h.在无参构造方法的方法体第一句可以使用this调用有参构造方法。同理,少参可以用this调用多参。
2.this关键字
a.当在方法中,方法的形参或局部变量与字段名相同时,在方法体中默认采用就近原则,使用的是局部变量或者形参,而不是字段,在方法中,可以通过this关键字来访问字段
b.this是指当前对象,如果是在构造方法中使用this,那么就是值刚刚在堆中new出来的那个对象;在普通的实例方法中,this当前对象则是指调用此方法的对象。
c.当一个类中需要定义多个构造方法时,可以定义一个有最多参数的构造方法,然后其他的构造方法就可以使用this关键字来调用这个最多构造参数的构造方法。此时,this()这条语句必须放在构造语句的最前面作为第一天语句。
d.举例,
public class Person{ //创建一个Person 类
String name; //创建成员变量name,gender,age
String gender;
int age;
public Person(String name,String gender,int age){ //创建一个有参构造方法,将所有属性都包括
this.name=name; //由于形参名和成员变量名重名,所以使用this 来区分
this.gender=gender;
this.age=age;
}
public Person(String name){ //之前定义了一个包含所有属性的构造方法,所以此时要重载只有一个name属性时,可以利用this调用构造方法
this(name,"",0); //没有定义的属性就按照系统默认赋值给予其初始变量,按此方法可以减少代码的录入
}
}
3.静态变量
a.静态变量是使用static 修饰的成员变量,其作用是为了让所有使用此变量名的变量共享同一储存空间,即在静态变量的作用域内,即使存在同名的局部变量,其储存的数据是共用的,而不像未声明的情况下,在局部方法中是优先使用局部变量的。
b.java中规定不能将方法体中的变量声明为静态变量,所以只有在类中方法体外可以声明某变量为静态变量,即只有成员变量可以成为静态变量。
c.其在调用时一般使用 “ 类名.静态变量名 ” 的形式进行调用,区别与一般非静态变量字节使用变量名就可进行调用,主要是因为当其声明为public时,是可以跨类调用的,虽然也可以使用“对象名.静态变量名”进行调用,但是一般不建议,以防弄混,而且不能体现出静态变量可以跨类的特点。
d.实例对象在创建对象时在堆中创建,实例对象被垃圾回收器收走后,实例变量就释放了,而静态变量在程序加载时就在方法区中分配存储空间,知道程序结束才释放。
e.两个例子说明静态变量共用同一块储存空间
例1:public class TransferProperty {
int i =47; //实例变量,初始赋值为47
public void call() { //创建一个call方法
System.out.println("调用call方法");
for(i=0;i<3;i++) { //创建一个循环,其中局部变量i与成员变量重名(注意,此时局部变量i和成员变量i其实是使用同一地址)
System.out.print(i+"");
if(i==2) {
System.out.println("\n"); //此方法打印0 1 2后换行
}
}
}
public TransferProperty() { //创建一个构造方法,可用来创建新的TP类对象
}
public static void main(String[] args) {
TransferProperty t1=new TransferProperty(); //创建新对象t1
TransferProperty t2=new TransferProperty(); //创建新对象t2
t2.i=60; //赋值t2中的i变量为60
System.out.println("第一个实例对象调用变量i的结果是:"+t1.i); //输出此时t1中i的值,因为未赋值,所以时系统初始赋值47
t1.call(); //调用call方法,打印出0 1 2
System.out.println("第二个实例对象调用变量i的结果是:"+t2.i); //输出t2中i的值,上面重新对t2.i进行了赋值,所以输出60
t2.call(); //调用call方法,打印出0 1 2
}
}
从此例可以看出,不同的实例变量是储存在不同内存中,即实例变量是属于具体对象的,局部变量虽然重名,也是储存在另外一个内存中
例2:public class AccessProperty{
static int i =47; //创建一个静态成员变量,初始赋值为47
public void call() { //创建一个call方法
System.out.println("调用call方法");
for(i=0;i<3;i++) { //创建一个循环,其中局部变量i与成员变量重名
System.out.print(i+"");
if(i==2) {
System.out.println("\n"); //此方法打印0 1 2后换行
}
}
}
public AccessProperty() { //创建一个构造方法,可用来创建新的AP类对象
}
public static void main(String[] args) {
AccessProperty t1=new AccessProperty(); //创建新对象t1
AccessProperty t2=new AccessProperty(); //创建新对象t2
t2.i=60; //赋值t2中的i变量为60
System.out.println("第一个实例对象调用变量i的结果是:"+t1.i); /*输出此时t1中i的值,因为整个类中i全部共用一个地址,最近i的变化是 对t2.i的赋值60,所以打印结果是60,而不是例1中的47*/
t1.call(); //调用call方法,打印出0 1 2
System.out.println("第二个实例对象调用变量i的结果是:"+t2.i); /*输出t2中i的值,上面虽然重新对t2.i进行了赋值,但是最近的t1调用的 call方法中,i的值实际上已经变为了3,所以此时输出值为3*/
t2.call(); //调用call方法,打印出0 1 2
}
}
从此例可以看出,由于加了static修饰,所以即使不同的对象,其变量i的值依然是使用同一储存空间,而且方法中的同名局部变量也是使用同一空间,正是体现出了静态变量共享数据的特点,其为整个类所共享
4.包装类
a.由于Java中基本类型功能简单不具备对象的特性,所以为了使其具备对象的特性就出现了包装类,其与基本数据类型一一对应就可以像操作对象一样操作基本类型了。
b.包装类主要有两种方法,一种是本类型和其他类型之间的转换,另一种是字符串和本类型以及其他类型之间的转换。
c.包装类和基本类型之间的转换需要进行装箱和拆箱,装箱是指将基本类型转换成包装类,分为自动装箱和手动装箱而拆箱则是值将包装类转换成基本类型,也分为自动装箱和手动装箱,在jdk1.5版本后,系统引入了自动拆装箱。
d.字符串和本类型以及基本类型的转换分为两类,一类是基本类型转换到字符串,包括三种方法:包装类的toString()方法;String类的valueOf()方法;空字符串加一个基本类型变量(最常用)。字符串转换到基本类型有两种方法:包装类的parse*()方法;包装类的valueOf()方法。
5.数字处理类是专门为解决数字问题而设计的类,一些简单的数学问题都可以通过数字处理类来解决,主要包括DecimalFormat类(用于格式化数字)、Math类(为各种数学计算提供工具方法)、Random类(为java处理随机问题提供了各种方法)、BigInteger类与BigDecimal类(为所有大数字的处理提供了相应的数学运算操作方法)。
明天计划的事情:
继续啃基础部分,先把基础打好再去做任务,老大划重点的地方重点看,其他不太重要的略看
遇到的问题:
要看要记要理解的东西太多了,感觉越学发现自己不会的越多
收获:
对构造方法,this关键字,静态变量有了一个深入的了解,粗略了解了包装类和数字处理类
评论