Java之类和对象
一.类
1.类的定义
类是指对一个对象的特征进行描述。
2.类的形式
在java中定义一个类,需要用到class关键字,首先需要一个类名,类里面含有成员方法和成员变量。
这里简单写一个有关时间的类
class Date{
public int year;
public int month;
public int day;
public void print(int year,int month,int day){
System.out.print(this.year+"年"+this.month+"月"+this.day+"日");
}
类名为Date
类里面有成员变量year,month,day.成员方法print.
3.类的实例化
什么是类的实例化:用户自己定义了一个类,就相当于定义了一个新的类型和java自带的int,double类型是一样可以用来定义变量的,这个定义变量的过程就叫做类的实例化,在java中常用new关键字,配合类名来实例化对象。
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
Date date=new Date();
date.setDate(2025,2,4);
date.print();
}
}
class Date {
int year;
int month;
int day;
public void setDate(int year,int month,int day){
this.year=year;
this.month=month;
this.day=day;
}
public void print(){
System.out.println(this.year+"年"+this.month+"月"+this.day+"日");
}
}
如上图码:用Date类实例化了一个对象date。
用new关键字来创建一个对象。
用.来访问对象里面的成员。
同一个类可以创建多个实例。
4.this引用
上面的代码,我们可以看到有一个陌生的身影——this.
this引用指向当前对象(成员在运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。
this引用的特性:
(1):this的类型是对象类类型的引用,即那个对象调用就是哪个对象的引用类型。
(2):this只能在成员方法中使用。
(3):在成员方法中,this只能引用当前对象,不能引用其他对象。
(4):this是成员方法第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责接收。
5.构造方法
构造方法的作用:对对象中的成员进行初始化并不负责给对象开辟空间。
构造方法的特性:
(1):构造方法的名字必须与类名相同。
(2):构造方法没有返回值类型,设置为void也不行。
(3):创建对象(new一个对象)时由编译器自动调用,并且在对象的生命周期内只调用一次。
(4):构造方法可以重载(名字相同,参数列表不同)。
(5):如果用户没有显示定义,编译器会自动生成一份默认的构造方法,生成的默认的构造方法是无参的,一旦用户定义,编译器则不再生成。
(6):构造方法中,可以通过this调用其他构造方法来简化代码。this语句必须为代码块的第一条语句。
public Date(int year,int month,int day){
this.year=year;
this.month=month;
this.day=day;
}
public Date(){
this(2025,2,4);
}
构造方法Date中的this调用的就是含有三个参数的构造方法,简化了其代码。
注意:调用其他构造方法是不能成环,解释如下:
public Date(int year,int month,int day){
this();
this.year=year;
this.month=month;
this.day=day;
}
public Date(){
this(2025,2,4);
}
6.初始化
局部变量需要先初始化才能使用,否则会报错,为什么成员变量不需要呢?
这里我们就需要来讨论一下new关键字了。
Date date=new Date;
在JVM层面,运行该语句后会
(1):检测对象对应的类是否加载了,如果没有加载则加载。
(2):为对象分配内存空间。
(3):处理并发安全问题 比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突。
(4):初始化所分配的空间,对象空间申请好了之后,对象中包含的成员已经设置好了初值。具体的类型的初值如下:
(5):调用构造方法,给成员变量赋值。
二.封装
1.封装的概念
将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
2.访问限定符
Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符:
3.包
包的概念:将多个类收集称为一组,记为包。
在同一个工程中,允许存在相同名称的类,只要在不同的包中即可。
java中已经提供了很多的类供我们使用,例如Date类,可以使用java.util.Date导入java.util包中的Date类。
以下是两种使用包中的类的调用方法:
import java.util.Date;
public class Test1 {
public static void main(String[] args) {
Date date=new Date();
java.util.Date date1=new java.util.Date();
}
}
在编译器中我们也可以自定义包:
三.代码块
1.静态代码块
static{
一般用于初始化静态成员变量,定义在类里面,方法外面。
}
2.非静态代码块(实例代码块或构造代码块)
{
定义在类里面,方法外面,可以用来初始化成员变量。
}
3.普通代码块
import java.util.Date;
public class Test1 {
public static void main(String[] args) {
Date date=new Date();
{
int a=10;
System.out.println(a);
}
int a=100;
System.out.println(a);
}
}
运行结果:
10
100
由此可知,普通代码块内定义的变量只在代码块内存在。
代码块运行顺序:静态代码块优先于构造代码块优先于构造方法。