java--类的封装性(2)

静态块
给静态变量赋值,同时无法一行代码完成,这时通常用静态块
JAVA规范:凡是表示种类或情况的int型参数,该类中一般都会有对应的常量定义,一般用常量

浅拷贝与深拷贝

浅拷贝传递引用,不能复制实例
深拷贝创建新实例,复制实例

package day14;

import java.util.Calendar;


public class MyDate {

    private int year,month,day;
    private static int thisYear;
    static{//静态块--给静态变量赋值,同时无法一行代码完成,这时通常用静态块
//      Calendar c=new Calendar();//错:权限+抽象
        Calendar c=Calendar.getInstance();
        //JAVA规范:凡是表示种类或情况的int型参数,该类中一般都会有对应的常量定义,一般用常量
        thisYear=c.get(Calendar.YEAR);//Calendar.YEAR=1
    }

    public MyDate() {
        this(0,0,0);
    }
    public MyDate(MyDate d) {
        this(d.year,d.month,d.day);
    }
    public MyDate(int year,int month,int day) {
        set(year, month, day);
    }
    public static int getThisYear(){
        return thisYear;
    }

    public static void setThisYear(int year){
        thisYear=year;
    }
    public void set(int year,int month,int day){
//      new MyDate(year, month, day);//STACK_OVERLOW:无穷递归,栈溢出
        this.setYear(year);
        setMonth(month);
        setDay(day);
    }

    public int getYear() {
        return year;
    }
    public void setYear(int year) {
        this.year = year;
    }
    public int getMonth() {
        return month;
    }
    public void setMonth(int month) {
        this.month = month;
    }
    public int getDay() {
        return day;
    }
    public void setDay(int day) {
        this.day = day;
    }
    @Override
    public String toString() {
        return "year=" + year + ",month=" + month + ",day="+ day;
    }

}
package day14;

public class Person {

    String name;//基本数据类型
    private MyDate bithday;//引用数据类型
    public Person(String name, MyDate bithday) {
        this.name=name;
//      this.bithday=bithday;//浅拷贝
        this.bithday=new MyDate(bithday);//深拷贝
    }
    public Person() {
        this("noName",null);
    }
    public Person(Person p) {
        this(p.name,p.bithday);
    }



    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public MyDate getBithday() {
        return bithday;
    }
    public void setBithday(MyDate bithday) {
        this.bithday = bithday;
    }
    @Override
    public String toString() {
        return "name=" + name + ", " + bithday;//这里会调用MyDate的toString();
    }

}
package day14;

public class MyDateEx {
    public static void main(String[] args) {
        System.out.println(MyDate.getThisYear());//2016

        //法一:
//      MyDate d1=new MyDate(1996, 10, 11);
//      Person p=new Person("小明",d1);
        //法二:
        Person p=new Person("小明",new MyDate(1996, 10, 11));//匿名对象--只要数据
        System.out.println(p);//name=小明, year=1996,month=11,day=10

        Person p2=new Person(p);
        p2.setName("张三");
        System.out.println(p2);//name=张三, year=1996,month=10,day=11
        System.out.println(p);//name=小明, year=1996,month=11,day=10

        p2.getBithday().setYear(2000);
        System.out.println(p2);//name=张三, year=2000,month=10,day=11
        System.out.println(p);
        //浅拷贝:name=小明, year=2000,month=10,day=11-->深拷贝:name=小明, year=1996,month=11,day=10


    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值