Java---对象与类的封装

简介: Java---对象与类的封装

一、类和对象:

package cn.hncu.Myclasslearn;
/**
 * 
 * @author hncu_chx
 *
 * Mylove amin
 */
/**类是一种数据类型,声明一个类就是定义了一个数据类型。
    类的实例(instance)是类的取值,对象就是类的变量,一个对象能引用一个实例,
    就像一个int变量i能够保存int类型的一个常数。
    声明对象:
    类  对象
    MyDate d1;//声明d1是MyDate类的一个对象
**/
public class MyDate {//类声明
    int year;
    int month;
    int day;//成员变量
    void set(int y,int m,int d){//成员方法,设置日期值
        year=y;
        month=m;
        day=d;
    }
    private void set(MyDate d) { //将当前对象值设置为参数值,重载
        set(d.year,d.month,d.day);      //调用重载的同名成员方法
    }
    @Override
    public String toString() {   //返回中文日期字符串
        return  year + "年" + month + "月" + day + "日";
    }
    public static void main(String[] args) {
        MyDate d1 = new MyDate();      //声明对象、创建实例、引用赋值
        d1.set(2012, 1, 1);            //调用类成员方法
        MyDate d2 = d1;               //对象引用赋值
        System.out.println("d1:"+d1.toString()+",d2:"+d2.toString());
        d2.month = 10;               //修改实例成员变量值
        System.out.println("d1:"+d1+",d2:"+d2); //输出对象字符串描述,默认调用toString()
        d2 = new MyDate();  //创建另一个实例
        d2.set(d1);
        System.out.println("d1:"+d1+",d2:"+d2);
    }
}


程序运行图片:

image.png

二、类的封装

package cn.hncu.Myclasslearn;
/**
 * 
 * @author hncu_chx
 *
 * Mylove amin
 */
public class MyDate_2 {
    private int year,month,day; //私有成员变量
    private static int thisYear; //当前年份,私有化静态成员变量
    static{
        thisYear = 2012;
    }
    public MyDate_2(int year,int month,int day){   //构造方法,指定日期
        this.set(year,month,day);        //调用本类的成员方法
    }
    public MyDate_2(){  //无参数构造方法,指定默认日期,重载
        this(1970,1,1);     //调用本类已声明的其他构造方法
    }
    public MyDate_2(MyDate_2 d){  //拷贝构造方法,日期通参数,重载
        this.set(d);
    }
    private void set(int year, int month, int day) {  //设置日期值,算法不全
        this.year = year;
        this.month = (month>=1&&month<=12)?month:1;
        this.day = (day>=1&&day<=31)?day:1;  //this引用不能省略
    }
    private void set(MyDate_2 d) { //设置日期值,重载
        set(d.year,d.month,d.day);//调用同名成员方法,不能使用this()
    }
    public int getYear(){    //获得年份
        return this.year; 
    }
    public int getMonth(){  //获得月份
        return this.month;
    }
    public int getDay() {  //获得当月日期
        return this.day;
    }
    public String toString(){  //返回中文日期字符串,月日占2位
        return year+"年"+String.format("%02d", month)+"月"+String.format("%02d", day)+"日";
    }
    public static int getThisYear(){//获得今年年份,静态方法
        return thisYear;        //访问静态成员变量
    }
    public static boolean isLeapYear(int year){ //判断指定年份是否闰年,静态方法
        return year%400==0||year%100!=0&&year%4==0;
    }
    public boolean equals(MyDate_2 d){ //比较当前日期值与d是否相等
        //this指代调用当前方法的对象
        return this==d||d!=null&&this.year==d.year&&this.month==d.month&&this.day==d.day;
    }
    public static int daysDfMonth(int year,int month){//返回指定年月的天数,静态方法
        switch(month){ //计算每月的天数
        case 1:case 3:case 5:case 7:case 8:case 10:case 12:return 31;
        case 4:case 6:case 9:case 11:return 30;
        case 2:return MyDate_2.isLeapYear(year)?29:28;
        default : return 0;
        }
    }
    public int daysOfMonth(){//返回当月天数
        return daysDfMonth(this.year, this.month);
    }
    public void tomorrow(){//当前日期改为之后一天日期
        this.day++;
        if(this.day>this.daysOfMonth()){
            this.day=1;
            this.month++;
            if(this.month>12){
                this.month=1;
                this.year ++;
            }
        }
    }
    public MyDate_2 yestoday(){ //返回当前日期的前一天日期
        MyDate_2 date = new MyDate_2(this);//进行拷贝构造方法,创建实例,没有改变this
        date.day--;
        if(date.day==0){
            date.month--;
            if(date.month==0){
                date.month=12;
                date.year--;
            }
            date.day = daysDfMonth(date.year, date.month);
        }
        return date;//返回对象date引用的实例
    }
}
package cn.hncu.Myclasslearn;
/**
 * 
 * @author hncu_chx
 *
 * Mylove amin
 */
