JAVA类与对象
Java的类与对象
类的定义
什么是对象?什么是类?
对象是指现实世界或者概念世界的任何事物,每一个具体的事物称为对象的实例
类是指具有相同结构特征的对象的结构抽象(软件工程中的官方术语)
关键字
class
类名
建议采用大驼峰的命名方式
属性
定义在类的内部,方法的外部
- 成员变量
- 静态成员变量
- 实例成员变量
- 方法
- 静态成员方法
- 实例成员方法
访问修饰限定符
- public(公开的)
- private(私有的)
- protected(受保护的)
- 默认(什么都不写)
类的实例化
采用new关键字
Persion persion0 = new Persion();
Persion persion1 = new Persion();
类和对象的关系
一个类可以实例化成多个对象
访问对象的成员变量和方法
当成员变量没有初始化的时候,那么这些值是对应的默认值(0/null/false)
- 对于public(不被static修饰的)的变量或方法可以使用 对象名.属性名/方法名
System.out.println(persion0.name);
persion0.show();
- 静态的成员变量和静态的成员方法(有static修饰)
通过 类名.属性名/方法名访问
所以一些地方成静态的变量或方法为类变量或类方法
内存的存储方式
静态成员变量不属于对象(内存不是开辟在栈上),在内存上位于方法区
重写toString方法
如果不重写,直接打印对象的实例,默认调用的是Object的toString方法
可以在类中重写toString方法,从而返回一个你需要的字符串
对成员变量的初始化
默认初始化
不进行赋值,采用变量的默认赋值
就地初始化
指在类中定义变量时直接赋给其初始值
class stu{
String name = "xiaowei";
...
}
类外初始化
在创建对象后进行赋值(初始化)
//不推荐采用这种初始化方式,如:若方法内的变量名发生改变,外部会报错
Persion p1 = new Persion();
p1.name = "xiaowei";
p1.age = 19;
关于static关键字
修饰成员变量
- 访问形式:类名.变量名
- 内存存储方式:方法区
- 特点:静态的成员变量只有一份,不依赖于对象(在不同对象中修改别的地方的值也会随之修改)
修饰成员方法
- 访问形式:类名.方法名
- 特点:在静态方法内部,是不可以访问实例的成员变量的
修饰类
修饰代码块
封装
为了安全起见,成员变量筒通常采用private修饰,使用private修饰的成员变量或成员方法,不能直接访问,只能在类的内部进行访问和修改。
若要在类外访问需要采用在类内设置 get,set方法(idea可以自动生成)来进行实现
public void setName(String name){
this.name = name;
//如果没有this相当于把局部变量name赋值给局部变量name
//this代表当前对象的 !引用!(注意引用两个字)
//this不能访问static修饰的成员变量
}
public void getName(){
return this.name;
}
关于this和static详情
- 静态方法内部不能用this密切不能访问非静态数据
- 普通方法的内部时可以访问静态数据的
- 不管当前的方法是静态的还是非静态的方法 内部都不可以定义静态变量。 原因:静态的变量是属于类的而不属于方法
封装的意义
对数据的安全性提升
对类的调用者更加方便
构造方法
作用
构造函数在创建对象时执行
实例化一个对象分为几步:
- 为对象分配内存空间
- 调用合适的构造方法(构造方法不只一个,可以被重写)
构造方法的写法
- 没有返回值
- 构造方法名和类名相同
- 构造方法可以重载,所以构造方法可以有多个
- 当我们一个构造方法都没写时,编译器会自动生成一个无参的构造方法,一旦你写了其他的构造方法,编译器将不再为你默认生成不带参数的构造方法
代码块
本地代码块(了解即可)
public static void main(){
{
//本地代码块
}
}
实例代码块(构造代码块)
class persion{
persion(){
//构造方法
}
{
//实例代码块
}
}
静态代码块
静态代码块和实例代码块的作用
- 用于初始化一些数据
- 若有多个静态代码块/或实例代码块 则按照顺序执行
- 静态的不依赖对象,实例的成员需要对象才能被执行
class persion{
static{
/*
静态代码块(不会依赖对象)
执行顺序:
静态代码块先执行 -》实例代码块-》构造方法
与书写顺序无关
静态代码块只会在第一次调用构造方法时执行
*/
}
}