一*相关的概念:
1.1.面向对象简述:
java是一门纯面向对象的语言(Object Oriented Program,继承OOP),在java面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要是要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对于事物的认知,对于大型程序的设计,扩展以及维护都非常友好。
三个基本特征:
(1)封装:保护内部的操作不被破坏,隐藏代码的实现细节;
(2)继承:在父类的基础之上继续在子类内部进行扩充;
(3)多态:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。
1.2.类的简述:
类是用来对对象进行描述的,它主要是描述这一类的对象共同的一些属性或者行为。
例1:创建类
public class Student{
int age;
String name;//字段(属性)或者成员变量
public void learning(){
System.out.println("正在学习");
}
public void playing(){//行为或者成员方法
System.out.println("正在玩耍");
}
}
class为定义类的关键字,Student为类名,{}中为类的主题。类中包含的内容称为类的成员。属性主要是是用来描述这个类,称为类的成员属性或者类的成员变量。方法主要是说明类具有哪些功能或者有哪些行为,称为类的成员的方法。
1.3.对象的简述:
当类创建好后,通过这个类去创建一个具有类的属性或者行为的实体,这个实体就是对象。
例2:创建对象
public class Student{
int age;
String name;//字段(属性)或者成员变量
public void learning(){
System.out.println("正在学习");
}
public void playing(){//行为或者成员方法
System.out.println("正在玩耍");
}
}
public class Test{
public static void mian(String[] args){
Student s1=new Student();//通过new实例化对象
Student s2=new Student();
s1.name="张三";
s1.age=21;
s1.learning();
s1.playing();
}
}
通过new关键字来实例化对象,即创建一个对象。使用 . 来访问对象中的属性和方法。同一个类可以创建多个对象。
二*类和对象的说明:
2.1.类是对象的模板。
2.2.对象是这个类的具体实现。
2.3.类是一种自定义的类型,可以用来定义变量。
2.4.实例化出的对象才能实际存储数据,占用空间。
三*对象的构造:
3.1.概念:
构造方法:是一个特殊的成员方法(也称为构造器)。名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象生命周期只调用一次。注意: 当没有自己显式定义一个构造方法时,编译器会自动提供一个默认的无参构造方法。但是当自己定义后,编译器就不会提供默认的无参构造方法。
例3:构造方法
public class Date{
public int year;
public int month;
public int day;
//无参的构造方法
public Date(){
this.year=2022;
this.month=6;
this.day=15;
}
//带有参数的构造方法
public Date(int year,int month,int day){
this.year=year; //this 表示对于当前的对象的引用
this.month=month;
this.day=day;
}
public void printDate(){
System.out.println(year+"-"+month+"-"+day);
}
public static void main(String[] args){
Date.date1=new Date();
date1.printDate();
Date.date2=new Date(2022,6,15);
date2.printDate();
}
}
这里如果没有自定义无参的构造方法,Date.date1=new Date();就会报错,因为此时有自定义有参的构造方法后,编译器不会默认提供无参的构造方法了。所以当实例化对象时,要注意是否有参数,如果同时存在有参和无参,这个时候就要自定义无参的构造方法了,不然就会报错。
例4.在构造方法中调用另一个构造方法:
public class Date{
public int year;
public int month;
public int day;
//无参的构造方法
public Date(){
this(2022,6,15) //this()调用另一个有参的构造方法
}
//带有参数的构造方法
public Date(int year,int month,int day){
this.year=year; //this 表示对于当前的对象的引用
this.month=month;
this.day=day;
}
public void printDate(){
System.out.println(year+"-"+month+"-"+day);
}
public static void main(String[] args){
Date.date1=new Date();
date1.printDate();
}
注意:this引用
1.this表示当前所实例化对象的引用,存了当前对象的地址,故this.+属性/方法可以访问到类中的成员变量和成员方法。
2.this只能在"成员方法"中使用,且只能引用当前的对象,不能引用其他的对象。
3.this(...)在构造方法中可以调用另一个构造方法,但是必须是在该构造方法中的第一条语句,其次不能形成闭环,即构造方法A与构造方法B相互调用。
显然上述的构造方法,由于方法名相同,参数列表不同,构成了方法的重载。
3.2构造方法的作用:
就是对对象中的成员进行初始化,但并不负责给对象开辟空间。
四*对象的初始化:
4.1.默认初始化:
成员变量在定义时,没有给初始值,编译器默认会初始化
例子5:默认初始化
public class Date{
public int year;//编译器默认为对应类型的0值
public int month;
public int day;
public Date(){
System.out.println(this.year);
System.out.println(this.month);
System.out.println(this.day);
}
public static void main(String[] args){
Date d=new Date();
}
}
4.2.就地初始化:
在声明成员变量时,就直接给出了初始值
例子6:就地初始化
public class Date{
public int year=2022;
public int month=6;
public int day=15;
public static void main(String[] args){
Date d = new Date();
System.out.println(d.year+"-"+d.month+"-"+d.day);
}
}
五*关于new这条语句,在JVM层面处理的过程:
5.1.检测对象对应的类是否加载了,如果没有加载则加载;
5.2.为对象分配内存空间;
5.3.处理并发安全问题;(比如多线程同时申请对象,JVM要保证给对象分配的空间不冲突)
5.4.初始化所分配的空间(即对象空间被申请好后,对象中包含的成员已经设置好了默认的初始的"0"值)。
5.5.设置对象头信息。
5.6.调用构造方法,给对象中各个成员赋值