java语法——OOP之类和对象

一:类的定义

类(Class)是用来对一项实体进行描述的,类的构成包括成员属性(用来描述实体有哪些特征)和成员方法(用来描述实体能干什么),它本质是一种用户定义的引用数据类型(不是数据)。类是面向对象程序设计(OOP,Object-Oriented Programming)的基础,类具有封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)的特性,可以实现增强代码的稳定性和安全性,使代码的层次结构分明、便于被理解和管理,提升代码的灵活性并降低代码耦合度等目的。


二:类的作用

1.对象创建:

类是创建对象的模板。当你定义一个类时,你可以基于该类创建任意数量的对象,每个对象都会有自己的状态(属性的值),但共享相同的行为(方法)。

2.数据封装:(即封装特性,后面讲)

类提供了封装数据和行为的能力。它允许你将变量(属性)和方法(行为)组合在一起,形成一个独立的单元,从而隐藏了实现细节并提供了对外部的接口。

3.代码复用:(即继承特性,后面讲)

通过继承机制,类可以从其他类继承属性和方法,这允许你创建层次结构,减少代码重复并提高代码的可维护性。

4.多态性:(即多态特性,后面讲)

类支持多态性,这意味着一个接口可以由多个类实现,或者一个父类可以被多个子类继承。这增加了代码的灵活性和可扩展性。

5.接口定义:(后面和抽象类一起讲)

类可以定义接口,即一组方法签名,而不需要具体实现。其他类可以实现这些接口,以保证提供一组特定的行为。

6.模块化和代码组织:

类帮助你将代码组织成模块,这使得大型项目更容易管理。每个类可以专注于一个特定的功能,而整个系统则是这些类协同工作的结果。

7.抽象和具体实现分离:(后面和抽象类一起讲)

类允许你定义抽象类和接口,这些可以被具体实现的子类继承和实现。这有助于将设计和实现细节分开,便于修改和扩展。

8.安全性和权限控制:

类提供了访问修饰符,如public、protected、private和默认(default,也可以不写),这让你能够控制哪些成员可以被外部代码访问,增强了代码的安全性。


三:类的创建与初始化,以及这个过程的细节

创建类需要使用关键字class,其一般形式是:

class  类名{

      成员变量1;

      成员变量2;

      ......

      成员方法1;

      成员方法2;

      ......

}

举个例子,我们创建一个练习生类:

class  Contestant{

  public String name;

  public int age;

   

public void talent1(){   //才能一

System.out.println(name+"演唱了只因你太美。");

}

public void talent2(){     //才能二

System.out.println(name+"表演了铁山靠。");

}


四:类的实例化(对象的创建)

1.类的实例化的概念:

用类这一自定义类型创建对象的过程,称为类的实例化。Java中使用new这一关键字,配合类名来创建对象。

2.实例化格式:

下面我们创建一个练习生对象

Contestant contestant = new Contestant();  //contestant就是我们创建的对象

创建对象的时候发生了什么?

①检测对象对应的类是否加载了,如果没有加载则加载

②为对象分配内存空间

③处理并发安全问题

比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突

④初始化所分配的空间

 即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值。

6ec43d3566424014b53e7e9e0e592ae9.png

⑤设置对象头信息

⑥调用构造方法,给对象中各个成员赋值


五:对象的初始化:

1.构造方法

(1.)概念

构造方法是一种特殊的成员方法,用于初始化新创建的对象。每个类至少有一个构造方法,如果没有显式定义,Java编译器会自动为类提供一个默认的无参构造方法。

(2.)语法(拿Contestant类举例)

public Contestant(String string, int x) {

      this.name = string;

      this.age = x;

}

(3.)特点

名字必须与类名相同

没有返回值类型,设置为void也不行

③创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次。

④构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)

没有参数的构造方法Contestant

public Contestant(){

this.name="zhangsan";

this.age=20;

}

没有参数的构造方法对应的实例化方法:

Contestant contestant = new Contestant();

 

有两个参数的构造方法Contestant

public Contestant(String string, int x) {

      this.name = string;

      this.age = x;

    }

两个参数的构造方法对应的实例化方法:

Contestant contestant = new Contestant("kunkun", 21);

 

⑤如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。 一旦用户定义,编译器则不再生成。

 可以结合前面的JVM给成员属性赋初值过程理解。

//Contestant类默认的构造方法

public Contestant() {

      this.name = null;

      this.age = 0;

    }

de9d597837144d36b6086d43c5069795.png

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

 (注意事项:this(...)必须是构造方法中第一条语句且

     不能来回引用。不能我引用你的方法,你引用我的方法,因为我们其实都没有实际的赋值过程)

⑦绝大多数情况下使用public来修饰,特殊场景下会被private修饰(后序讲单例模式时会遇到)


public class Library {//忽略这个不相关的类名

 

  static class Contestant {

    public String name;

    public int age;

 

    // 构造方法(一种特殊的成员方法,负责给对象中的成员进行初始化)

    public Contestant(String string, int x) {

      this.name = string;

      this.age = x;

    }

 

    public void talent1() { // 才能一

      System.out.println(name + "演唱了只因你太美。");

    }

 

    public void talent2() { // 才能二

      System.out.println(name + "表演了铁山靠。");

    }

  }

 

  public static void print() {

    Contestant contestant = new Contestant("kunkun", 21); // 因为构造方法,这里必须初始化,否则编译失败

    // Contestant contestant = new Contestant();

    /* contestant.name = "kunkun";

        contestant.age = 21;*/

    System.out.println("有请下一位练习生 " + contestant.age + "岁的" + contestant.name + "!");

    contestant.talent1();

    contestant.talent2();

  }

 

  public static void main(String[] args) {

    print();

  }

}

 

d73a557756254ac7a63f5389051a955d.jpg

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值