类的定义
类的定义:
类 是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等), 哪些功能(用来干啥),
描述完成后计算机就可以识别了
// 创建类
class ClassName{
field; // 字段(属性) 或者 成员变量
method; // 行为 或者 成员方法
}
类中包含的内容称为类的成员。
属性主要是用来描述类的,称之为类的成员属性或者类成员变量。
方法主要说明类具有哪些功能,称为类的成员方法。
ps:类名注意采用大驼峰定义
构造方法
构造方法:1.类中的构造方法必须和类名相同,(alt+insert快捷生成)
2.没有返回值类型(不等于Void)
3.构造方法可以重载,在产生对象时,由编译器自动调用构造方法产生对象,
4.并且在整个对象的生命周期内只调用一次
作用:产生对象,对类的属性进行初始化赋值
注意事项:
自己定义过构造函数,编译器不再产生默认的无参构造。若要使用,需要自己定义无参构造
若没有自己定义,编译器自己生成默认的无参构造。
构造方法调用时背后内存的变化情况--->JVM运行细节
a)JVM会判断当前要产生的Student对象所在的Student类是否被加载到JVM中(Student.class),若还没加载,
先加载类(Student.class)
b)new关键字,先分配对象的内存空间 (到底开辟多大,要看这个对象内部包含具体成员变量有多少,
就开辟多大空间)
c)处理并发线程安全问题(JVM考虑多线程问题)
d)为分配的空间进行属性初始化操作
this关键字
this 关键字 :
1.修饰属性 表示类中的成员变量
this.属性名
2.修饰方法
a)this.方法名
b)this()表示调用类中的构造方法
①this调用构造方法必须放在构造方法的首行调用
②对构造方法的调用比可以成环装,必须是线性
3.表示当前对象的引用
当前是通过哪个对象调用的属性和方法,就表示那个对象
static 关键字
无论static修饰的是啥,看见static,和对象无关,属于类固有的作用域既有属性也有方法
1.static修饰类中的属性,称之为类的静态属性/类属性!存储在JVM方法区
类中所有常量和静态变量放在方法区,共享同一个方法区
直接使用类名称访问静态变量和常量
在方法中不可以定义静态变量
2.static修饰类中的方案,称之为类方法,和对象无关,只能直接使用类中的静态方法和静态属性
3.不能直接作用于外部类,可以修饰内部类
程序就近原则
从调用处向上寻找最近的同名变量使用
对象的定义
对象:定义了一个类,就相当于在计算机中定义了一种新的类型,用类类型创建对象的过程,称为类的实例化,
实例化出来的就是对象
ps:
1.new 关键字用于创建一个对象的实例.
2.使用 . 来访问对象中的属性和方法.
3.同一个类可以创建对个实例.
访问修饰符
访问修饰符:
java中有4个关于权限的关键字:权限从小到大:
private(当前类的内部可见)
< default(咱们不要写,默认访问权限,当前包内部可见,子包不可见)
< protected(继承访问权限,在不同包的父子类之间可见
< public (公共访问权限,随意使用完全公开)
private不可以修饰外部类,类是创建对象的模版,定义private则不可以实例化对象,没有意义
但是可以修饰内部类,成为所有内部类
代码块
直接用{}括起来的代码,称之为代码块
在java中根据代码块出现的位置以及关键字不同,分为四种:
1.普通代码块
在方法中(成员/静态都可)直接使用 {}
普通代码块定义的局部变量,出了作用域{}就会被销毁
解决方法中局部变量名称相同的情况
2.构造快
直接在类中,不加任何关键字,直接使用{}
构造块优先于构造方法执行,
每当产生该类对象时,就会调用一次构造块
在编译后的class文件,会将说有的构造代码块和构造方法合并在一起,而且构造代码块会写在构造方法之上
无论是构造方法还是构造块,都是为了初始化对象
3.静态块
直接定义在类中,使用static修饰的代码块
在类加载时执行,和对象无关,无论有多个对象产生,都 只 会执行一次,优先于构造块(构造方法)
在主类中的静态块,优先于主方法 执行
为了类中的静态变量的初始化,以及一些类加载信息(SpringIoc容器)
4.同步代码块
在定义方法中使用关键字sychronized修饰的代码块
导包相关
包访问权限 当前一级文件夹可见
java中类的全程是包名.类名,用package声明,可以在 不同的包声明 同名的类
包的导入:
1.全名使用类 : java.util.Date date = new Date();
2.import 导入某个包中的某个具体类,无法直接导入一个文件夹 :import java.util.Date;
使用一个包下的多个类,则使用 * 通配符,导包
不是一次性全部导进去,而是需要那个导那个
import java.util.*
使用通配符 ,如果同一个类中使用多个不同的包的同名类,就会冲突
出现这种情况则需要 显示导入 包名.类名
静态导入:
import static java.lang.Math.*;
将Math这个类的所有静态方法属性都导入,再使用方法就直接调用方法名
JDK常见的包:
1.java.lang 系统常用的基础类:String,Object,Math,JDK1.1之后自动导入
2.java.lang.reflect反射开发包
3.java.util java提供的开发工具包.集合类,Scanner
4.java.sql 数据库开发相关
5.java.io io开发包(文件)
6.java.net 网络编程开发包
使用类来定义洗衣机
public class WashMachine {//使用class关键字定义类
//属性:
//品牌
public String brand;
//型号
public String type;
//重量
public double weight;
//长宽高
public double length;
public double width;
public double height;
//颜色
public String color;
//方法:
//洗衣服
public void washClothes() {
System.out.println("Washing clothes...");
}
//甩干
public void dryClothes() {
System.out.println("Drying clothes...");
}
//定时关闭
public void closeTime(int time) {
System.out.println("delay a " + time + " will close machine");
}
}