JavaSE之面向对象编程—类与对象(上)—— 3

一、private实现封装处理和构造方法(匿名对象)
1.private实现封装处理
封装是java的一大特性,private只是为实现封装处理做了一个铺垫。我们之所以存在封装是因为封装可以是我们的程序更加的有序,更加的安全private它表示私有化,它可以帮助我们实现面向对象的这一特性。
例子:无封装的程序

class Person2{
	String name;
	int age;
	 public static void main(String[] args){
		 //创建对象1
		 Person2 per1 = new Person2();
		 per1.name="张三";
		 per1.age=14;
		 //创建对象2
		 Person2 per2 = per1;
		 per1.name="李四";
		 per1.age=15;
	 }
 }
 

通过在本类直接创建对象,访问这个对象的属性、方法。显然这种方法可以让外部看见我们的信息,所以我们要回避这种方法,为了让外部在操作的时候不可见,我们就使用private进行封装。
对private修饰过的属性表示私有的,外部是不可以直接访问的,需要通过我们的getter、setter方法进行访问。

*setter:主要用于进行属性内容的设置与修改,外部需要给值给内部,让它修改,所以函数是含参函数,但是不需要返回值,只要修改就好啦,所以函数类型为void。
*getter:主要用于属性内容的取得,要给外部返回内部的属性值,所以需要return 语句,所以函数的类型应该是对应属性的类型,但是不需要返回值,所以参数个数为0。
栗子:

public class Person{
	private String name;
	private  int age;
	private  String secret;
    private String gender;
//java 类的属性
//getter get***() --->***属性名称
//封装
String getName(){
	return name;
}
int getAge(){
	return age;
}
String Gender(){
	return gender;
}
String getSecret(){
	return secret;
}
void setName(String name){
	this.name=name;
}
void setAge(int age){
	this.age=age;
}
void setGender(String gender){
	this.gender=gender;
}
void setSecret(String secret){
	this.secret=secret;
}
String personInfo(){
	return "这个人叫"+name+",年龄"+age+",性别"+gender;
}
public static void main(String[] args){
		
		//对象1
		Person person = new Person("jack","男");//创建对象
		//对对象属性进行赋值
		//setter
		person.setAge(21);
		
		//person类的secret保护,封装
		//外部程序要访问 封装的属性 通过提供方法访问
		System.out.println(person.getSecret());//为String的默认值
		//getter
		System.out.println(person.getName());
        System.out.println(person.personInfo());	
	}
}

通过封装以后我们可以看到,通过private实现封装以后,程序的最大变化在于:只允许本类访问,不允许外部类访问。
*类的设计原则
(1)类的所以有属性都用private封装;
(2)属性要被外部访问的时候,必须定义setter、getter方法。
2.构造方法与匿名对象
(1)创建对象:
类名 对象名 = new 类名();
在创建对象的时候:
a.任何对象都应该有其对应的类,类是对象的蓝图;
b.这个对象是一个唯一的标记,引用一块堆内存;
c.表示开辟新的堆空间;
d.构造方法
(2)构造方法的定义
构造方法就是使用关键字new实力化新对象时调用的方法。就是为了在堆内存中开辟一块内存来放这个类的属于这个对象特有的属性。
我们在定义构造方法的时候也得遵守以下规则:
a.方法名称必须与类名相同;
b.构造方法没有返回值类型声明;
c.每一个类中至少有一个构造方法,这样才可以创建对象,开辟堆内存。如果我们没有明确定义,那么系统会自动的给我们创建一个无参构造函数;但如果我们已经定义了,那么系统将不再给我们创建这个无参构造。
问题:构造方法无返回值,为什么不用void声明?
答:void不代表没有返回值,只是代表返回值为空(可以写return语句),不用void表示构造方法返回自己(对象)。
注意:
*属性是在对象开辟堆内存时开辟的空间;
*构造方法是在使用new后调用的;
*普通方法是在空间开辟了、构造方法执行之后可以多次调用的。
栗子:使用构造方法设置对象属性

public class Car{
	//属性
	private String color;  //颜色
	private int id;     //车牌号
	private int price;  //价格
	public Car(String color,int id,int price){
		this color = color;
		this.id = id;
		this.price=price;
	}
	//Car类的方法--》行为
	//注意:在类里面的方法不应该定义为私有的,因为如果方法定义为私有的就没有办法访问了
	//那定义这个方法的意义就没有了。但是属性不一样。属性可以定义为私有的,私有的属性可以通过
	//公有的方法进行访问。
	  void khapTronPai(){
		System.out.println("向前开");
	}
	String carInfo(){
		return "这个车的颜色是:"+color+"车牌号为:"+id+"价格是:"+price;
	}
	
	//封装
	//用getter对属性进行封装,得到某个类的私有属性;get是得到,那么就有返回值
	//get函数是返回值,那么只需要函数没有参数
	String  getcolor(){
		return color;
	}
	int getid(){
		return id;
	}
	int price(){
		return price;
	}
	//set函数是为了给相应的属性传值,对创建对象时已经赋值的属性进行修改
	//那么它不需要返回值但需要参数进行传递
	//因为时在当前类里面的所以就算是私有属性也可以通过this进行访问。
	void setcolor(String color){
		this.color=color;
	}
	void setid(int id){
		this.id=id;
	}
	void setprice(int price){
		this.price=price;
	}
	public static void main(String[] args){
	Person person3 = new Person("李四","女",28,"???");	
    System.out.println(person3.personInfo());	
	}
}

构造方法的调用和对象内存分配几乎是同步完成的,因此我们可以利用构造方法来类中的属性进行初始化(可以避免多次调用setter)
3.构造方法重载:参数类型、个数不同
栗子:

public class Person{
	private String name;
	private  int age;
	private  String secret;
    private String gender;

    //构造方法重载
    //构造方法
    //方法名:和类名一样
    //返回值:无
	//根据实际生活一个人需要有一些必要的属性,所以无参构造不应该有
// public Person(){
	
// }
public Person(String name,String gender){
	this.name=name;
	this.gender=gender;
}	
public Person(String name,String gender,int age){
	this(name,gender);//this这个方法的调用必须放在构造方法中的第一条语句
	this.age=age;
}
public Person (String name,String gender,int age,String secret){
	this(name,gender,age);
	this.secret=secret;
}
//对象1
		Person person = new Person("jack","男");//创建对象
}
//对象叫person2
	Person person2 = new Person("张三","男",21);
	
	//Person person3 = new Person("李四","女",28,"???");
	Person person3 = new Person("李四","女",28);
    person3.setSecret("???");

System.out.println(person.personInfo());	
System.out.println(person2.personInfo());	
System.out.println(person3.personInfo());	

注意:
(1)构造方法的重载是为了创建出更多不同的对象;
(2)在构造方法很多的时候,最好按照参数个数进行升序排序;
(3)进行类定义时良好的代码风格:定义属性——》定义构造方法——》定义普通方法。
4.匿名对象
定义:匿名对象就是在栈上没有具体存放它地址的变量,没有指向它的,所以它使用一次以后就变为垃圾空间了,等到GC定期清理的时候就将它清理掉。好处是用完即释放。
栗子:

public class TestPerson{
	public static void main(String[] args){
		//创建匿名对象
System.out.println(new Person("Alice","女",18).personInfo());
	
	}
}

猜你喜欢

转载自blog.csdn.net/ZhuiZhuDream5/article/details/83833226