java-类和对象

1.面向对象

1.1 区分面向对象与面向过程

举个例子:

在传统的洗衣服过程中,需要经历防水,放衣服,放洗衣粉,搓洗,换水......多个步骤,每个过程都是不可或缺的,关注的是过程.

而现在的洗衣服过程,就需要我们把衣服,洗衣粉放入洗衣机,启动洗衣机即可,并不需要关注洗衣机是如何运行的(即不需要关注洗衣过程).整个过程主要是:人,洗衣粉,衣服,洗衣机四个对象之间交互完成的.

2.类的定义和使用

2.1 类的定义格式

①需要用到class关键字

②类名采用大驼峰定义

③成员前写法统一为public

④public修饰的类必须要与文件名相同

⑤main方法所在的类一般使用public修饰

public class PetDog {
    public String name;
    public String color;
    public int age;
    
    public void barks(){
        System.out.println(name+ ":汪汪汪");
    }
    
    public void wag(){
        System.out.println(name+ ":摇尾巴");
    }
}

其中,属性称为类的成员变量,功能称为类的成员方法.

3.类的实例化

3.1 概念

  • 之前我们使用int,double来定义类型,而定义了一个类,就相当于定义了一种新的类型,同int等类似,而这些类可以定义实例(对象).
  • 用类类型创建对象的过程,成为类的实例化.Java中采用new关键字,配合类名来实例化对象.
public class PetDog {
    public String name;
    public String color;
    public int age;

    public void barks(){
        System.out.println(name+ ":汪汪汪");
    }

    public void wag(){
        System.out.println(name+ ":摇尾巴");
    }


    public static void main(String[] args) {
        PetDog petDog = new PetDog();
        petDog.name = "xxx";
        petDog.color = "黄色";
        petDog.age = 10;
        petDog.barks();
        petDog.wag();
    }
}

注意:同一个类可以创建多个实例.

4.this引用

4.1 引入

先看此代码:

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(2020,4,7);
        d2.setDay(2021,6,8);
        d3.setDay(2022,1,2);

        d1.printDate();
        d2.printDate();
        d3.printDate();

    }
}

结果为:

思考:

①如果形参名和成名变量名相同呢?

此时并不会给成员变量赋值,而是形参赋给了形参.

②三个对象都在调用setDate和printDate函数,但是两个函数中并没有任何有关对象的说明,那么这两个函数如何知道设置和打印的是哪个对象的数据呢?

4.2 this引用的使用

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过改引用去访问.

注意:

①this只能在成员方法中使用

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

5.对象的构造及初始化

5.1 初始化对象

我们都知道,在方法内部定义个局部变量式,必须要初始化,否则编译失败:

如果是对象:

那么我们思考:

①每次对象创建好后调用方法设置具体日期,很麻烦,那么对象该如何初始化

②局部变量必须初始化才能使用,为什么字段声明之后没有给值就可以使用?

5.2 构造方法

①构造方法的作用是对对象中的成员进行初始化,并不负责为对象开辟空间.

②名字必须与类名相同,没有返回值类型,void也不行

③一般情况下用public修饰

④在创建对象时,由编译器自动调用,在整个对象的生命周期内只调用一次

⑤构造方法可以重载(名字相同,参数列表不同)

⑥当然,如果用户没有显示定义,编译器默认生成无参构造方法,一旦用户定义,编译器则不再生成

⑦在构造方法中,可以通过this调用其它构造方法简化代码,在无参构造方法中通过this调用带有三个参数的构造方法

⑧不能形成环

5.3 默认初始化

思考:为什么局部变量在使用时必须初始化,而成员变量不用呢?

这是因为对象空间被申请好之后,对象中包含的成员以及设置好了初始值.

5.4 就地初始化

在声明成员变量时,就直接给出初始值

这种方法没什么作用,之后还要进行赋值......

6. static成员

6.1 再谈学生类

  • 如果三个同学是同一个班的,那么他们上课肯定是在同一个教室,那能否给类中再加一个成员变量,来保存同学上课时的教室呢?不行!!!
  • 之前在Student类中定义的成员变量,每个对象中都会包含一份(称之为实例变量),因为需要使用这些信息来描述具体的学生。而现在要表示学生上课的教室,这个教室的属性并不需要每个学生对象中都存储一份,而是需要让所有的学生来共享。

6.2 static修饰成员变量

static修饰的成员变量,称为静态成员(类成员)变量.

【静态成员变量特性】

1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中

2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问

3. 类变量存储在方法区当中

4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)

public class Student{
    public String name;
    public String gender;
    public int  age;
    public double score;
    public static String classRoom = "Bit306";
    
    // ...
    
    public static void main(String[] args) {
        // 静态成员变量可以直接通过类名访问
        System.out.println(Student.classRoom);
 
        Student s1 = new Student("Li leilei", "男", 18, 3.8);
        Student s2 = new Student("Han MeiMei", "女", 19, 4.0);
        Student s3 = new Student("Jim", "男", 18, 2.6);
 
        // 也可以通过对象访问:但是classRoom是三个对象共享的
        System.out.println(s1.classRoom);
        System.out.println(s2.classRoom);
        System.out.println(s3.classRoom);
     }
}

6.3 static修饰成员方法

一般类中的数据成员都设置为private,而成员方法设置为public,那设置之后,Student类中classRoom属性如何在类外访问呢?

Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的

【静态方法特性】

1. 不属于某个具体的对象,是类方法

2. 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者

3. 不能在静态方法中访问任何非静态成员变量

4. 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用

补充:

①引用不可以指向引用

引用只能指向对象,下述代码的意思是:student2这个引用指向了student1这个引用所指向的对象

②一个引用不能指向多个对象——海王??

③Person p = null表示不指向任何对象 

student不指向任何对象,room不属于对象,是类的,所以不存在空指针异常

④ 静态方法中不能调用任何非静态方法,因为非静态方法依赖对象

public class Test2 {
    public static void main(String[] args) {
        Student.funcStatic();
    }
}

class Student{
    public String name;
    public int age;
    //普通成员变量

   //类方法 不依赖对象
    public static void funcStatic(){
        System.out.println("funcStatic()......");
    }
}

 

 

 在静态方法中调用时候无法传递this引用

6.4 static成员变量初始化

1.就地初始化

2.静态代码块初始化

......

  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值