public class MyDate_ex {
    public static void main(String[] args) {
        System.out.println("今年是"+MyDate_2.getThisYear()
                +",闰年?"+MyDate_2.isLeapYear(MyDate_2.getThisYear()));
        MyDate_2 d1 =new MyDate_2(2012, 12, 31);
        MyDate_2 d2 =new MyDate_2(d1);//调用拷贝构造方法复制实例
        System.out.println("d1:"+d1+",d2:"+d2+",d1==d2?"+(d1==d2)+",d1.equals(d2)?"+d1.equals(d2)); 
        System.out.print(d1+"的明天是");
        d1.tomorrow();
        System.out.println(d1+"\n"+d1+"的昨天是 "+(d2=d1.yestoday()));
    }
}
/**日期类的设计问题讨论
 * 虽然用3个整数表示一个日期符合人的思维习惯,但很多运算实现困难,如判断日期是否有效、
 * 求多少天之前/之后的日期等。
 * 本程序中的MyDate_2中的set()方法的算法不完整,其一,仍然会产生诸如“2013-2-30”之类的
 * 错误日期;其二,将“2013-12-32”之类的错误日期改为“2013-12-1”,虽然得到了一个正确
 * 日期,但这是一种不好的程序设计习惯,因为“2013-12-1”并不是调用者希望的数据,而且调用
 * 者并不知道数据被修改了。正确的处理方法应该是抛出异常,详见以后的博客。
 * 本题这样设计知识为了演示类的封装性。
 * */


运行图片:

image.png

目录
相关文章
|
9天前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
25 1
|
9天前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
22 0
java基础(13)String类
|
6天前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
9天前
|
Java
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
本文介绍了Java中抽象类和抽象方法的使用,以及ArrayList的基本操作,包括添加、获取、删除元素和判断列表是否为空。
13 2
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
|
3天前
|
Java API
Java的日期类都是怎么用的
【10月更文挑战第1天】本文介绍了 Java 中处理日期和时间的三个主要类:`java.util.Date`、`java.util.Calendar` 和 `java.time` 包下的新 API。`Date` 类用于表示精确到毫秒的瞬间,可通过时间戳创建或获取当前日期;`Calendar` 抽象类提供丰富的日期操作方法,如获取年月日及时区转换;`java.time` 包中的 `LocalDate`、`LocalTime`、`LocalDateTime` 和 `ZonedDateTime` 等类则提供了更为现代和灵活的日期时间处理方式,支持时区和复杂的时间计算。
26 14
|
8天前
|
安全 Java 数据安全/隐私保护
Java 封装怎么理解
封装是Java中的一种重要机制,它将对象的状态(数据)和行为(方法)打包在一起并控制外部访问权限,以保护数据不被随意修改。封装的主要目的包括数据保护、接口设计和增强模块性。通过使用`private`、`protected`及`public`等访问控制修饰符,结合getter和setter方法,可以有效隐藏对象内部实现细节。下面是一个简单的`BankAccount`类示例,展示了如何通过封装保护类的内部状态,确保数据安全和一致性,简化类的使用。理解封装有助于编写高质量代码和设计优秀程序架构。
|
8天前
|
Java 数据安全/隐私保护
Java 封装详解
在 Java 中,封装是面向对象编程的关键特性,通过将对象的状态(数据)和行为(方法)结合并利用访问控制保护数据,防止外部随意访问和修改。主要特点包括访问控制(如 `private` 和 `protected`)、数据隐藏及方法暴露(如 getter 和 setter)。封装的优点在于保护数据、隐藏实现细节、易于维护以及提高代码可读性。下面是一个简单的 `Person` 类封装示例,展示了如何通过 getter 和 setter 控制对类内部状态的访问,并进行合法性检查。总结而言,封装有助于构建清晰、易用且可维护的代码结构,是编写高质量 Java 程序的重要原则。
|
7天前
|
安全 Java 编译器
java访问类字段
java访问类字段
|
9天前
|
Java
java的class类
java的class类
18 5
|
6天前
|
安全 Java 开发者
Java修饰符与封装:理解访问权限、行为控制与数据隐藏的重要性
Java中的修饰符和封装概念是构建健壯、易维护和扩展的Java应用程序的基石。通过合理利用访问权限修饰符和非访问修饰符,开发者能够设计出更加安全、灵活且高效的代码结构。封装不仅是面向对象编程的核心原则之一,也是提高软件项目质量和可维护性的关键策略。
10 1
下一篇
无影云桌面