对象保存在栈内存之中,属性保存在堆内存之中,方法则是保存在全局代码区,此代码区是所有对象共享的。
Person per = new Person();
或者这样声明并实例化对象:
Person per = null;
per = new Person();
示例:
class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:"+ name + ",年龄:" + age);
}
};
public class demo {
public static void main(String args[]) {
Person per = new Person();//声明并实例化对象per
per.name = "庞先生";//给per对象赋值
per.age = 22;
per.tell();
}
}
如果只声明了对象,而没有实例化,即对象没有其堆内存的空间指向(指针),会报错:
Exception in thread “main” java.lang.NullPointerException
at demo.main(demo.java:13)
出现了一个空指向异常
public class demo {
public static void main(String args[]) {
Person per1 = new Person();//声明并实例化对象
Person per2 = new Person();//声明并实例化对象
per1.name = "庞先生";
per2.name = "黄先生";
per1.age = 22;
per2.age = 21;
per1.tell();//调用per1对象的tell方法
per2.tell();//调用per2对象的tell方法
}
}
情况一:对象的引用传递
public class demo {
public static void main(String args[]) {
Person per1 = new Person();//声明并实例化对象
Person per2 = per1;//引用per1的对象,把per1的堆内存空间使用权给per2
per1.name = "庞先生";//初始化per1对象的属性
per1.age = 22;
per1.tell();
per2.name = "黄先生";//利用per2对象修改per1的属性
per2.age = 21;
per1.tell();//还是调用per1对象方法,看per1的属性是否被per2改动
}
}
per1和per2对象都指向同一个堆内存空间,并不会为per2多分配一个内存空间。
情况二:重新指向另一对象
public class demo {
public static void main(String args[]) {
Person per1 = new Person();//声明并实例化对象
Person per2 = new Person();
per1.name = "庞先生";//初始化per1对象的属性
per1.age = 22;
per2.name = "黄先生";
per2.age = 21;
per1.tell();
per2.tell();
per2 = per1;//改变per2对象的堆内存空间指向,指向per1的空间。
System.out.println("修改后:");
per1.tell();//调用per2对象方法,看per2的属性是否和per1一样
per2.tell();
}
}
封装就是保护内容保护某些方法或属性不被暴露在外面。
使用private 类声明私有方法或私有属性
class Person{
private String name;
private int age;
public void tell(){
System.out.println("姓名:"+ name + ",年龄:" + age);
}
};
被封装属性如果需要被访问,可以自定义set…方法和get…方法,并且为set、get方法设置参数过滤
class Person{
private String name;
private int age;
public void tell(){
System.out.println("姓名:"+ name + ",年龄:" + age);
}
//设置名字方法
public void setName(String str) {
if (str.length()<10) {
name = str;
}else {
System.out.println("名字过长");
}
}
//取得名字方法
public String getName() {
return name;
}
//设置年龄方法
public void setAge(int n) {
if (n>0&&n<100) {
age = n ;
}else {
System.out.println("年龄不符合要求");
}
}
//取得年龄方法
public int getAge() {
return age;
}
};
public class demo {
public static void main(String args[]) {
Person per1 = new Person();//声明并实例化对象
per1.setName("庞先生");
per1.setAge(22);
int age = per1.getAge();
String name = per1.getName();
System.out.println("姓名:"+name+",年龄:"+age);
}
}
对象实例化→调用构造方法
构造方法的目的是为类中的属性初始化。
当类中没有自定义的构造方法时,将会自动创建一个默认的无参的构造方法。
class Person{
private String name;
private int age;
public Person(String str, int a) { //声明构造方法,传递参数为类的属性初始化
this.setName(str);
this.setAge(a);
}
public void setName(String str) {
if (str.length()<10) {
name = str;
}else {
System.out.println("名字过长");
}
}
public String getName() {
return name;
}
public void setAge(int n) {
if (n>0&&n<100) {
age = n ;
}else {
System.out.println("年龄不符合要求");
}
}
public int getAge() {
return age;
}
};
public class demo {
public static void main(String args[]) {
Person per1 = new Person("庞先生",22); //实例化对象并且赋初始值
//per1.setName("庞先生"); //原来的使用封装方法赋值
//per1.setAge(22);
String name = per1.getName();
int age = per1.getAge();
System.out.println("姓名:"+name+",年龄:"+age);
}
}
public Person() {}; //声明一个无参的构造方法
public Person(String str) { //声明一个只有一个参数的构造方法
this.setName(str);
};
public Person(String str, int a) { //声明构造方法,传递参数为类的属性初始化
this.setName(str);
this.setAge(a);
}
如果一个对象只使用一次,则可以使用匿名对象。
也就是说可以声明一个没有名字的对象指向堆内存,即不开辟栈内存空间存放对象名,仅开辟一个堆内存空间存放对象的属性。
public static void main(String args[]) {
new Person("庞先生",22).tell();
//Person per1 = new Person("庞先生",22); //实例化对象并且赋初始值
//per1.setName("庞先生"); //原来的使用封装方法赋值
//per1.setAge(22);
//String name = per1.getName();
//int age = per1.getAge();
//System.out.println("姓名:"+name+",年龄:"+age);
}
对于任何一个程序,对类分析思路的步骤: