Java面向对象的基本知识

欢迎来到Java的世界里,这里万物皆对象。

一. 类与对象

刚开始接触Java的时候,肯定会有同学会对类和对象两个概念纠结很久,为什么我会知道呢? 因为我就是其中一个。

下面我来介绍一下类和对象吧:

类是具有相同属性和服务的一组对象的集合   对象是系统中用来描述客观事物的一个实体

.......什么鬼?下面两个比喻应该会对你有点帮助:

1.类就是类别,指的是一类东西,比如鸡这个类,而具体的一只只鸡就是对象,也就是对象。

2.类就是一个模板,比如你去买手机,跟销售员说你要一个屏幕多大的,价钱多少的,有什么功能的手机,你描述中的这种手机就是一个类,销售员给你的具体的手机就是一个对象。

二、包(Package)import和import static

Java中的包Package是类的容器,包相当于是一个文件夹,类相当于是这个文件夹的子文件。如果没有指定包名,所有示例都属于一个默认的无名包。

1.把功能相似或者相关的类或者接口组织在同一个包中,方便类的查找和使用。

2.如同文件夹一样,包也采用了树形目录的存储方式,同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中的相同类名的类的时候,

应该加上包名加以区别。因此,包可以避免名字冲突。

3.包也限定了访问权限,拥有包访问权限的类才能访问某个包。

import可以向某个Java文件中导入指定包层次下的某个类或者全部类。

import static可以向某个java文件导入指定类的某个静态变量、静态方法或者全部静态变量、静态方法。

三、访问修饰符

public : 可以被任何类访问。

protected : 可以被同一个包中的所有类访问;也可以被子类访问,即使子类没有在同一个包内。

private :只能被当前类的方法访问。

缺省:无访问修饰符,可以被同一个包中的所有类访问;如果子类没有在同一个包中不可访问。

四、垃圾回收机制

如果没有任何引用指向堆内存中的某个对象,那么程序就无法再访问该对象,这个对象也变成了垃圾,Java垃圾回收机制将回收该对象,释放该对象所占内存区。因此,如果希望通知Java垃圾回收机制收回某个对象,只需要切断所有应用变量与这个对象的关系,也就是将这些引用变量赋值为null。

五、this,static关键字

Java中的this关键字总是指向调用该方法的对象,这个方法可以是构造方法,也可以是普通方法。也就是说某个方法有this,这个时候它代表的对象是不确定的,但是它代表的对象必然是当前这个类的对象,只有当这个方法被调用的时候,这个对象才确定下来。这个方法如果是构造方法,那么就是this指向正在用该构造方法初始化的对象,如果是普通方法,那么this就引用调用该方法的对象。

对于使用static修饰的方法而言,可以使用类来直接调用该方法,static修饰的方法中如果有this,那么this无法指向对象,所以:

static修饰的方法中不能使用this关键字。

如果在static修饰方法中调用非static修饰的成员变量或者方法,那么默认调用了this,这也会报错,所以:

static修饰的方法不能调用非静态的成员变量或方法。

六、Java中的方法

1.方法的参数传递机制

Java中方法的传递机制只有一种:值传递。值传递就是将实际参数的副本也就是复制品传入方法内,而参数本身不会受到影响。

假设有两个整数int a=1,b=2,传入一个方法swap(int a,int b),传入的是a,b的副本,而不是a,b本身,所以将有四个变量储存在内存中,分别是main栈区中的a,b和swap栈区中的a,b,经过swap方法后的副本a,b的值交换,但交换的只是swap栈区的a,b,而main栈区中的a,b则不变。

如果传入的不是数值类型,而是引用类型,如一个Test类中有两个成员变量int a=1,b=2,将这个类的引用变量test传入一个方法swap(Test  test),传入的也是test这个引用变量的副本,所以内存中将有三个部分,堆内存中的Test对象,main栈区中的test引用变量,swap栈区中的引用变量,因为两个引用变量均指向Test,所以不管操作哪个引用变量都是操作同一个对象,因此,swap中交换test引用指向的对象的成员变量a,b的值,main中的test引用指向对象的成员变量的值a,b也被交换了。

2.形参个数可变的方法

如果传入方法的参数个数是不确定,那么可以定义长度可变形参,在方法内部当做数组来处理,长度可变形参必须在参数列表的最后一项,格式为类型...变量,如String...books。一个方法中最多只能包含一个长度可变形参,这个长度可变形参可传入多个参数,也可以传入一个数组。

3.成员变量与局部变量

成员变量分为静态变量和实例变量。

静态变量在类加载的准备阶段分配内存并初始化为默认值,在类初始化阶段对静态变量赋予初始值,也就是静态变量初始化。静态变量作为类的一个成员,直至系统销毁这个类,与这个类共存亡。

实例变量在该类的实例创建后随对象一起分配在内存中,同时初始化默认值,接着为实例变量赋予初始值,也就是实例变量的初始化,实例变量作为实例的一个成员,直到系统销毁这个实例,与实例共存亡。

局部变量分为三种:形参、方法局部变量和代码块局部变量。

形参:在定义方法签名是定义的变量,形参的作用域为整个方法。

方法局部变量:在方法体内定义的局部变量,这个局部变量的作用域从定义该变量的地方生效,到该方法结束时失效。

代码块局部变量:在代码块中定义的局部变量,这个局部变量的作用域从定义该方法的地方生效,到该代码块结束时失效。

定义局部变量后,系统并未为这个变量分配内存空间,知道这个程序为这个变量赋初始值,系统才会为局部变量分配内存空间,并将初始值保存到内存空间。


成员变量不需要显式初始化,因为它有默认初始化。但是局部变量中除了形参外,都必须显式初始化,也就是说必须给方法局部变量和代码块局部变量指定初始值,否则不可以访问它们。

能用局部变量代替成员变量就使用局部变量,因为成员变量内存开销大,在使用局部变量的尽量缩小它的作用范围,因为范围小,它在内存中停留的时间越短,程序的性能鱼越好。

七、构造方法

当调用构造方法时,系统为对象分配内存空间,也就是说,在构造方法的执行体执行之前这个对象就已经存在了,当构造方法执行完后,这个对象作为返回值赋予引用变量。


.

你可能感兴趣的:(Java,基础)