Java是一门纯面向对象的语言,在java的世界里,一切皆为对象。
面向对象程序设计关注的主体是对象,通过对象之间的交互来完成,无需关注具体实现的过程。
类
类的声明与实例化。
类是面向对象编程中最基本的技术,类是对字段,方法,构造函数等进行封装之后的内容,类相当于一个设计图,通过类这个设计图可以实例化出对于的主体,也就是设计图对应的“建筑物”。
类的声明:
class Student{
String name;
string sex;
int age;
}
这样看起来,类像是C语言中的结构体,但类能包含的东西可远比结构体多。
类是类类型的声明,而不是类变量的声明。
类变量的声明如下:
Student zhangsan;
但是用改声明创建的zhangsan并不是Student类的主体,而是引用Student类主体的类类型变量。
真正的类类型主体,是通过new运算符创建的:
Student zhangsan=new Student();
类类型的主体被称为实例,通过new运算符创建主体的操作也叫类的实例化。该声明实例了一个学生主体,并将该主体的引用赋给了类类型变量zhangsan;zhangsan并不是实际实例化出的建筑物,他更像是指引到该建筑物的“地图”;
而面向对象中的对象,则是在程序运行时动态创建的主体的总称。
实例变量与字段的初始化
实例中的各个字段,被叫做实例变量,通过成员访问运算符,即类类型变量名.字段名进行操作。
默认初始化:若类中的字段在声明时未初始化,则在加载类或实例化时,实例变量会被初始化默认值
就地初始化:当声明实例变量时,就给出初始值。
构造方法与构造方法的重载
构造方法是在创建实例时被编译器自动调用的,用来正确地初始化类的实例,他的名字与类名相同,且没有返回值(void也不行);
构造方法可以重载,用户可以根据自己的需求重载构造函数,在实例化主体时,编译器会根据传入构造方法的参数来决定要调用的构造方法。
若未自行定义构造方法,编译器会自动为类创建一个无参构造方法,这个构造方法什么也不做(实际上也不是什么也不做,他会调用父类的构造方法,这个后面会讲到。)
this引用
若 构造方法或成员方法 中的 形参 或 局部变量 与 类的字段 同名
那么类的字段会被隐藏,我们来看下面一个例子:
class Student{
String name;
string sex;
int age;
Student(String name,String sex,int age){
name=name;
sex=sex;
age=age;
}
}
我们的本意是要将传入构造函数的三个形参用于初始化类中的三个实例变量,
但是实际运行会发现,实例变量未被成功初始化,扔未默认值,这是因为构造方法中的形参及局部变量与类的字段同名,导致类的字段同名 ,构造方法里的两个name其实都是形参name;
要想实现成功初始化,应将代码如下改写:
class Student{
String name;
string sex;
int age;
Student(String name,String sex,int age){
this.name=name;
this.sex=sex;
this.age=age;
}
}
在类的方法中,this指的是对当前对象的引用,
this只能在成员方法中使用,哪个对象调用就是哪个对象的引用类型。
封装的概念
面向对象概念具有三大特性,封装,继承,多态。
在类和对象阶段对应的就是封装,封装也可称为套壳屏蔽细节。隐藏对象的属性和实现细节,让用户通过公开的接口对其进行交互。
java通过类和访问权限限制符来实现封装。
public 公开的 所有人都可以访问
default 默认的 什么也不写时的权限,在同一包中可以访问。
private 私有的,只有在同一类中可以访问
protected 主要用于继承。
字段的属性原则要设为私有的,对字段的操作可以通过定义访问器,获取字段值设定一个方法get,设置字段值设定一个方法set。
包
将多个类或接口放在一起,则称为包。包可以具有层次结构,其配置与目录对应,包名的首字母应为小写字母。
包package中简名为Test的类型的完全限定名为package.Test
同一个包中的类型名可以用简名直接使用,如果在不同包中想要使用简名,则需要执行类型导入声明,否则只能使用完全限定名。
类型导入声明为单类型导入声明和按需类型导入声明
package.Test(单类型导入) package.*(按需类型导入声明)
访问静态成员变量和静态方法 需要执行静态导入声明。
静态成员变量/静态成员方法/静态代码块
静态成员成员变量和静态成员方法也被称为类变量和类方法。
声明中加上static的字段和方法就是类变量和类方法。
类变量不属于各个实例,它不依赖于对象,该类的全部实例都共享这个类变量的数据。
可以通过类名.变量名进行访问,也可以通过类类型变量.变量名进行访问。
类方法也一样,并不用于特定实例,即使未实例化也可以调用。通常用于与整个类相关的处理,或者与当前类的状态无关的处理。
静态方法中不能直接访问同一个类中的非静态属性(非静态的变量与非静态的成员方法)
因为静态方法属于类,并不依赖的特定的对象,而非静态属性是需要实例化的,依赖于对象。所以不能直接地调用。
用static修饰的代码块是类的初始化器,也叫静态代码块,只会在类被加载时调用一次,之后实例再多对象也不会被调用。
实例变量/实例方法/实例代码块
实例方法可以访问同一个类中的非静态属性(非静态的变量与非静态的成员方法)
在类中,方法外,未被static修饰的被称为实例代码块,实例代码块会在构造函数的开头被调用。
可以将类中的所有的构造函数的共同处理独立为实例代码块。
final
final用于修饰属性,方法和类,分别表示属性不能被重新赋值,方法不能被重写(覆盖),类不能被继承。