一文快速了解对象的创建和使用

本文概述了Java虚拟机内存管理的关键部分,包括程序计数器、虚拟机栈、本地方法栈和堆区,重点讲解了构造方法的使用、空指针异常以及方法调用时参数的传递。通过实例演示,帮助读者理解面向对象的核心概念和实践技巧。
摘要由CSDN通过智能技术生成

目录

 面向对象的三大特征:

对象的创建和使用

Java虚拟机内存管理

1.程序计数器:

2.java 虚拟机栈(重点):

3.本地方法栈:

4.java堆(重点):

5.方法区(重点):

构造方法的使用与作用

空指针异常

方法调用时参数的传递


 面向对象的三大特征:

封装

继承

多态

面向对象(OO):对象独立团可完成那些

面向过程(OP):过程、因果关系

面向对象的分析:OOA

面向对象的设计:OOD

面向对象的编程:OOP

类:现实世界中不存在的,模版概念,抽象的结果,代表一类事物,对象A与对象B共同特征抽象的概念。

对象:实际存在的个体(实例)

类的定义:

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

这个是最基础的,也是最基本的,下面给大家举个例子:

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

}

以上程序当中no、name、 age、 sex 都是属性,它们都是成员变量中的实例变量,所谓实例变量
就是对象级别的变量,这些属性要想访问,必须先创建对象才能访问
不能直接通过类去访问,因为
每一个学生的学号都是不一样的。没有学生对象,谈何学号?

对象的创建和使用

类定义之后,就可以使用类这个 “模板”来创造“对象”了,一个类是可以创建多个对象的蛋!
怎么创建呢,语法是什么?其实语法格式很简单:new 类名 0,这样就可以完成对象的创建了。俗话说,
你想要什么java 都可以给你,想要啥你就 new 啥。请看下面代码:

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

为了使用对象更加方便,建议使用变量接收一下?

例如以下代码:

