类与对象(封装)

类是生产对象的蓝图,首先生产类,才可以产生对象。对象的所有行为,一定在类中进行了完整的定义。

类的语法:

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方法。

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值