类与对象
所有例子的类为
class person{
String name;
int age;
public void tell(){
System.out.println("姓名:"+name+"年龄:"+age);
}
}
1、声明对象的两种方法
- 声明并实例化对象:类名称 对象名称=new 类名称();
- 分步骤完成:
声明对象:类名称 对象名称=null;
实例化对象:对象名称=new 类名称();
2、对象的内存分析
栈内存:用于存储地址。
堆内存:用于存储对象具体信息。
有关new的理解:相当于C中的指针,只要看到new关键字那么一定有存储空间的分配
针对两种声明对象的内存分析:
- 声明并实例化对象
person per = new person();
per.name="张三";
per.age=18;
- 分布声明
person per=null;
per=new person();
per.name="张三";
per.age=18;
3、对象引用分析(引用传递分析)
class person{
String name;
int age;
public void tell(){
System.out.println("姓名:"+name+"年龄:"+age);
}
}
public class java{
public static void main(String args[]){
person per1=new person();
per1.name="张三";
per1.age=18;
person per2=per1;//引用传递
per1.tell();//进行方法的调用
}
}
也可以利用方法实现引用传递处理:
class person{
String name;
int age;
public void tell(){
System.out.println("姓名:"+name+"年龄:"+age);
}
}
public class java{
public static void main(String args[]){
person per1=new person();
per1.name="张三";
per1.age=18;
change(per1);
per1.tell();
}
}
public static void change(person temp){
temp.age=80;
}
总结:引用传递可以发生在发放上,这时一定要观察方法的参数类型。同时也要观察方法执行的过程。
4、引用传递和垃圾产生分析
class person{
String name;
int age;
public void tell(){
System.out.println("姓名:"+name+"年龄:"+age);
}
}
public class java{
public static void main(String args[]){
person per1=new person();
person per2=new person();
per1.name="张三";
per1.age =18;
per2.name="李四";
per2.age=19;
per2=per1;//引用传递
per2.age=80;
per1.tell();
}
}
- 垃圾空间:没有任何栈内存指向的堆内存空间。
- 所有垃圾会被GC回收,如果垃圾太多会影响性能。
- 一个栈内存只能够保存有一个堆内存的地址数据。如果发生更改则之前的垃圾应当被消除。
5、属性封装
问题:属性不封装的情况下外部可以直接进行调用,很有可能会设置错误的数据。
作用:使类外部不可见,类内部可见。
方法:利用private关键字进行属性封装。
设置或者取得属性可以使用SETxxx()、getxxx()方法
设置属性方法:public void setname(String n)
获得属性方法:public String getName()
tip:类中所有属性必须用private封装,并且属性使用必须要提供stter、getter方法
6、构造方法与匿名对象
构造方法用于实例化的属性初始化(只能用于初始化)
构造方法要求:
- 构造方法名称必须与类名称保持一致
- 构造方法不允许设置任何返回值类型
- 构造方法是使用关键字new实例化对象时自动调用的
public person(String n,int a)
{
name =n;
age =a;
}
person per=new person("张三",18);
使用默认构造方法与自己写构造方法的比较:
总结:如果你的类中没有构造方法,JAVA会提供一个无参的什么都不做的构造方法,这个构造方法是在程序编译的时候自动创建的。如果在类中有明确的构造方法时,默认构造方法就不会被创建。(一个类至少存在一个构造方法,永恒存在)
一个问题:为什么构造方法不允许返回值类型?为什么不用void定义?普通方法和构造方法最大区别?
构造方法也可以进行重载,多个构造方法定义的时候建议有一些定义的顺序(可以按照参数的个数降序或者升序进行排列)
匿名对象:通过实例化之后的对象来进行操作的对象。
public class java{
public static void main(String args[])
{
new person("张三",10).tell();
}
}
这中对象虽然可以通过编译,但是由于此对象没有任何引用名称,所以引用一次之后就会被当成垃圾。