public class StudentTest{
public static void main(String[] args){
//创建一个学生对象
Student s1 = new Student(;
//再创建一个学生对象
Student s2 = new Student();
//以上代码其实和这行代码差不多
int i = 10;
}
}

以上代码最初接触的时候,大家肯定会感觉非常陌生,这也是正常的,Student s1 = new
student()实际上和 int i=10是类似的,对于 int i= 10 来说,int 是一种基本数据类型,i 是变量名,
10是int类型的字面量。那对于 Student s1 =new studento 来说,其中Student 是一种引用数据类型,s1 是变量名,new Student()执行之后是一个 Student 类型的对象。

java 语言当中凡是使用 class 关键字定义的类都属于引用数据类型。

创建了对象之后怎么去访问这个对象的属性呢,或者说学生对象现在有了,怎么去访问他的学号、
姓名、性别、年龄等信息呢。
请看以下代码:

public class StudentTest{
public static void main(String[] args){
//创建一个学生对象
Student s1 = new Student();
//再创建一个学生对象
Student s2 = new Student();
//以上代码其实和这行代码差不多
int i = 10;
int nol = s1.no;
System.out.printin("学号:"+ no1);
String namel=s1.name;
System.out.printin("姓名:"+ name1);
int age1 = s1.age;
System.out.printin("年龄:"+age1);
boolean sex1 = s1.sex;
System.out.println(”性别:"+ sex1);
int no2 = s2.no;
System.out.printin(" 学号:"+no2);
String name2 = s2.name;
System.out.println(" 姓名:" + name2);
int age2 = s2.age;
System.out.println(” 年龄:”+age2);
boolean sex2 = s2.sex;

System.out.println(”性别:"+ sex2);

//当然,也可以不使用 no1,no2 这样的变量接收
System.out.printin("学号="+s1.no);
System.out.println("姓名="+ S1.name);
System.out.println("年龄=" + s1.age);
System.out.printin("性别="+ S1.sex);
System.out.println("学号="+ s2.no);
System.out.println("姓名="+ s2.name);
System.out.printin("年龄="+ s2.age);
System.out.printin("性别="+ s2.sex);
public class StudentTest{
public static void main(String[] args){
//创建一个学生对象
Student s1 = new Student();
//再创建一个学生对象
Student s2 = new Student();
//以上代码其实和这行代码差不多
int i = 10;
int nol = s1.no;
System.out.printin("学号:"+ no1);
String namel=s1.name;
System.out.printin("姓名:"+ name1);
int age1 = s1.age;
System.out.printin("年龄:"+age1);
boolean sex1 = s1.sex;
System.out.println(”性别:"+ sex1);
int no2 = s2.no;
System.out.printin(" 学号:"+no2);
String name2 = s2.name;
System.out.println(" 姓名:" + name2);
int age2 = s2.age;
System.out.println(” 年龄:”+age2);
boolean sex2 = s2.sex;

System.out.println(”性别:"+ sex2);

//当然,也可以不使用 no1,no2 这样的变量接收
System.out.printin("学号="+s1.no);
System.out.println("姓名="+ S1.name);
System.out.println("年龄=" + s1.age);
System.out.printin("性别="+ S1.sex);
System.out.println("学号="+ s2.no);
System.out.println("姓名="+ s2.name);
System.out.printin("年龄="+ s2.age);
System.out.printin("性别="+ s2.sex);
}
}

Java虚拟机内存管理

1.程序计数器:

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

2.java 虚拟机栈(重点):

每个方法在执行的时候会创建一个栈帧,用子概念:描述的是 java 方法执行的内存模型。存储局部麥量表,操作数桂,动态链接,方法出口等信息。每个方法从调用直至完成的过程,就对应一个栈帧从入栈到出栈的过程。


特点:线程私有,生命周期和线程相同。这个区域会出现两种异常:StackOverflowError异常:
若线程清求的深度大于虛拟机所允许的深度。OutofMemoryError 异常:若虛拟机可以动态
扩展,如果扩展是无法申请到足够的内存。



3.本地方法栈:


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



4.java堆(重点):


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



5.方法区(重点):


概念:存储已被虛拟机加载的类信息、常量、静态变量,即时编译器编译后的代码等数据。
特点:线程共享的区域,抛出异常 OutOfMemory 异常:当方法区无法满足内存分配需求的
时候。
以上所描述内容,有看得懂的,也有看不懂的,例如:线程、本地方法等。
针对于目前来说,必须要知道 java 虚拟机有三块主要的内存空间,分别是 “虚拟机栈(后面
简称栈)”、“方法区”、“堆区”,方法区存储类的信息,栈中存储方法执行时的栈帧以及局部变量,
堆区中主要存借 new 出来的对象,以及对象内部的实例变量。其中垃圾回收器主要针对的是堆内存,方法区中最先有数据,因为程序执行之前会先进行类加载。栈内存活动最频繁,因为方法不断的执行并结束,不断的进行压栈弹栈操作。
 

构造方法的使用与作用

什么是构造方法?构造方法怎么定义?构造方法怎么调用?构造方法有什么作用?构造方法可以
重载吗?接下来学习一下。
构造方法是类中特殊的方法,通过调用构造方法来完成对象的创建,以及对象属性的初始化操作。
构造方法怎么定义,请看以下的语法格式:


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

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


怎么调用构造方法呢,语法格式是:new 构造方法名(实际参数列表)

 public class Date {
int year; // 年
int month;// 月
int aay; // 日
1构造方法(无参数构造方法
public Date f
System.out.printin("Date h7 ");
public class Datelest+
public static void main(String|] args) t
System.out.println("main begin");
new Datel);
System.out.println("main over");

public class Date {
int year; // 年
int month;// 月
int day; // 日
//构造方法(无参数构造方法)
public Date(){
System.out.printin("Date类无参构造方法执行");
}
}
public class DateTest{
public static void main(String[] args){

System.out.println("main begin");

new Datel();

System.out.println("main over");
}

main begin

Date类无参构造方法执行

main over

当一个类没有品示的定义任何构造方法的时候,系统默认提供无参数构造方法,当显示的定
义构造方法之后,系统则不再提供无参数构造方法。

无参数构造方法又叫做缺省构造器,或者默认构造方法。一般在开发中为了方便编程,建议程序
员手动的将无参数构造方法写上,因为不写无参数构造方法的时候,这个默认的构造方法很有可能就
不存在了,另外也是因为无参数构造方法使用的频率较高。

public class Date {
int year; // 年
int month;// 月
int day; // 日
//构造方法(无参数构造方法)
public Date(){
System.out.printin("Date类无参构造方法执行");
}

//构造方法(有参数构造方法)
public Date(int yearl){
System.out.printin("带有参数 year 的构造方法");
}

//构造方法(有参数构造方法)
public Date(int yearl, int monthl){
System.out.println(” 带有参数 year,month 的构造方法");
}

//构造方法(有参数构造方法)
public Date(int yearl, int monthl, int day1){
System.out.printin("带有参数year,month,day 的构造方法 ");
}
}
public class DateTest{
public static void main(String[] args){
System.out.println("main begin");
new Datel;
new Date(2008);
new Date(2008 , 8);
new Date(2008, 8, 8);
System.out.printin(" main over");
}
}

通过以上的测试可以看出一个类当中可以定义多个构造方法,构造方法是支持重载机制的,具体
构造方法调用哪个就要就事论事了。但是显然在返回值类型方面不写任何类型,但它执行结束之后实际上会返回该对对象的在堆内存上的内存地址,这个时候可以定义变量接收对象的内存地址,这个变量就是之前所学的“引用”。

空指针异常

我们用空引用却访问实例变量:大家可以试试下面这串代码

public class Balloon {
//颜色
String color;
//气体
String gas;
//构造方法
public Balloon(){

}
public Balloon(String _color, String _gas){
color = color;
gas = gaS;
}
}
public class BalloonTest{
public static void main(String[] args) {
Balloon ball=new Balloon(" 红色","氫气");
System.out.printin(" 气球颜色是:"+ball.color);
System.out.printin(" 气球中的气体是:"+ ball.gas);
ball = null;
//空指针异常
System.out.printin(" 气球颜色是:"+ ball.color);
}
}

java.lang.NullPointerException 被称为空指针异常,在java 编程当中属于很常见的异常。

方法调用时参数的传递

方法在调用的时候参致是如何传递的呢? 调用时参数传递的过程就是赋值的过程,参数传递和赋值规则完全相同,只是参数传递在代码上看不见“=”运算符。

 

在对这一篇文章的学习中掌握方法调用时参数是如何传递的,一定要弄明白这个知识点,在以后的开发中会频繁的进行方法的调用,而方法调用时需要传递参数,参数传递时内存是如何变化的,
弄明白这些有助于你对程序运行结果的把控。

最后欢迎大家点赞关注加收藏,也可以在评论区留言大家一起学习!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值