Private封装
在进行java学习中 我发现很多人对 类 属性 外部 等名词不是很理解。
eg: 我们定义了一个Person类 类中定义的String类型的name 和int类型的age 都是这个类中的属性
而外部就比较好理解 就是指这个类之外的。
面向对象之中有三大主要特征:封装、继承、多态,对于封装是整个java中最复杂的概念,而本次所讲解是封装的基本概念而已。
如果要想清楚封装,首先必须清楚如果没有封装会怎么样。
当语法没有出错时,有时还会出现业务逻辑出错。(例如年龄是负数之类的)。那么此时如果要想回避此类问题,那么首先要解决的就是如何可以让对象不能直接操作年龄的属性,或者指的是让类的外部如何不能够操作类中的敏感内容。所以此时解决问题的核心观念就在于:如何让内部的操作对于外部不可见,此时就可以利用private关键字来实现。
范例:利用peivate来实现封装
(还有别的方法进行封装)
类中的属性和方法上都可以使用private定义,但是大部分情况下很少会在方法上使用private,
一旦属性的声明上使用了private定义之后,那么如果其它类再直接进行该属性访问的时候就将出现如下的错误提示:
eg: 错误:name可以在Person中访问private 直接理解成 Person类中是private所以不能直接访问
此时使用了private声明之后属性安全了,外部无法直接操作了,那么新的问题又来了。
那么如果现在要想进行private的私有属性的访问,
按照java的设计原则就可以使用setter、getter方法:
setter方法:主要用于进行属性内容的设置;
private String name : public void setName(String n);
getter方法:主要用于属性内容的取得;
private String name : public void getName();
范例:扩展Person类中的内容
class Person{
private String name;
private int age;
public void setName(String n){
name=n;
}
public void setAge(int a){
if(a>=0&&a<=150){
age=a;
}
age=0;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public void info(){
system.out.println("name ="+name+"、age="+age);
}
}
public class TestDemo{
public static void main(String args[]){
Person per=new Person();
per.setName("张三");
per.setAge(-200);
per.info();
}
}
如果说现在非要进行年龄检测,那么可以在setter里面完成。
用绿色表示.这个检测这个最大的核心概念在于属性被封装了
类的设计原则:
以后再编写类的时候类中的所有属性必须使用private封装。
而使用private封装的属性如果需要被外部所使用,
那么就按照格式定义相应的ssetter、getter方法
private实现封装的最大特征在于:只允许本类访问,而不允许外部访问。
private只是封装的第一步。
构造方法与匿名对象
在之前讲解了实例化对象的产生格式:
1类名称 2对象名称=3new 4类名称();
对于以上的格式观察组成部分:
1.类名称:任何的对象都应该有其对应的类,因为没有类就不知道对象具备的功能
2.对象名称:是一个唯一的标记,表示的是以后操作的属性的标记。
3.new: 表示开辟新的堆内存空间
4.类名称():构造方法。
通过以上的分析就应该已经清楚了,
所谓的构造方法指的就是在使用关键字new实例化新对象的时候来进行调用的操作方法,
但是对于构造方法定义也需要遵循如下方法原则:
方法名称必须与类名称相同,并且构造方法没有返回值类型声明,
同时每一个类中一定会至少存在有一个构造方法,如果类中没有明确的定义任何一个构造方法,
那么将自动生成一个无参的,什么都不做的构造方法。
疑问:既然构造方法中没有返回数据,为什么不使用void定义呢?
现在的类中的组成:属性、普通方法、构造方法
属性是在对象开辟堆内存的时候就开辟的空间
构造方法是在是使用关键字new同时调用的
|-构造方法:public Person();从定义的结构上就出现了偏差,所以程序是按照结构上的偏差进行归类的
普通方法是在对象已经实例化完成了(空间开辟了、构造方法执行了)再调用的,可以调用多次。
|-普通方法:public void Person(),命名不标准;
对于类中可以自动生成的无参构造方法实际上是有一个前提的:你类中没有定义任何的构造方法,相反,如果你现在类中已经定义了构造方法,那么此默认的构造方法将不会自动生成。
范例:类中定义一个有参构造方法
构造方法作用:
1.构造方法的调用和对象内存分配几乎是同步完成的,(几乎是并不是完全等价),所以可以利用构造方法设置类中的属性内容,构造方法可以为类中的属性就行初始化处理;
2.通过构造方法设置内容实际上就可以避免重复的setter调用了
|-在实际开发之中,setter方法除了有设置内容之外,也可以承担修改数据的操作
既然构造方法本事属于方法,那么方法就一定可以进行重载,而构造方法的重载更加简单,因为方法名称就是类名称,所以能够做的就是实现参数的类型或个数不同这一概念。
范例:构造方法重载
但是在进行构造方法重载的时候请主义下定义结构。建议诺干个构造方法按照参数的个数采用升序或者降序排列。
同时也需要注意一点:在进行类定义的时候,请按照如下顺序完成:
第一部分写属性;
第二部分写构造方法;
第三部分写普通方法。
我们发现构造方法可以传递属性的内容了,很多时候为了使用方 便,往往会使用匿名对象完成。匿名对象
范例:匿名对象
由于匿名对象不会有任何的栈空间所指向,所以使用一次之后就将成为垃圾。
你现在是否使用匿名对象没有绝对定论,你一切都可以使用有名对象。
3.总结
1.构造方法每个类中至少存在一个
2.构造方法的名称与类名相同,无返回值类型.
3.构造方法允许重载,重载时只需要考虑方法的参数类型或个数即可。
综合实战:简单java类
未完待续。。。。。。。