类是生产对象的蓝图,首先生产类,才可以产生对象。对象的所有行为,一定在类中进行了完整的定义。
类的语法:
class 类名称{
属性1;
属性2;
属性n...;
方法1(){}
方法2(){}
方法n(){}...
}
以上就是一个类的完整定义,此时的方法不再由主类直接调用,而是需要有对象调用。类有一定的设计原则,我们通过下面的说明和例子来一一深入。
生产对象的语法:
类名称 对象名称=new 类名称();
举例:定义一个Person类,并且实例化对象调用变量和方法
//定义Person类
class Person{
public String name;
public int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String getPersonInfo(){
return "姓名:"+this.name+",年龄:"+this.age;
}
}
//主类
public class Test{
public static void main(String[] args){
//产生Person类的实例(对象)p1
Person p1=new Person("张三",18);
//通过对象调用实例变量与实例方法
System.out.println(p1.name);
System.out.println(p1.getPersonInfo());
}
}
对象内存分析:
我们先简单的将Java中的内存区域分为栈内存和堆内存区域(实际Java内存区域的划分远比这个复杂)
栈内存(虚拟机局部变量表):存放的是局部变量(包含编译日期可知的各种基本数据类型、对象引用-即堆内存的地址,可以简单的理解成对象的名称),Java栈是与线程对应起来的,每当创建一个线程,JVM就会为这个线程创建一个对应的Java栈。
堆内存:保存的是真正的数据。即对象的属性信息。
下面我们通过例子来深入理解一下这两部分内存:
class Person{
String name;
int age;
//会自动产生一个无参构造方法
}
public class Test{
public static void main(String[] args){
Person per=new Person();
per.name="张三";
per.age=19;
}
}
Person per=new Person():表明在堆上分配了内存并且产生了Person类的对象per来引用这部分内存,内存图如下:
per.name = “张三” ; per.age = 19;通过对象per来设置堆中属性值
引用传递分析:
同理在数组中所介绍过的引用传递,都是指一块堆内存被多个栈内存所指向
举例:Person per1 = new Person(); Person per2 = new Person(); per2 = per1 ;
直接看图:
数组中不会产生垃圾空间,因为不会开辟新的内存;在上面的这个例子中,产生了垃圾空间,即没有任何栈内存指向的堆空间
用private实现封装
封装是面向对象里面最复杂的概念,使用private关键字实现的封装出来是封装的第一步
举例:
class Person{
String name;
int age;
public void getPersonInfo(){
System.out.println("姓名:"+name+"年龄:"+age);
}
}
public class Test{
public static void main(Strng[] args){
Person per=new Person();
per.name="张三";
per.age=-200;
per.getPersonInfo();
}
}
在这个例子中,对象可以直接操作属性,所给的年龄(-200)肯定是有问题的,存在一定的不安全,为了回避此类问题,可以使用private进行封装
封装完之后,要访问私有属性该怎么访问呢?按照Java的设计原则必须提供以下两种方法:
setter方法:主要用于进行属性内容的设置与修改
getter方法:主要用于属性内容的取得
下面就是经过封装的属性,并且对象不可以直接调用属性,得通过类中的方法:
class Person{
private String name;
private int age;
public void setName(String n){
name=n;
}
public String getName(){
return name;
}
public void setAge(int a){
if(a>0&&a<=200){
age=a;
}else{
age=0;
}}
public int getAge(){
return age;
}
public void getPersonInfo(){
System.out.println("姓名:"+name+",年龄:"+age);
}
}
public class Test7{
public static void main(String[] args){
Person per=new Person();
per.setName("张三");
per.setAge(-100);
per.getPersonInfo();
}
}
综上,我们可以得到类的设计原则:编写类时,类中的所有属性必须使用private封装;属性如果要被外部访问,必须定义setter、getter方法。