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

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、开辟空间 --- new
2、调用合适的构造函数 --- 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 修饰类(内部类) 和 代码块,后续总结。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值