目录
1.private实现封装处理
1.1先举个例子:这个例子会出现乱码
class Person{
String name;
int age;
double hb; //花呗
public void getInfo(){
System.out.printf("年龄为:"+age+",姓名为:"+name+"余额为:"+hb);
}
}
public class FristClass{
//一般把主函数称为客户端
public static void main(String[] args){
Person per=new Person();
per.name="马云爸爸";
per.age=50;
per.hb=10000000000000000.0;
Person per1=new Person();
per1.name="张三";
per1.age=20;
per1.hb=100;
//per1.hb=-2000; //会出现数字乱码
per.getInfo();
per1.getInfo();
}
}
总结:
若类中属性直接暴露给对象操作,存在不安全问题(由于对象可以直接操作操作类中属性,无法限制属性是否正常设置)。
应使用private进行修饰(对属性做封装).
使用private修饰的属性或方法,表示该属性与方法只能在本类中直接使用,其他类无法直接使用private封装的属性或方法。
改正后的代码如下:
class Person{
String name;
int age;
private double hb; //花呗
public void getInfo(){
System.out.printf("年龄为:"+age+",姓名为:"+name+"余额为:"+hb);
}
}
public class FristClass{
//一般把主函数称为客户端
public static void main(String[] args){
Person per=new Person();
per.name="马云爸爸";
per.age=50;
per.hb=10000000000000000.0;
Person per1=new Person();
per1.name="张三";
per1.age=20;
//per1.hb=100;
per1.hb=-2000;
per.getInfo();
per1.getInfo();
}
}
default权限就是在属性或方法前啥也不写.
class Person{
String name;//在string中都没有加public或private
}
Person类与name属性都是default权限(包访问权限,在同一个源文件中都可以访问)
1.2若private封装的属性要被类的外部访问,需要提供setter/getter方法
- setter方法用于设置属性值
- getter方法用于取得属性值
class Person{
String name;
int age;
private double hb; //花呗
public void getInfo(){
System.out.printf("年龄为:"+age+",姓名为:"+name+"余额为:"+hb);
}
//hb的setter方法
public void setHb(double b){
if(b<0){
hb=0.0;
return;
}else{
hb=b;
}
hb=b;
}
//hbd的getter方法
public double getHb(){
return hb;
}
}
public class FristClass{
//一般把主函数称为客户端
public static void main(String[] args){
Person per=new Person();
per.name="张三";
per.age=20;
per.setHb(-2000);
//per.setHb(2000); //输出结果正常
per.getInfo();
}
}
3.类的设计原则:
- 编写类时,所有的属性必须使用private封装
- 属性若要被外部访问,必须定义相应的getter与setter方法
2.类的构造方法
定义:构造方法是在使用关键字new实例化新的对象时调用的方法。
1.Person 2.per=3.new 4.Person();
1:类名称
2:对象引用
3:在堆上开辟空间
4:构造方法(无参构造)
4.1构造方法特征:
I.构造方法名称必须与类名称相同
***II.***构造方法没有返回值类型声明
//命名不规范的普通方法,必须通过对象调用
public void Person(){}
//无参构造,在对象产生时调用,与类同名,并没有返回值类型声明
public Person(){}
III.每个类中一定至少存在一个构造方法(若没有明确定义,系统会生成一个默认的无参构造;若明确定义了构造方法,系统不再生成无参构造)
class Person{
String name;
int age;
private double hb; //花呗
//无参构造
public Person(){
System.out.println("*******");
}
public void getInfo(){
System.out.printf("年龄为:"+age+",姓名为:"+name+"余额为:"+hb);
}
//hb的setter方法
public void setHb(double b){
if(b<0){
hb=0.0;
return;
}else{
hb=b;
}
hb=b;
}
//hbd的getter方法
public double getHb(){
return hb;
}
}
public class FristClass{
//一般把主函数称为客户端
public static void main(String[] args){
Person per=new Person();
per.name="张三";
per.age=20;
per.setHb(-2000);
//per.setHb(2000); //输出结果正常
per.getInfo();
}
}
java编译器是根据程序结构来区分普通方法与构造方法的,所以在构造方法前没有返回值类型声明
构造方法的作用:
为类中属性初始化,避免多次的setter调用。
class Person{
// //要调用两次setter,因为用了两个private封装
// private String name;
// private int age;
//有参构造,为类中属性初始化值,构造方法
public Person(String n,int a){
//当调用时实际上会将这两句移到构造方法
//里,进行赋默认值初始化,再等于后边赋的值
private String name=null;
private int age=0;
name=n;
age=a;
}
public class FristClass{
//一般把主函数称为客户端
public static void main(String[] args){
Person per=new Person("张三",20); //无参构造
per,getInfo();
}
}
构造重载:
一系列参数个数不同的构造方法。
class Person{
//要调用两次setter,因为用了两个private封装
private String name;
private int age;
//有参构造,为类中属性初始化值,构造方法
public Person(){
Syatem.out.printly("*******");
}
public Person(String n){
name =n;
}
public Person(String n,int a){
name=n;
age=a;
}
public class FristClass{
//一般把主函数称为客户端
public static void main(String[] args){
Person per=new Person("张三",20); //无参构造
per.getInfo();
Person per1=new Person();//全是默认值,调用**那行
Per1.getInfo();
Person per2=new Person("李四");//调用有参构造
per2.getInfo();
}
}
本文完。