欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

(1)JavaSE---类和对象、this、static

时间:2023-06-30
1、类和对象 1.1 基本概念

类是指共性的概念,是一类对象的统称。而对象指的是一个具体的、可以使用的事物。

首先产生类(类是⽣生产对象的蓝图),而后才可以产⽣生对象。对象的所有行行为,一定在类中进行了完整的定义。

1.2 类中的组成

属性(变量,描述每个对象的具体特点)
方法(操作的⾏行行为)

1.3 定义和使用

定义: java 使用class 来声明类。

class 类名称 {属性1;...方法1() {}...}

范例例: Person类的定义

class Person{public String name;public int age;public String showInfo(){return "name: "this.name+", age: "+this.age;}}

创建对象的语法:

类名称 对象名称 = new 类名称();

以Person类为例, 我们可以如下产生一个Person类的实例例(对象):

Person p1 = new Person();Person p2 = new Person("Steven",25);

tips:
实例化对象分为两个步骤:

1、开辟空间 --- new2、调用合适的构造函数 --- Person()

2、对象内存

先主要介绍Java中的内存区域:栈内存和堆内存两块区域

栈内存(虚拟机局部变量量表):存放的是局部变量量(包含编译期可知的各种基本数据类型、对象引用-即堆内存的地址)。堆内存:保存的是真正的数据,即对象的属性信息。

new关键字 用于在对上开辟空间,Person() 则对该对象实例化。
而在堆上的这个对象,拥有一个地址,这一地址,通过在 栈上开辟的Person person 变量进行接收。因此我们也将 p1称之为 引用。

所有引用数据类型访问堆上空间,使用 " 、" 操作符

p1.showInfo();

对象(引用数据类型)必须在实例例化后调用,否则会产生 NullPointerException (运行行时错误),编译时不不会出错。

引用的本质: 一块堆内存,可以被多个 栈内存指向。
Person p1 = new Person();
Person p2 = p1;

那 Person p1 = null 怎么解释解释呢?
null就表示 该引用不引用任何对象呗,
那对 null 进行引用会发生啥?
空指针异常呗, 因为本来就什么也没有。

啥成员方法、成员变量的就不想说太多了, 重点看看 static 吧!

3、构造方法

构造方法在 new 关键字实例化新对象时调用,用于对象构造以及初始化

3.1 语法规则

1、方法名于类名相同
2、无手动实现的情况下,编译器会默认提供一个无参构造
3、构造函数可以重载,且至少有一个
4、构造函数无返回值

class Person{public String name;public int age;Person(){ System.out.println("无参构造");}Person(String name, int age){this.name = name;this.age = age;}public String showInfo(){return "name: "this.name+", age: "+this.age;}}

Java没有析构函数。

4、this

为啥想说 this , 因为我想说 static

this 表示当前对象的引用,而非当前对象

为什么this 是引用?
对象实例化步骤分为:
1、开辟内存
2、调用构造函数

在构造函数中可以使用 this,说明this出现于对象创建之前,而此时内存空间已经分配好,有内存空间就一定有地址,而地址一定存在引用,所以说this指向的是对象的引用。

//回到之前我们所说:Person p1 = new Person(); // p1 我么也称之为引用

如何理解 this 和 p1 皆为引用呢?

个人理解:
首先 引用:是相对于地址而言,并非是对象实例化某个阶段统称,
其次,p1为对象完全是实例化的引用,而 this则是对象实例化 对象内存分配地址的引用。

那我们现在知道this的本质后,如何使用this?

1:this访问成员变量
2:this调用成员方法
3:this调用构造方法

public class Person { public String name; private int age; public static String country = "China"; Person(){ this.name = "xiaoming"; this.age = 18; }; public int getAge() { return age; } private void func(){ System.out.println("I am func!"); this.showInfo(); } public static void showInfo(){ System.out.println("My motherland is " + country ); }}

4.1 this调用成员变量

在这里插入代码片

5、static 关键字

用 static 修饰的成员,我们称之为 静态成员(方法、属性),也称之为类变量。

我们主要围绕以下几点展开:

1、 访问方式
2、存储位置
3、可修饰内容
4、 回顾C++ static

5.1 修饰属性

1、访问方式

对象.静态成员类名.静态成员

2、存储位置

方法区

3、特性

静态属于类,不依赖对象,为所有对象共有

4、static用法

(1)修饰成员变量(2)修饰方法(3)修饰类(4)修饰代码块

5.2 static用法

(1)修饰成员变量

static 修饰的属性为类属性(变量),所有对象共享该属性, 这就导致任何对象实例访问,都可能修改它的值。 并且其不保存在堆上,而是保存在方法区,方法区:静态变量和常量

java中,类中的常量,通常使用 static final同时修饰。此时 常量全局全局唯一,且不能修改,所有对象共享次常量。

class Person{ // 被final 修饰的为 常量, 但是属于对象,所以存储于 堆上,不可改 static final String country = "china"}// final修饰的变量,只有当这个变量定义在方法内部,// 才会存储在堆上,因为此时该变量为局部变量

(2) 修饰方法

static 修饰的方法称为静态方法, 可以通过类名.静态成员方法访问在调用时,无需创建对象实例。

静态方法可以访问静态成员变量,不能访问普通类型成员变量

注:在C++中,this 会隐式作为成员非静态方法第一个参数,而成员静态方法却无法将this作为参数,这就是为什么静态成员方法无法访问成员变量的原因。

至于Java,是否为相同原理,需要探究。

不管是在静态方法还是非静态方法中,均不能定义 静态变量因为静态的变量属于类并不属于方法,也就是我们俗称的类变量

static 修饰类(内部类) 和 代码块,后续总结。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。