当我们创建一个对象的时候,我们可以通过‘对象、属性’的方式,对对象的属性进行赋值。 这里赋值操作要受到属性的数据类型和存储范围的制约,但是除此之外,没有其他制约条件。 但是实际问题中我们需要给这个属性赋值加入额外的限制条件这个额外条件就不能在属性的声明时体现,我们只能通过方法来进行限制条件的添加
private :私有的。当对属性加入这个条件的时候就不能直接调用这个方法了
public class fz { public static void main(String[] args) { Anim ani =new Anim(); //ani.age=17;// 因为下面的年龄属性已经设置为私有的了 就不可以直接进行调用不然就以报错 ani.setAge(13); // 设置年龄只能通过它内部提供的方法 ani.name = "旺财"; ani.info(); //名字是: 旺财,age: 13 System.out.println(ani.getAge()); // 通过内部的获取方法 } } class Anim{ private int age; // 给年龄加上限制条件 String name; public void setAge(int num){ if(num < 0){ System.out.println("不好意思年龄不可以小于0"); }else{ age = num; } } public void info(){ System.out.println("名字是: "+name+"age: "+age); } public int getAge(){ // 对外部提供一个获取的方法 return age; } }
封装代码性的体现:
我们将类的私有化(private)同时,提供了(public)方法来获取(get/set)来获取或者设置此属性的值
封装行性的体现:
1、private 2、不对外暴漏私有化方法 3、单例模式
封装的体现需要权限修饰符来配合:
java的4种权限(从小到大):private、缺省(什么都不写)、protected、pbulic
这4种权限都可以用来修饰类的内部结构:属性、方法、构造器、内部类
练习:
创建程序,在其中定义两个类:Person和PersonTest类。定义如下:
用setAge()设置人的合法年龄(0~130),用getAge()返回人的年龄。 在PersonTest类中实例化Person类的对象b,调用setAge()和 getAge()方法,体会Java的封装性。
public class Order { public static void main(String[] args) { PersonTest pt = new PersonTest(); pt.info(17); System.out.println(pt.getinfo()); } } class PersonTest{ Person1 per = new Person1(); public void info(int num){ per.setAge(num); } public String getinfo() { return per.getAge(); } } class Person1{ private int age; public void setAge(int num){ if(num >= 0 && num <=130 ){ age = num; }else{ System.out.println("您输入的年龄不合法"); } } public String getAge(){ return "您输入的年龄是:"+age; } }
构造器:
其实我们之前就接触了构造器只不过是大家不清楚
Person per = new Person() // 后面的Person()这个部分就是构造器
构造器的作用:
创建对象,给对象初始化。 也就是构造器一步实现了。python中的__new__和__init__ 方法
构造器的作用:创建对象;给对象进行初始化 如:Order o = new Order(); Person p = new Person(“Peter”,15); 如同我们规定每个“人”一出生就必须先洗澡,我们就可以在“人”的 构造器中加入完成“洗澡”的程序代码,于是每个“人”一出生就会自 动完成“洗澡”,程序就不必再在每个人刚出生时一个一个地告诉他们 要“洗澡”了。
说明:
如果没有现实构造器的话 系统默认提供一个空参数的构造器
构造器格式:
权限修饰符 类名(形参列表){}
语法格式:
修饰符 类名 (参数列表) {
初始化语句;
}
eg: public person(){} //这就是一个简答的构造器
在实例化类的时候就调用了 这个类的中的默认的构造器,一旦我们定义了构造器系统就不再提供默认的空参数构造器
构造器的执行:当我们在实例化对象的时候 执行new就去调用了构造器
练习:
1. 在前面定义的Person类中添加构造器,利用构造器设置所有人的age属 性初始值都为18。
2. 修改上题中类和构造器,增加name属性,使得每次创建Person对象的同 时初始化对象的age属性值和name属性值。
编写两个类,TriAngle和TriAngleTest,其中TriAngle类中声明私有的底 边长base和高height,
同时声明公共方法访问私有变量。此外,提供类 必要的构造器。另一个类中使用这些公共方法,计算三角形的面积。
this关键字
this关键字的使用:
用来修饰 属性、方法、 构造器
this理解为当前对象
eg:大家在给对象中的属性赋值的时候你的形参和当前的属性名一样的话 会被覆盖 会默认行参给行参传递参数,那么就需要用到this关键字了
通常情况下我们都选择省略this,如果方法的形参和属性同名时,我们必须显示使用this方法声明此变量是属性而非行参
我们可以通过this在另外一个方法中调用另外一个方法
public PersonTest(int a, String name){ this.getAge(); // 通过this来调用其他方法 this.name =name; age = a; }
this调用构造器 :
当调用构造器的时候直接this(行参列表);来调用本类的指定的构造器;
构造器中不能通过this(行参列表);的方式调用自己,只能调用别的构造器
this(行参列表);必须声明在当前构造器的首行,(一个构造器内部只能有一个this调用其他的构造器)
练习:
public class lx { public static void main(String[] args) { Gol gol = new Gol("梁山伯",23); gol.shout(); Girl girl = new Girl("朱丽叶", 38); girl.merry(gol); girl.compare(girl); } } class Gol{ private int age; private String name; public Gol(){ } public Gol(String name){ this.name = name; } public Gol(String name, int age){ this.name = name; this.age = age; } public void setAge(int age){ this.age = age; } public void setName(String name){ this.name = name; } public int getAge(){ return age; } public String getName(){ return name; } public void merry(Girl girl){ System.out.println("我想娶:"+girl.getName()); } public void shout(){ if(this.age > 22){ System.out.println("你可以娶合法登记了"); }else{ System.out.println("滚回去长大了再来"); } } } class Girl{ private int age; private String name; public Girl(){} public Girl(String name){ this.name = name; } public Girl(String name, int age){ this.name = name; this.age = age; } public void setAge(int age){ this.age = age; } public void setName(String name){ this.name = name; } public int getAge(){ return age; } public String getName(){ return name; } public void merry(Gol gol){ System.out.println("我想嫁给:"+gol.getName()); gol.merry(this); // 把当前对象传递进去 } /** * */ public void compare(Girl girl){ if(this.age >= girl.age){ System.out.println("你可以嫁给他了"); }else{ System.out.println("不可以你需要再谈谈恋爱"); } } }
package关键字:
package关键字的使用:
1、为了更好的实现项目中类的管理,提供包的概念 2、使用package声明类或者接口属性,声明再源文件首行 同一个目录下不能命名相同的接口或者是类
.