类定义和使用

简单认识类

类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥),描述完成后计算机就可以识别了

类的定义格式

// 创建类
class ClassName{
//属性 成员属性,对象属性
//方法 成员方法,对象方法
}

public class Student{//定义一个学生类
public String name;//姓名
public String gender;//性别
public short age;//年龄
public double score;//学分
public void DoClass(){}//上课
public void DoHomework(){}//做作业
public void Exam(){}//考试
}

一个源文件只能存在一个主类(朱磊必须和源文件名称相同)
public class
class 声明的普通类可以存在多个
注意事项
类名注意采用大驼峰定义
成员前写法统一为public,后面会详细解释
此处写的方法不带 static 关键字. 后面会详细解释

类的实例化

定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自带的内置类型,而类是用户自定义了一个新的类型,比如上述的:PetDog类和Student类。它们都是类(一种新定义的类型)有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)。
简单来说类的实例化—>通过类产生对象,就称为列的实例化---->—>
在Java使用关键字class定义的类,相当于在计算机中产生了一个新的类型
class Student=>Student 就和String,是一个新的类型
用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。
通过产生的新类型产生具体对象,称之为类的实例化。使用 new关键字产生对象!
语法格式
类名称 引用名称=new 类名称();
例如

Student student=new Student();

产生了Student类的实例化对象,通过该对象使用 “ . ” 操作符就可以访问成员属性成员方法
注意事项
new 关键字用于创建一个对象的实例使用 “ . ” 来访问对象中的属性方法.同一个类可以创建对个实例.
类和对象的说明

  1. 类只是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员.
  2. 类是一种自定义的类型,可以用来定义变量.
  3. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
  4. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间
    类只是一个模板,没有什么具体意义,该类的所有对象都具备成员属性成员方法(行为)都定义在类中不同对象的属性值和具体表现出来的行为都是不同的!!!
    例如
    博主和黄晓明都是人的对象,人类这个类中定义了所有人这个对象
    共同具备的属性行为,我们都有五官和睡觉吃饭
    那我们的区别在哪?
    最本质的区别就是,具体的属性值不同!由于属性值不同表现得行为也不同。
    注意成员属性和成员方法必须通过具体对象来调用

构造方法

构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次
构造方法要严格使用其语法

viod Dog(){
//这是一个命名不规范的方法,不是构造方法
}
Dog(){
//这是一个构造方法
}

```css
DogString n,String c){
name=n;
color-=c;
//这是一个有参构造方法
}
public class Date {
public int year;
public int month;
public int day;
// 构造方法:
// 名字与类名相同,没有返回值类型,设置为void也不行
// 一般情况下使用public修饰
// 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
public Date(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
System.out.println("Date(int,int,int)方法被调用了");
}
public void printDate(){
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
// 此处创建了一个Date类型的对象,并没有显式调用构造方法
Date d = new Date(2021,6,9); // 输出Date(int,int,int)方法被调用了
d.printDate(); // 2021-6-9
}
}

**注意:**构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
构造方法的特性

  1. 名字必须与类名相同
  2. 没有返回值类型,设置为void也不行
  3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
  4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
public class Date {
public int year;
public int month;
public int day;
// 无参构造方法
public Date(){
this.year = 1900;
this.month = 1;
this.day = 1;
// 带有三个参数的构造方法
public Date(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) {
Date d = new Date();
d.printDate();
}
}
}
上述两个构造方法:名字相同,参数列表不同,因此构成了方法重载。

关键点
如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的

public class Date {
public int year;
public int month;
public int day;
public void printDate(){
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
Date d = new Date();
d.printDate();
}
}
上述Date类中,没有定义任何构造方法,编译器会默认生成一个不带参数的构造方法。

注意:一旦用户定义,编译器则不再生成。

public class Date {
public int year;
public int month;
public int day;
public Date(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) {
// 如果编译器会生成,则生成的构造方法一定是无参的
// 则此处创建对象是可以通过编译的
// 但实际情况是:编译期报错
Date d = new Date();
d.printDate();
}
}
/*
Error:(26, 18) java: 无法将类 extend01.Date中的构造器 Date应用到给定类型;
需要: int,int,int
找到: 没有参数
原因: 实际参数列表和形式参数列表长度不同
*/

构造方法中,可以通过this调用其他构造方法来简化代码

public class Date {
public int year;
public int month;
public int day;
// 无参构造方法--内部给各个成员赋值初始值,该部分功能与三个参数的构造方法重复
// 此处可以在无参构造方法中通过this调用带有三个参数的构造方法
// 但是this(1900,1,1);必须是构造方法中第一条语句
public Date(){
//System.out.println(year); 注释取消掉,编译会失败
this(1900, 1, 1);
//this.year = 1900;
//this.month = 1;
//this.day = 1;
}
// 带有三个参数的构造方法
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
}

注意: this(…) 必须是构造方法中第一条语句后面学的 **super()**也必须放在第一句
而且构造方法不能形成环

public Date(){
this(1900,1,1);
}
public Date(int year, int month, int day) {
this();
}
/*
无参构造器调用三个参数的构造器,而三个参数构造器有调用无参的构造器,形成构造器的递归调用
编译报错:Error:(19, 12) java: 递归构造器调用
*/

构造方法的修饰符绝大多数情况下使用public来修饰,特殊场景下会被private修饰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值