1. 面向对象的初步认知
Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆对象,面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情
面向对象与面向过程的区别:
面向对象:注重的是对象(结果)(1.找对象 2.创建对象 3.使用对象),如像洗衣服注重的只有洗衣机,衣服和洗衣粉几个对象是如何交互完成工作的,而不注意是怎么洗的
面向过程:注重的是过程,如洗衣服时洗衣服的过程必须每个环节都在,少一个环节都不行,按照这种方式写代码,将来扩展或维护起来会很麻烦
2. 类定义和使用
对象是一个真正存在的实体,而类是用来描述一个对象的(Java中一切皆对象)
类也叫类型,即自定义类型(相当于C语言中的结构体),类名相当于一个类型,可以用来定义一个变量
class dog{//dog是类名
public int num;
public String name;//num和name叫做字段或属性或成员变量
public void bark(){
System.out.println(name + "在叫");//bark方法叫做成员方法或行为
}
}
上述代码中 定义类需要用到class关键字,dog为这个类的类名(类名用大驼峰形式),{ }中为类的主体,字段定义在类内方法外
注意事项:
- 类名用大驼峰形式
- 一般一个文件中只定义一个类
- main方法所在的类一般要使用public修饰(因为Eclipse[ 像idea这样的开发软件 ]默认会在public修饰的类中找main方法)
- public修饰的类必须要和文件名相同
- 不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改(在idea中修改public修饰的类的类名过程如下)
3.类的实例化
定义了一个类,就相当于在计算机中定义了一种新的类型,可以用类型来创建对象。==用类型来创建对象的过程,称为类的实例化。==在Java中配合new关键字实例化对象(new关键字可以在堆中为对象分配内存空间)
dog d1 = new dog();//类的实例化
局部变量在方法中,局部变量在使用前要初始化,不初始化会报错
那么类在实例化之后类中的成员变量需要初始化吗?
答案是不用。成员变量是定义在类中的,方法之外的,所以不是局部变量,没有初始化也不会报错
成员变量会有一个默认值,遵循以下规则
1.引用类型默认为null
2.基本数据类型默认为相应的0值
可以通过对象的引用(在栈上的地址)去访问对象的成员变量和成员方法,用 . 号
class dog{//dog是类名
public int num;
public String name;//num和name叫做字段或属性或成员变量
public void bark(){
System.out.println(name + "在叫");//bark叫做成员方法或行为
}
}
public class May_21 {
public static void main(String[] args) {
//int a;//报错
int a = 0;
dog d1 = new dog();
d1.bark();
}
}
上述代码中,d1是实例化的对象,d1.bark 和 d1.bark 是通过对象的引用来访问类中的成员变量,如下图当d1.name没有初始化时,默认值为null
但是如果给d1.name初始化则会变成下图
d1.name = "A";//d1.name初始化
总结:
- new关键字用于创建一个对象的实例
- 使用 . 访问对象中的成员变量和成员方法
- 同一个类可以创建多个实例(上述代码有d1,则还可以创建d2,d3,d4等别的实例)
4.this引用
为什么要有this引用
让我们先看一个日期类
class Date{
int year;
int month;
int day;
public void setDate(int year, int month, int day){
year = year;
month = month;
day = day;
}
public void printDate(){
System.out.println(year + "年 " + month + "月 " + day + "日 ");
}
}
public class May_21 {
public static void main(String[] args) {
Date date = new Date();
date.setDate(2024,5,21);
date.printDate();
}
}
当我们用main函数将年月日打印出来,当形参名不小心与成员变量名相同时会发现年月日都是默认值0
为什么呢?
原因:此 setDate 方法中的 year month day 都是局部变量,当局部变量和成员变量相同时,局部变量优先使用,导致此处的 year month day 自己给自己赋值,并没有修改到形参的值,year month day 都是默认值
解决方法:this.
当我们加上this. 时会发现year month day 可以打印出来了
class Date{
int year;
int month;
int day;
public void setDate(int year, int month, int day){
year = year;
month = month;
day = day;
}
public void printDate(){
System.out.println(year + "年 " + month + "月 " + day + "日 ");
}
}
public class May_21 {
public static void main(String[] args) {
Date date = new Date();
date.setDate(2024,5,21);
date.printDate();
}
}
什么是this引用
this引用指当前对象的引用(this引用的是调用成员方法的引用),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成
this引用的特性
- this引用的是调用成员方法的引用,像在上面有this的Date类代码中,this指的是date这个引用
- this只能在"成员方法"中使用,注意:this不能在静态方法中使用
- this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收
- 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
this的三种用法
- 访问当前对象的成员变量
- 访问当前对象的成员方法
- 访问当前对象的其他构造方法(用this(参数)来访问)