Java 类
java是面向对象的计算机语言。
对象:真实存在唯一的一个事物(具体)。 比如: 我家的狗,
类: 同一种事物的公共属性以及公共功能的抽取(抽象的概念).
我们从小的时候就不断的接触到很多对象, 通过不断 的接触对象
我们大脑就会把具备相同属性和相同功能的事物进行归类。
计算机是服务于人类的, 那么为了让我们计算机更加贴近我们的生活,所以面向对象的计算机语言就诞生了。
在现实生活中: 对象--------> 类
在java中: 类----------->创建对象。
面向对象的核心思想:找适合的对象,做适合的事情。
找对象的方法:
1. 我们自定义类,然后通过自定义类去创建对象。 (自定义类的过程中会涉及到很多的语法,那么这时候我们就可以把这些涉及 到的语法学习,然后再看别人写的类,才能看懂)
2. sun公司已经定义 好了很多的类,我们只需要认识这些类即可创建对象使用。
自定义类创建对象的步骤:
1. 先使用class自定义个类。
格式:
class 类名{
事物的公共属性使用成员变量描述;
事物的公共行为功能使用方法描述;
}
2. 通过自定义的类创建对象。
创建对象的格式:
类名 变量名 = new 类名();
3. 访问对象的属性或者调用对象的功能。
访问对象的属性格式:
对象.属性名;
调用对象的功能行为:
对象.函数名();
成员变量与局部变量的区别:
1.位置的区别:
成员变量是定义在方法之外,类之内的变量。
局部变量是定义在方法之内的变量。
2.作用上的区别:
成员变量的作用是用于描述一个事物的属性.
局部变量的作用就是用于提供一个变量给方法内部去使用而已。
3. 生命周期的区别:
成员变量的生命周期是随着对象的创建而创建,随着对象的消失而消失。
局部变量调用到对应的方法时执行到了创建该局部变量语句的时候存在,局部变量
一旦出了自己的作用域会马上消失。
4. 初始值的区别:
成员变量有默认的初始值。 具体的初始值要看变量的数据类型
int 0
double 0.0
float 0.0f
char ' '
boolean false
String null
局部变量是没有默认的初始值的,要先初始化才能使用。
面向对象的语言三大特征:
1. 封装
2. 继承
3. 多态
权限修饰符: 权限修饰符就是用于控制变量或者方法的可见范围。
public : 公共, public 修饰的变量或者方法可以在任何范围内可见。
private : 私有的, private 修饰的变量或者是方法只能在本类中可见。
构造函数的作用: 给对应的对象进行初始化。
构造函数的格式:
修饰符 函数名(形式参数列表){
初始化的语句;
}
构造函数要注意的细节:
1. 构造函数是没有返回值类型的。
2. 构造函数的函数名必须 与类名一致。
3. 构造函数并不是由我们手动调用的,构造函数是在创建对应对象的时候由jvm主动调用的
(每创建一个对象就会调用一次构造函数)。
4. 如果一个类没有显式的添加一个构造函数,
那么java编译器会为该类添加一个无参的构造函数。
5. 如果一个类已经显式的添加一个构造函数,
那么java编译器则不会再为该类添加一个无参的构造函数。
6. 构造函数是可以以函数重载的形式存在多个的。
疑问1 :我们现在知道创建对象的时候,jvm需要调用到对应的构造方法,
那么以前我们没有学构造方法,那么jvm还会调用到构造方法吗?
而且构造方法存在吗?
存在构造方法的, 但是不是java虚拟机添加的,是java编译器添加的。
疑问2:java编译器添加的无参构造函数的修饰符是什么?
无参的构造函数的权限修饰符是与类名一致的。
如何反编译: 反编译可以使用jdk给我们提供的开发工具---》javap
javap -c -l -private class文件
问题:重复代码。
构造函数的作用:给对应的对象进行初始化。
构造代码块:给所有的对象进行统一的初始化。
构造代码块格式:
{
初始化语句;
}
代码块的类型:
构造代码块: 代码块位于成员位置上。
局部代码块 :代码块位于方法之内。
局部代码块的作用: 缩短局部变量的生命周期。
静态代码块:
this关键字: this关键字代表的是所属方法的调用者对象。
问题: 存在着同名的成员变量与局部变量时,在方法内部默认是访问局部变量的数据,如何才能访问成员变量呢?
this关键字的作用:
1. 一个类存在着同名的成员变量与局部变量时,在方法内部默认是访问局部变量的数据,我们可以通过this关键字指定
访问成员变量的数据。
2. this关键字可以在构造方法中调用其他的构造方法初始化对象使用。
this关键字要注意的细节:
1. 如果在一个函数中访问一个成员变量,而且没有存在同名的局部变量 时,那么java编译器会默认在变量的前面加上this关键字的。
2. this关键字调用 其他的构造方法数时,this语句必须 位于构造方法中的第一个语句。
3. this关键字调用构造函数的时候不准出现相互调用的情况,因为是一个死循环的调用方式。
static(静态)
需求:使用java类描述千峰的学生。 千峰的学生都是中国人
问题1:每个学生都是中国人,那么就没有必要在每个学生对象中都维护者一个country属性。
解决方案:把country数据移动到数据共享区中。
问题2:怎样子才能把数据移动到数据共享区中?
解决方案:只需要使用static关键字修饰该成员变量即可。
static(静态): 修饰符
static修饰成员变量: 如果一个数据需要被所有对象共享使用的时候,那么即可使用static修饰该成员变量。
访问方式:
方式1: 可以使用对象进行访问。 格式:对象.静态属性名
方式2: 可以使用类名进行访问。 格式: 类名.属性名。
推荐使用:可以使用类名进行访问。
静态成员变量要注意的细节:
1. 静态的成员变量可以使用类名或者是对象进行访问。
2. 非静态的成员变量只能使用对象进行 访问,不能使用类名直接访问。
3. 千万不要为了方便访问而使用static修饰一个成员变量,只有这个成员变量的数据是需要被共享的时候
才使用static修饰。
static修饰成员函数:
静态函数的访问方式:
方式一:使用对象访问。 格式: 对象.函数名()
方式二:使用类名访问。 格式: 类名.函数名();
静态函数要注意的细节:
1. 非静态的函数只能使用对象调用,不能使用类名调用。
2. 静态函数可以直接访问静态的成员,但是不能直接访问非静态的成员。
原因:静态函数可以使用类名调用,而这时候对象可能还没有存在内存中,这时候非静态的数据也就不存在内存中。
3. 非静态函数可以直接访问静态以及非静态的成员。
原因:非静态函数必须要由对象调用,如果对象存在了,静态数据以及非静态数据早就存在内存中了。
4. 静态函数不能出现this以及super关键字。
原因:因为静态函数可以使用类名直接调用,而这时候可能还没有对象存在,this又要代表当前对象。
什么时候使用static修饰一个函数呢?
如果一个函数没有直接访问非静态的成员,那么即可使用static修饰该函数了。(常用于工具类的方法 Arrays)
非静态的成员变量与静态成员变量的区别:
数量上的区别:
(n份)非静态成员变量是在每个对象中都维护一份数据
(1份)静态成员变量只会在方法中维护一份数据。
访问方式上的区别:
非静态的成员变量只能使用对象进行访问.
静态成员变量可以使用对象、类名进行访问。
存储位置上的区别;
非静态成员变量是存储在堆内存中。
静态成员变量是存储在方法区中。
生命周期的区别:
非静态成员变量是随着对象的创建而存在,随着对象的消失而消失。
静态成员变量是随着类文件的加载而存在,随着类文件(字节码文件)的消失而消失。
作用上的区别:
非静态成员变量的作用是用于描述一类事物的属性。
静态成员变量的作用是提供一个共享数据给所有对象使用的。
main方法是由jvm调用的,jvm也是一个程序。
main方法详解:
public : 公共。 保证该类在任何情况下,jvm都对其方法可见,
static: 静态。 可以使用类名调用. 避免创建对象,而且解决了创建对象传递参数的问题.
void : 没有返回值。 即使有返回值,但是返回 也是返回给jvm,jvm对于这个返回值没有作用。
main: 并不是一个关键字,只不过是jvm识别的一个特殊的标识符的而已。
args: 形参。
没有static修饰的后果:
1. java虚拟机调用main方法的时候需要创建对象。
new Demo4().main();
2. 创建对象的时候偶尔需要的参数。
new Demo4(null);
某些程序在启动的时候需要一些参数。