【JAVA】类和对象(一)
文章目录
- 前言
- 一、类的定义和使用
- 1.1 类的定义格式
- 1.2 练习
- 二、类的实例化
- 2.1 类的实例化的概念
- 2.2 如何访问类中的成员
- 三、this关键字
- 3.1 为什么要有this引用
- 3.2 什么是this关键字
- 3.3 this引用的特性
- 四、对象的构造和初始化
- 4.1 默认初始化
- 4.2 就地初始化
- 4.3 构造方法初始化
- 4.3.1 构造方法概念
- 4.3.2 构造方法注意事项
- 五、对象的打印
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
在 Java 的世界里,类和对象是构建一切程序的基石。如果说编程语言是一座城市,那么类是钢筋骨架的设计蓝图,而对象则是拔地而起的摩天大楼。面向对象编程(OOP)的核心思想在此交汇:封装数据的行为、继承特性的传承、多态形态的灵活——这一切都始于对类和对象的深刻理解。无论你是初涉编程的新手,还是经验丰富的开发者,掌握类与对象的精髓,都将彻底改变你设计代码的方式。让我们一起揭开它们的神秘面纱,探索如何用简洁的代码描述纷繁复杂的现实逻辑。
提示:以下是本篇文章正文内容,下面案例可供参考
一、类的定义和使用
1.1 类的定义格式
public class Person {String name;int age;public void eat(){System.out.println("吃饭");}
}
类中主要包括类的成员变量和成员方法,用来描述类的属性和行为。
洗衣机类的使用示例:
public class WashMachine {public String brand;public String type;public double weight;public double length;public double width;public double height;public String color;public void washClothes(){System.out.println("洗衣功能");}public void dryClothes(){System.out.println("脱水功能");}public void setTime(){System.out.println("定时功能");}
}
注意事项:
类名一般采用大驼峰命名
1.2 练习
定义一个dog类:
public class Dog {public String name;public String color;public void barks(){System.out.println(name+":汪汪汪----");}public void wag(){System.out.println(name+": 摇尾巴---");}
}
定义一个student类:
public class Student {public String name;public String gender;public short age;public double score;public void doClass(){System.out.println("做作业");}}
注意事项:
- ⼀般⼀个文件当中只定义⼀个类
- public修饰的类必须要和文件名相同
- 不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改
二、类的实例化
2.1 类的实例化的概念
⽤类类型创建对象的过程,称为类的实例化。简单来说就是,类是模板,用类创建的实例化的对象,才是真正开辟了一块内存空间。
public class practice {public static void main(String[] args) {Dog dog=new Dog();dog.barks();}
}
2.2 如何访问类中的成员
public class practice {public static void main(String[] args) {Dog dog=new Dog();dog.name="hzp";dog.color="白色";dog.barks();dog.wag();Student stu=new Student();stu.name="hzp";stu.gender="男";stu.age=18;stu.doClass();}
}
注意事项:
1、new关键字用于创建⼀个对象的实例.
2、使用. 来访问对象中的属性和方法.
3、同⼀个类可以创建多个实例.
三、this关键字
3.1 为什么要有this引用
如下代码定义了⼀个Date类,Date类中包含3个属性分别是year,month,day。分别使用setDay和printDate对进⾏设置和打印⽇期。
public class Date {public int year;public int month;public int day;public void setDay(int y,int m,int d){year=y;month=m;day=d;}public void printDate(){System.out.println(year+"/"+month+"/"+day);}
}
public static void main(String[] args) {Date d1=new Date();Date d2=new Date();Date d3=new Date();d1.setDay(2022,3,2);d2.setDay(2023,1,2);d3.setDay(2024,5,2);d1.printDate();d2.printDate();d3.printDate();}
如何形参名不小心与成员变量名相同,会发生什么?
修改如下代码即可:
public class Date {public int year;public int month;public int day;public void setDay(int year,int month,int day){year=year;month=month;day=day;}public void printDate(){System.out.println(year+"/"+month+"/"+day);}
}
从结果可以看出,左右两边的year、month和day都是用的形参的值,也就是说,编译器判断不了是不是成员变量了,这里自己给自己赋值,所以结果是全0,即成员变量的默认值。这就是为什么要使用this关键字。
3.2 什么是this关键字
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
public class Date {public int year;public int month;public int day;public void setDay(int year,int month,int day){this.year=year;this.month=month;this.day=day;}public void printDate(){System.out.println(this.year+"/"+this.month+"/"+this.day);}
}
此时通过指定this,就能正确解决上述的2个问题了。这⾥之所以可以起作⽤,关键点在于this代表的是当前对象的引⽤,当前对象就是指:哪个对象调⽤setDay⽅法,谁就是this引⽤!
3.3 this引用的特性
1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型˛
2. this只能在"成员方法"中使用
3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
4. this是“成员方法”第⼀个隐藏的参数,编译器会自动传递,在成员方法执⾏时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收
四、对象的构造和初始化
4.1 默认初始化
public class Date {public int year;public int month;public int day;public void setDay(int year,int month,int day){this.year=year;this.month=month;this.day=day;}public void printDate(){System.out.println(this.year+"/"+this.month+"/"+this.day);}
}
public static void main(String[] args) {Date date=new Date();date.printDate();}
对于成员变量来说,如果没有进⾏初始化,会有⼀个对应的默认值,默认值遵循如下规则:
4.2 就地初始化
在声明成员变量时,就直接给出了初始值
public class Date {public int year=2025;public int month=7;public int day=4;public void setDay(int year,int month,int day){this.year=year;this.month=month;this.day=day;}public void printDate(){System.out.println(this.year+"/"+this.month+"/"+this.day);}
}
4.3 构造方法初始化
4.3.1 构造方法概念
构造⽅法(也称为构造器)是⼀个特殊的成员⽅法,名字必须与类名相同,在创建对象时,由编译器⾃动调⽤,并且在整个对象的⽣命周期内只调⽤⼀次。
public class Date {public int year=2025;public int month=7;public int day=4;public Date(int year,int month,int day){this.year=year;this.month=month;this.day=day;}public void setDay(int year,int month,int day){this.year=year;this.month=month;this.day=day;}public void printDate(){System.out.println(this.year+"/"+this.month+"/"+this.day);}
}
4.3.2 构造方法注意事项
1. 名字必须与类名相同
2. 没有返回值类型,设置为void也不⾏
3. 创建对象时由编译器⾃动调⽤,并且在对象的⽣命周期内只调⽤⼀次(相当于⼈的出⽣,每个⼈只能出⽣⼀次)
4. 构造⽅法可以重载(⽤⼾根据⾃⼰的需求提供不同参数的构造⽅法)
public class Date {public int year=2025;public int month=7;public int day=4;public Date(){}public Date(int year,int month,int day){this.year=year;this.month=month;this.day=day;}public void setDay(int year,int month,int day){this.year=year;this.month=month;this.day=day;}public void printDate(){System.out.println(this.year+"/"+this.month+"/"+this.day);}
}
上述两个构造⽅法:名字相同,参数列表不同,因此构成了⽅法重载。
5. 如果用户没有显式定义,编译器会⽣成⼀份默认的构造方法,⽣成的默认构造方法⼀定是⽆参的。
6. ⼀旦用户定义了其他的构造⽅法,编译器则不再⽣成。
7. 构造⽅法中,可以通过this调⽤其他构造⽅法来简化代码
public class Date {public int year=2025;public int month=7;public int day=4;public Date(){this(2022,3,1);}public Date(int year,int month,int day){this.year=year;this.month=month;this.day=day;}public void setDay(int year,int month,int day){this.year=year;this.month=month;this.day=day;}public void printDate(){System.out.println(this.year+"/"+this.month+"/"+this.day);}
}
• this(…)必须是构造⽅法中第⼀条语句
• 不能形成环的调⽤
** 8. 绝⼤多数情况下使用public来修饰,特殊场景下会被private修饰(后序讲单例模式时会遇到)**
五、对象的打印
如果我们直接打印对象的引用,此时输出的结果为:类路径名@对象的hashcode值
public class Person {String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}public void eat(){System.out.println("吃饭");}
}
public static void main(String[] args) {Person person=new Person("hzp",88);person.eat();System.out.println(person);}
如果想要默认打印对象中的属性该如何处理呢?答案:重写toString⽅法即可。
public class Person {String name;int age;@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}public Person(String name, int age) {this.name = name;this.age = age;}public void eat(){System.out.println("吃饭");}
}
总结
类和对象犹如 Java 灵魂的双生子:类是模板,定义结构与规则;对象是实体,承载状态与行为。从封装数据的字段到驱动逻辑的方法,从静态成员的全局共享到构造函数的巧妙初始化,每一次 new 关键字的调用,都是向 JVM 请求一方新的内存天地。理解对象在堆中的诞生、引用在栈中的流转、方法在元空间中的驻留,便是掌握了 Java 世界的创世法则。记住:优秀的程序从来不止于功能实现,更在于如何用面向对象的艺术,将现实抽象为优雅的代码宇宙。继续深入吧,让每个类成为你思想的代言,每个对象成为你逻辑的化身!