带你玩转java类和对象

今天带大家学习java中的类和对象,这是C语言中所没有的,同时对我们学习后面的继承与多态打下一定的基础。所以打起精神我们开始!!!

面向对象

我们经常听到java是一门面向对象的语言,那么到底什么叫面向对象呢,向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人 们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。

举个例子:

 传统洗衣服:

对于传统的洗衣服过程来说,少了这些步骤中的哪一步,都可能影响洗衣服这个行为,我们可以把它理解为面向过程。 

现代人洗衣服:

现代人洗衣服:一共需要人,衣服,洗衣机,洗衣粉这四个对象协同交互完成洗衣服这个过程,并且人并不需要关心洗衣机到底是怎么洗衣服的以及如何甩干的,每个对象都是封装好的,我们可以将这个过程理解为面向对象。 

类的概念和使用

我们上面刚说了,java是一种面向对象的语言, 那对象到底什么呢?其实世界万物都是对象,即每个人都是一个独立的个体,或者电视,洗衣机。以洗衣机为例,它里面有很多参数数据,但是计算机并不认识它啊,所以我们需要定义类来说明对象到底是干嘛的。

// 创建类
class ClassName{
field; // 字段(属性) 或者 成员变量
method; // 行为 或者 成员方法
}

 class定义类的关键字,ClassName为类的名字,{}中为类的主体。

成员变量主要来描述类,而成员方法,用来表示类有什么功能。

定义一个狗类:

Dog dog{
String name;
String color;
public void barks(){
 System.out.println("汪汪汪");
    }
public void wag(){
System.out.println(name" +摇尾巴!");
   }
}

 定义一个学生类:

public class Student{
public String name;
public String gender;
public short age;
public double score;
public void DoClass(){}
public void DoHomework(){}
public void Exam(){}
}
1. 一般一个文件当中只定义一个类
2. main 方法所在的类一般要使用 public 修饰 ( 注意: Eclipse 默认会在 public 修饰的类中找 main 方法 )
3. public 修饰的类必须要和文件名相同
4. 不要轻易去修改 public 修饰的类的名称,如果要修改,通过开发工具修改 ( 给同学演示 )

类的实例化

定义了类,我们就可以根据类来创建对象,这里我们称为实例化对象。

用类类型创建对象的过程,称为类的实例化,java中采用new关键字,配合类名来实例化对象。 

public class Main{
public static void main(String[] args) {
PetDog dogh = new PetDog(); //通过new实例化对象
dogh.name = "阿黄";
dogh.color = "黑黄";
dogh.barks();
dogh.wag();
PetDog dogs = new PetDog();
dogs.name = "阿黄";
dogs.color = "黑黄";
dogs.barks();
dogs.wag();
}
}
输出结果:
阿黄: 旺旺旺~~~
阿黄: 摇尾巴~~~
赛虎: 旺旺旺~~~
赛虎: 摇尾巴~~~
  • new 关键字用于创建一个对象的实例.
  • 使用 . 来访问对象中的属性和方法.
  • 同一个类可以创建对个实例.

 其实类就像是一个模具,用它可以实例化多个对象,他们都拥有类中的成员变量和成员函数。

this引用

在讲this引用之前请大家思考一下这个代码存在什么问题吗?

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);
}
}
     

 这里我们创建了一个类,他的成员属性和成员方法中的局部变量即参数重名,那么这里的setday里的赋值语句到底是谁给谁赋值呢,可能会产生歧义,经过调试之后我们可以知道其实是局部变量自己给自己赋值结果仍为零,如果我们想把参数的值赋值给成员变量怎么办呢,这里就需要使用this关键字,用来引用当前对象的引用。虽然这样解决了问题,但我们不建议参数与变量名一致,代码的可读性大大降低。

public void setDay(int year, int month, int day){
this.year = year;//给当前对象赋值
this.month = month;//给当前对象赋值
this.day = day;//给当前对象赋值
}

说几个this引用的特性这里也希望大家牢记:

1. this 的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this 只能在 " 成员方法 " 中使用
3. " 成员方法 " 中, this 只能引用当前对象,不能再引用其他对象
4. this 成员方法 第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this 负责来接收。
public void setDay(Date this,int year, int month, int day)//this是编译器默认的一般不显示(Date是创建的对象)

对象的构造方法和初始化

之前在我们创建一个变量时如果步初始化,编译就会报错,但是我们发现在我们定义类时并么有给成员变量赋值,但是当对象调用时却不会报错这是为什么呢?

public static void main(String[] args) {
Duck d = new Duck();
d.bark();
d.sleep(time,place);
d.printname();
}
//这是一段伪代码

这就涉及到构造方法,它的用途就是初始化成员变量,它是一种特殊的方法,首先他么有返回值,其次他的方法名必须与类名一致,它只在对象的生命周期里出现一次,在创建对象时,由编译器自动调用。

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
}
}

 构造方法只是初始化对象的成员,并不会给对象开辟空间。

构造方法重载

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;
// 无参构造方法--内部给各个成员赋值初始值,该部分功能与三个参数的构造方法重复
// 此处可以在无参构造方法中通过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引用来调用其他构造方法如上此时无参里调用的还是三个参数的构造方法,注意此时this‘必须是第一行。

 现在来解释一下为什么成员不用直接初始化,这就要提到new这个关键字了,

Date d = new Date(2021,6,9);//此时实例化了对象,同时编译器也调用了默认的构造函数
//完成了对于对象成员的初始化。

 编译器默认的构造函数是一个无参的构造函数,并且没有返回值,不同类型的变量都以不同的形式初始化为零。

public class Date {
public int year = 1900;
public int month = 1;
public int day = 1;
public Date(){
}//无参的构造方法
public Date(int year, int month, int day) {
}//三个参数的构造方法
public static void main(String[] args) {
Date d1 = new Date(2021,6,9);
Date d2 = new Date();
}
}

 代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中。今天就分享到这里,感谢观看。

  • 45
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 27
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值