目录
一. 面向对象的初步认知
1.1 什么是面向对象
1.2 面向对象与面向过程


二. 类定义和使用

2.1 简单认识类
2.2 类的定义格式
// 创建类class ClassName {field ; // 字段 ( 属性 ) 或者 成员变量method ; // 行为 或者 成员方法}
class WashMachine {//成员变量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 ( " 洗衣功能 " );}public void dryClothes (){ // 脱水System . out . println ( " 脱水功能 " );}public void setTime (){ // 定时System . out . println ( " 定时功能 " );}}
再如:
class PetDog {// 狗的属性public String name ; // 名字public String color ; // 颜色// 狗的行为public void barks () {System . out . println ( name + ": 旺旺旺 ~~~" );}public void wag () {System . out . println ( name + ": 摇尾巴 ~~~" );}}
1. 类名注意采用大驼峰定义2. 成员前写法统一为 public ,后面会详细解释3. 此处写的方法不带 static 关键字 . 后面会详细解释4. 一般一个文件当中只定义一个类5. main方法所在的类一般要使用public修饰(注意:Eclipse默认会在public修饰的类中找main方法)
6. public 修饰的类必须要和文件名相同7. 不要轻易去修改 public 修饰的类的名称,如果要修改,通过开发工具修改 。
这样的方式修改,文件名会修改,类名也会被修改.但,如果在一个文件中有多个类,此时通过上述方法修改,文件名会修改,但类名不会被修改,需要手动找到public修饰的类,并修改类名.8. 同级目录底下,类名不能重复. 即在src下创建多个.java文件,所有类名不能重复
三. 类的实例化
3.1 什么是实例化
定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自带的内置类型,而类是用户自定义了一个新的类型,比如上述的:WashMachine类,它们都是类(一种新定义的类型)有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)。
public static void main ( String [] args ) {PetDog dog1 = new PetDog (); // 通过 new 实例化对象dog1 . name = " 阿黄 " ;dog1 . color = " 黄色 " ;dog1 . barks ();dog1 . wag ();PetDog dog2 = new PetDog ();dog2 . name = " 阿黑 " ;dog2 . color = " 黑色 " ;dog2 . barks ();dog2 . wag ();}
注:只要new 就会产生新的对象, 只要是新的对象, 就有新的内存.只需要通过对象的引用, 去访问对象的成员变量或成员方法即可.
3.2 类和对象的说明
探讨四个问题:
1. 引用可以指向引用吗?
不可以,引用只能指向对象
例:
上述代码:dog2这个引用指向了dog1这个引用所指向的对象, 两个引用同时指向一个对象,而不是指向了dog1这个引用
2.一个引用能不能同时指向多个对象?
不可以
最终dog1这个引用 只能存储一个对象的地址
3. 这代表dog2这个引用指向一个null对象?
错误,这代表dog2这个引用不指向任何对象.
4.如何交换两个数据?
思考:如果只是简单的局部变量, 存储在栈上,是没办法交换数据的, 所以一定要将数据存储在堆上,才能做到交换数据,不难想到要用引用类型变量.
完整代码如下:
public class Test2 {
public static void swap(MyValue val1,MyValue val2){
int tmp=val1.val;
val1.val=val2.val;
val2.val=tmp;
}
public static void main(String[] args) {
MyValue num1=new MyValue();
num1.val=10;
MyValue num2=new MyValue();
num2.val=20;
System.out.println("交换前:"+num1.val);
System.out.println("交换前:"+num2.val);
swap(num1,num2);
System.out.println("交换后:"+num1.val);
System.out.println("交换后:"+num2.val);
}
}
执行结果:
四. this引用
4.1 为什么要有this引用
public class Date {
public int year;//年
public int month;//月
public int day;//日
public void setDate(int y,int m,int d) {
year = y;
month = m;
day = d;
}
public void printDate() {
System.out.println("年:"+year+" 月:"+month+" 日:"+day);
}
public static void main(String[] args) {
Date date = new Date();
date.setDate(1945,9,1);
date.printDate();
}
}
上述代码,可以对date进行赋值.
如果:局部变量与成员变量命名相同时:则赋值失败.
原因:根据局部变量优先使用原则,此时等号左右两边的变量都是局部变量.
那么如果想要使用成员变量,则需要引入this.
4.2 什么是this引用

4.3 this引用的特性
public void setDate(int year,int month,int day) {
this.year = year;
this.month = month;
this.day = day;
}
public void printDate() {
System.out.println("年:"+this.year+" 月:"+this.month+" 日:"+this.day);
}
public static void main(String[] args) {
Date date1 = new Date();
date1.setDate(1945,9,1);
date1.printDate();
Date date2 = new Date();
date2.setDate(2023,10,1);
date2.printDate();
}
结果为

5.建议:习惯使用this,无论有无作用
总结:
1. this.成员变量 ---访问成员变量
2. this.成员方法 ---访问当前的成员方法
3. this() ---调用当前类的构造方法(后面会讲)
五. 对象的初始化
5.1 默认初始化



5.2 就地初始化
在声明成员变量时,就直接给出了初始值。 只要是new了一个对象,那么就有就地初始化的值.
结果为:
六.构造方法
6.1 概念
6.2 特性
public class Date {
public int year;//年
public int month;//月
public int day;//日
//构造方法
public Date(){
this.year=1988;
this.month=1;
this.day=1;
System.out.println("执行了一个不带参数的构造方法");
}
public static void main(String[] args) {
Date date = new Date();
}
结果:
由上述代码,我们得出结论:
1. 当new了一个对象,就会调用构造方法
2.创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
3. 构造方法至少有一个, 也就是说, 当你没有写任何构造方法时, 编译器/java会自带一个不带参数的构造方法, 只不过默认的这个构造方法没有具体的实现任何功能.
注意: 一旦用户定义了任意一种构造方法,编译器则不再生成不带参数的构造方法。public class Date { public int year; public int month; public int day; public Date(int year, int month, int day) { this.year = year; this.month = month; this.day = day; } public static void main(String[] args) { Date d = new Date(); } }
结果:
public class Date {
public int year;//年
public int month;//月
public int day;//日
//构造方法
public Date(){
this.year=1988;
this.month=1;
this.day=1;
System.out.println("执行了一个不带参数的构造方法");
}
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
System.out.println("带有三个参数的构造方法");
}
public static void main(String[] args) {
Date date = new Date();
Date date2 = new Date(1988,12,1);
结果:
4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法) ,所以可以用构造方法对对对象进行初始化.
小总结:
对象的产生简单来说 一定有2步:
1. 为对象分配内存.
2. 调用合适的构造方法.
小tips:
IDEA编译器运用快捷键可以自动写构造方法:
(鼠标右键)
(按住ctrl就可以随意选择想构造的变量的方法)
5. 构造方法中,可以通过this调用其他构造方法来简化代码
public class Date {
public int year;
public int month;
public int day;
public Date(){
this(1900, 1, 1);//必须放在第一行
//this.year = 1900;
//this.month = 1;
//this.day = 1;
}
// 带有三个参数的构造方法
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
}
注意:
1. this(...) 必须是构造方法中第一条语句2.不能形成环
错误:
6. 绝大多数情况下使用public来修饰,特殊场景下会被private修饰
对this的特性总结:
1. 当new了一个对象,就会调用构造方法
2.创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
3. 构造方法至少有一个, 也就是说, 当你没有写任何构造方法时, 编译器/java会自带一个不带参数的构造方法, 只不过默认的这个构造方法没有具体的实现任何功能.
注意:一旦用户定义了任意一种构造方法,编译器则不再生成不带参数的构造方法。