java:类与对象1.0

一.面向对象的初步认知:

1.1什么是面向对象

java是一门纯面向对象的语言(Object Oriented Program简称OOP),在面对对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。对于大型程序的维护、设计和扩展都非常友好。

1.2面向对象和面向过程

举个例子,如果让你把大象放进冰箱里需要几步。

你会想:大象怎么装进冰箱呢?根本不可能装进冰箱。

这就属于面向过程的思想。

而面向对象的思想是:我只需要明确把大象放进冰箱,具体怎么做我不需要关心。

所以三步:1 把冰箱门打开 2 把大象放进去 3 把冰箱门关起来

注意:面向对象和面对过程不是一门语言,没有好坏之分,各有各的优点。都有其专门的应用场景

二.类的定义和使用

面向程序设计关注的是对象,而对象对应现实生活的实体,比如:空调。但是空调计算机并不认识,需要开发人员告诉计算机什么是空调。

这左边张图就是将空调这个现实的东西抽象出来,但是计算机还是不能识别,这时候我们就需要用到java语言了。

2.1简单认识类:

类是对一个对象的描述,主要描述该对象具有的属性(比如:外观、尺寸),有哪一些功能,描述完计算机就可以识别了。

举个例子:上面提到的空调,它的在java中可以看做是一个类别。

属性:产品品牌、产品重量、产品颜色、产品尺寸。

功能:制冷、除湿.....

 2.2类的定义格式

那么在java中如何用语言来定义一个类呢?

//定义一个学生
class Student{
     public String name;//  field  字段(属性、成员变量)
     public int age;        
     public dowork();   //  method 成员方法
}

class为类的关键字,class为类的名字,{}中是类的主体。

利用java语言在计算机中定义完成,在javac中编译成.class文件,
在jvm文件的基础上计算机就可以识别。
注意事项:
1.类名注意采用大驼峰定义
2.此处写的方法不带static关键字
3.一般一个文件当中只一个类
4.public修饰的类必须跟文件名相同
5.main方法所在的类一般要使用public类修饰(注意:Eclipse默认会在public修饰的类找main方法)

2.3我们来试着定义一个狗类

class Dog{
public Stringname;//名字  
public Stringcolor;//颜色
//狗的属性
public void barks(){
     System.out.println(name+": 旺旺旺~~~"); 
}
  
//狗的行为
public void wag(){
    System.out.println(name+": 摇尾巴~~~"); 
}

三.类的实例化

 3.1拿上面最开始的学生举例

public class Classmates{
      public static void main(){
         Student student = new Student()//通过new实例化对象
         student.name="zhangsan";
         student.age=18;
     }
}

注意事项:

1.new关键字用于创建一个对象的实例

2.使用.来访问对象中的属性和方法

3.同一个类可以创建多个实例

3.2类和对象的说明

1.类只是模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员

2.类是一种自定义类型,可以用来定义变量

3.类可以实例化多个对象,实例化的对象占用实际的物理空间,存储成员变量。

 4.举个例子,类实例化出的对象就像是现实中建筑,类就像是设计图,只是负责设计,没有实例化

就是一张纸而已,实例化出的对象才能存储数据,存储物理空间。

四.this引用

4.1为什么要有this引用

看下面代码

//先来看一个日期的例子
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){
    //构造三个日期类型的对象d1 d2 d3     
    Dated1=new Date();
    Dated2=new Date();
    Dated3=new Date();

    //对d1,d2,d3的日期设置    
    d1.setDay(2020,9,15);
    d2.setDay(2020,9,16);
    d3.setDay(2020,9,17);
   
   //打印日期中的内容    
    d1.printDate();
    d2.printDate();
    d3.printDate();
   }
}

上面的代码定义了一个日期类,在main方法里实例化并调用,完成对象的设置的和打印。

整体逻辑清晰,流畅。

但是如果方法里的setDay发生了下面这种情况会如何呢?

  public void setDay(int year,int month,int day){
     year=year;
     month=month;
     day=day;
 }

那这里的d1输出的三个值到底为啥?(以d1的实例化)

成员变量给成员变量?参数给参数? 反正就猜呗,这里长得都一样。
这里答案输出的三个值都为0(编译器int类型的默认值)
因为此处遵循的是局部变量优先原则,所以是参数给参数,没有改变到成员变量,所以三个成员变
量均为编译器的默认值。
那么如何在这种情况下对成员变量进行赋值呢?

4.2什么是this引用?

this指向成员方法运行时当前调用成员方法的对象,在所有成员方法的成员对象中都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

  public void setDay(int year,int month,int day){
    this.year=year;
    this.month=month;
    this.day=day;
 }

注意:this引用的是调用成员方法的对象

4.3 this引用的特性:

1.this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型

2.this只能在成员方法中使用

3.在成员方法中,this只能引用当前对象,不能再引用其它对象。

4. this 成员方法 第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将
调用成员方法

5.对象的构建及初始化

5.1默认初始化

通过前面的学习我们知道java的局部变量必须初始化,否则编译器就会报错。

public static void main(String[]args){
       int a;
       System.out.println(a);
}
//Error:(26,28)java: 可能尚未初始化变量a


但是在类中,成员变量没初始化却也没报错是什么情况呢?

要搞清楚这个问题要从实例化对象的new下手

Date d=new Date(2021,6,9);

在程序的层面就只是一条普通的语句而已,在jvm层面就要做很多事情,其中举一些例子:

1. 检测对象对应的类是否加载了,如果没有加载则加载
2. 为对象分配内存空间
3. 处理并发安全问题
比如:多个线程同时申请对象, JVM 要保证给对象分配的空间不冲突
4.初始化所分配的空间
即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:
数据类型默认值
byte0
int0
char'\u0000'
short 0
long0L
booleanfalse
float0.0f
double0.0
refencenull
5. 设置对象头信息
6.调用构造方法,给对象中的各个成员赋值。

5.2就地初始化

在声明成员变量时,就直接给出了初始值。
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();
 }
注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中

5.3构造函数

1.构造方法是一种特殊的成员方法,名字必须与类名相同,没有返回值在创建时由编译器自动调用,并且在整个对象的生命周期只调用一次

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. 构造方法可以重载 ( 用户根据自己的需求提供不同参数的构造方法 )
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值