Java中类和对象

一.类和对象的概念

1.什么是类和对象?

类是现实世界当中具有共同特征的事物进行抽象形成的模板或概念。而对象是实际存在的
个体。
例如:“汽车”就是一个类(所有的汽车都有方向盘、发动机、都能形式,这是它们的
共同特征),“你家的那个汽车”就是一个真实存在的对象。或者说“明星”是一个类,“刘
德华”就是一个对象。“沈腾”、“赵本山”、“宋丹丹”都是实际存在的对象,他们都属于
“笑星”类,类描述事物的共同特征,那么“笑星”类都有哪些共同特征呢?笑星类都有姓名、
性别、年龄等状态信息(属性),他们还有一个共同的行为就是“演出”(方法)。

2.为什么要有类和对象?

因为人习惯以对象的方式认识现实世界,例如我说:老虎。那你大脑中马上呈现出一个老虎的样子,对吧。
软件存在的意义就是为了解决现实世界当中的问题,它必然模拟现实世界,也就是说现实
世界中有什么,软件中就对应有什么。

3.类和对象的区别

类可以创建对象,对象又被称为实例(instance),这个过程也可以称为实例化。类是对对象的抽象
在这里插入图片描述
类 = 属性 + 方法,而属性描述的是状态,方法描述的是行为动作。

面向对象具有三大特征
① 封装(Encapsulation)
② 继承(Inheritance)
③ 多态(Polymorphism)

二.类和对象的使用

1.类的定义

[修饰符] class 类名 {
类体 = 属性 + 方法
}

1.1类的修饰符
①.访问修饰符:
public :每个 Java 程序的有且只有一个类是 public,它被称为主类
default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。
private : :不能修饰外部类。
protected : 不能修饰外部类。
②.非访问控制符:抽象类修饰符 abstract 、最终类修饰符 final
1.2类的使用

public class Student {
//学号
int no;
//姓名
String name;
//年龄
int age;
//性别
boolean sex;
}

no、name、age、sex 都是属性,它们都是成员变量中的实例变量,所谓实
例变量就是对象级别的变量,这些属性要想访问,必须先创建对象才能访问

2.对象的使用

public class StudentTest {
public static void main(String[] args) {
//创建一个学生对象
Student s1 = new Student();
//再创建一个学生对象
Student s2 = new Student();
}
}

注:当是使用System.out.println(引用名)时候会调用类的toString方法(自己写的类要重写toString方法)
2.1对象创建和使用的深层次
java 虚拟机内存管理
① 程序计数器:

  1. 概念:可以看做当前线程所执行的字节码的行号指示器。
  2. 特点:线程私有的内存

② java 虚拟机栈

  1. 概念:描述的是 java 方法执行的内存模型。(每个方法在执行的时候会创建一个
    栈帧,用于存储 局部变量表,操作数栈,动态链接,方法出口等信息。每个方法
    从调用直至完成的过程,就对应一个栈帧从入栈到出栈的过程。)
  2. 特点:线程私有,生命周期和线程相同。这个区域会出现两种异常:
    StackOverflowError 异常:若线程请求的深度大于虚拟机所允许的深度。
    OutOfMemoryError 异常:若虚拟机可以动态扩展,如果扩展是无法申请到足够的
    内存。

③ 本地方法栈:

  1. 概念:它与虚拟机栈所发挥的作用是相似的,区别是 java 虚拟机栈为执行 java 方
    法服务,而本地方法栈是为本地方法服务。
  2. 特点:线程私有,也会抛出两类异常:StackOverflowError 和 OutOfMemoryError。

④ java 堆:

  1. 概念:是被所有线程共享的一块区域,在虚拟机启动时创建。
  2. 特点:线程共享,存放的是 对象实例(所有的对象实例和数组),GC 管理的主要
    区域。可以处于物理上不连续的内存空间。

⑤ 方法区:

  1. 概念:存储已被虚拟机加载的类 类 信息、常量、静态变量,即时编译器编译后的代
    码等数据。
  2. 特点:线程共享的区域,抛出异常 OutOfMemory 异常:当方法区无法满足内存分
    配需求的时候。

JVM图
在这里插入图片描述

3.构造方法

3.1 什么是构造方法?
构造方法是类中特殊的方法,通过调用构造方法来完成对象的创建,以及对象属性的初始
化操作。
3.2 构造方法怎么定义?

[修饰符列表] 构造方法名(形式参数列表){
构造方法体;
}

① 构造方法名和类名一致。
② 构造方法用来创建对象,以及完成属性初始化操作。
③ 构造方法返回值类型不需要写,写上就报错,包括 void 也不能写。
④ 构造方法的返回值类型实际上是当前类的类型。
⑤ 一个类中可以定义多个构造方法,这些构造方法构成方法重载。

