文章目录
- 面向对象和面向过程
- 类的注意事项
- 类的实例化
- this 引用
- 构造方法
- 封装
- 包
- 面向对象和面向过程
2.类的注意事项
类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等)
类的定义格式:
class ClassName{
field; //字段(属性)或者成员变量
method; //行为或者成员方法
}
class为定义类的关键字,ClassName为类的名字,{}中为类的主体
3.类的实例化
- this 引用
来看个问题:
形参名不小心与成员变量名相同:
public class Test {
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 printDay(){
System.out.println(year+"-"+month+"-"+day);
}
public static void main(String[] args) {
Test test = new Test();
test.setDay(2022,7,25);
test.printDay();
}
}
public class Test {
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 printDay(){
System.out.println(year+"-"+month+"-"+day);
}
public static void main(String[] args) {
Test test = new Test();
test.setDay(2022,7,25);
test.printDay();
}
}
- 构造方法
注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间
特性:
public class Test {
public int year;
public int month;
public int day;
//无参构造方法
public Test(){
this.year=1900;
this.month=1;
this.day=1;
}
//带有三个参数的构造方法
public Test(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
}
- 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的
public class Test {
public int year;
public int month;
public int day;
//带有三个参数的构造方法
public Test(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public void printDate(){
System.out.println(year+"-"+month+"-"+day);
}
public static void main(String[] args) {
//报错
Test t = new Test();
t.printDate();
}
}
6. 构造方法中,可以通过this调用其他构造方法来简化代码
this();访问构造方法
public class Test {
public int year;
public int month;
public int day;
public Test() {
//调用本类中的其他构造方法
this(2022,8,4);
System.out.println("不带参数的构造方法");
}
//带有三个参数的构造方法
public Test(int year, int month, int day) {
System.out.println("带参数的构造的方法");
this.year = year;
this.month = month;
this.day = day;
}
public static void main(String[] args) {
Test t = new Test();
}
}
public Date(){
this(1900,1,1);
}
public Date(intyear,intmonth,intday){
this();
}
/*无参构造器调用三个参数的构造器,而三个参数构造器有调用无参的构造器
形成构造器的递归调用编译报错:Error:(19,12)java: 递归构造器调用*/
- 绝大多数情况下使用public来修饰,特殊场景下会被private修饰
6.封装
封装的概念:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互
Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用
Java中提供了四种访问限定符:
No
范围 private default protected public
1 同一包中的同一类 ✔ ✔ ✔ ✔
2 同一包中的不同类 ✔ ✔ ✔
3 不同包中的子类 ✔ ✔
4 不同包中的非子类 ✔
public class Person {
private String name;
public int age;
public void setName(String name){
this.name = name;
}
public static void main(String[] args) {
Person person = new Person();
person.setName("hahaha");
}
}
注意:一般情况下成员变量设置为private,成员方法设置为public
- 包
为了更好的管理类,把多个类收集在一起成为一组,称为软件包。有点类似于目录。比如:为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件下,也可以对某个文件夹下的音乐进行更详细的分类。
包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可
自定义包:
- 在 IDEA 中先新建一个包: 右键 src -> 新建 -> 包
- 在弹出的对话框中输入包名
- 在包中创建类, 右键包名 -> 新建 -> 类, 然后输入类名即可
- 此时可以看到我们的磁盘上的目录结构已经被 IDEA 自动创建出来
- 同时我们也看到了, 在新创建的Test.java文件的最上方, 就出现了一个 package 语句