类是指共性的概念,是一类对象的统称。而对象指的是一个具体的、可以使用的事物。
首先产生类(类是⽣生产对象的蓝图),而后才可以产⽣生对象。对象的所有行行为,一定在类中进行了完整的定义。
1.2 类中的组成 属性(变量,描述每个对象的具体特点)
方法(操作的⾏行行为)
定义: 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 修饰的成员,我们称之为 静态成员(方法、属性),也称之为类变量。
我们主要围绕以下几点展开:
5.1 修饰属性1、 访问方式
2、存储位置
3、可修饰内容
4、 回顾C++ static
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 修饰类(内部类) 和 代码块,后续总结。