当一个类没有显示的定义任何构造方法的时候,系统默认提供无参数构造方法,当显示的定义构造方法之后,系统则不再提供无参数构造方法。无参数构造方法又叫做缺省构造器,或者默认构造方法。一般在开发中为了方便编程,建议程序员手动的将无参数构造方法上,因为不写无参数构造方法的时候,这个默认的构造方法很有可能就不存在了,另外也是因为无参数构造方法使用的频率较高。

三.封装

1.什么是封装?

封装从字面上来理解就是包装的意思,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节,但可以通过该对象对外提供的接口来访问该对象

2.封装的好处

封装之后就形成了独立实体,独立实体可以在不同的环境中重复使用,显然封装可以降低程序的耦合度,提高程序的扩展性,以及重用性或复用性,保护内部的数据。

3.怎么封装

封装的第一步就是将应该隐藏的数据隐藏起来,起码在外部是无法随意访问这些数据的,怎么隐藏呢?我们可以使用 java 语言中的 private 修饰符,private 修饰的数据表示私有的,私有的数据只能在本类当中访问。
注:封装后要对外提供的两个访问入口(get,set)

四. this 和 和 static

1.this

1.1this是什么?
this 可以看做一个变量,它是一个引用,存储在 Java 虚拟机堆内存的对象内部,this 这个引用保存了当前对象的内存地址指向自身,任何一个堆内存的 java 对象都有一个 this,也就是说创建100 个 java 对象则分别对应100 个 this。

1.2this的使用

public class Customer {
private String name;
public Customer(){
}
public Customer(String name){
this.name = name;//这里的“this.”不能省略
}
public void setName(String name){
this.name = name;//这里的“this.”不能省略
}
public String getName(){
return name; //这里的“this.”可以省略
}
public void shopping(){
//这里的“this.”可以省略
System.out.println(name + " is shopping!");
}
}

注:this不能出现在static的方法当中,首先static 的方法,在调用的时候是不需要创建对象的,直接采用“类名”的方式调用,也就是说static 方法执行的过程中是不需要“当前对象”参与的,所以 static 的方法中不能使用 this,因为 this 代表的就是“当前对象”。


this 还有另外一种用法,使用在构造方法第一行(只能出现在第一行),通过当前构造方法调用本类当中其它的构造方法,其目的是为了代码复用。

public class Date {
private int year;
private int month;
private int day;
//业务要求,默认创建的日期为 1970 年1 月 1 日
public Date(){
this(1970 , 1, 1);
}
public Date(int year,int month,int day){
this.year = year;
this.month = month;
this.day = day;
}
}

2.static

2.1static的概述

static 是 java 语言中的关键字,表示“静态的”,它可以用来修饰变量、方法、代码块等,修饰的变量叫做静态变量,修饰的方法叫做静态方法,修饰的代码块叫做静态代码块。在 java语言中凡是用 static 修饰的都是类相关的,不需要创建对象,直接通过“类名”即可访问,即使使用“引用”去访问,在运行的时候也和堆内存当中的对象无关。

2.2局部变量和成员变量

java 中的变量包括:局部变量和成员变量。

在方法体中声明的变量为局部变量,有效范围很小,只能在方法体中访问,方法结束之后局部变量内存就释放了,在内存方面局部变量存储在栈当中。

在类体中定义的变量为成员变量,而成员变量又包括实例变量和静态变量。
1.当成员变量声明时使用了 static 关键字,那么这种变量称为静态变量,静态变量访问时不需要创建对象,直接通过“类名”访问,静态变量存储在方法区当中,静态变量在类加载时初始化。

2.没有使用 static 关键字称为实例变量,实例变量是对象级别的,每个对象的实例变量值可能不同,所以实例变量必须先创建对象,通过“引用”去访问。实例变量存储在堆内存当中,实例变量在构造方法执行过程中初始化。

2.3静态代码块

语法格式

public class StaticTest01 {
//静态代码块
static{
System.out.println(2);
}
//静态代码块
static{
System.out.println(1);
}
//main 方法
public static void main(String[] args) {
System.out.println("main execute!");
}
//静态代码块
static{
System.out.println(0);
}
}

一个类当中可以编写多个静态代码块,并且静态代码块遵循自上而下的顺序依次执行,静态代码块当中的代码在 main 方法执行之前执行,这是因为静态代码块在类加载时执行,并且只执行一次。

2.4静态方法

静态方法是类级别的方法,和静态变量一样,使用“类名.”的方式访问

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值