目录
目录
1、面向对象
1.1.什么是面向对象
1.2面向对象与面向过程
1.2.1传统洗衣服过程
正如上图所示,传统的方式:注重的是洗衣服的过程,少了一个环节可能都不行。
1.2.2现代洗衣服过程
基本上现代洗衣服是依靠洗衣机来进行。
1.总共有四个对象:人、衣服、洗衣粉、洗衣机。
整个洗衣服的过程:人将衣服放进洗衣机、倒入洗衣粉,启动洗衣机,洗衣机就会完
成洗衣过程并且甩干。
整个过程主要是:人、衣服、洗衣粉、洗衣机四个对象之间交互完成的,人不需要关
新洗衣机具体是如何洗衣服的,是如何甩干的。
2、类定义和使用
2.1认识类
比如:洗衣机,它是一个品牌,在 Java 中可以将其看成是一个类别。属性:产品品牌,型号,产品重量,外观尺寸,颜色 ...功能:洗衣,烘干、定时 ....
2.2类的定义格式
定义类时需要用到class关键字
// 创建类class ClassName {field ; // 字段 ( 属性 ) 或者 成员变量method ; // 行为 或者 成员方法}
其中class为定义类的关键字,ClassName为类的名字,{}中为类的主体。
例:将洗衣机类在计算机中定义完成,经过javac编译之后形成.class文件,在JVM的基础上计算机就可以识别了。
class WashMachine{//类名采用大驼峰
public String brand; // 品牌
public String type; // 型号
public double weight; // 重量
public double lenght; // 长
public double weidth; // 宽
public double height; // 高
public String color; // 颜色
public void WashClothes(){ // 洗衣服
System.out.println("洗衣功能");
}
public void dryClothes(){ // 脱水
System.out.println("脱水功能");
}
public void setTime(){ // 定时
System.out.println("定时功能");
}
}
注意
- 类名注意采用大驼峰定义
- 成员前写法统一为public
- 此处写的方法不带 static 关键字
2.3定义一个狗类
class Dog{
//属性----》字段
public String name="阿黄";//属性在方法的外面,在类的里面-----》叫做成员属性
public int age=8;
public String color="黑色";//如果是静态成员变量需要加上static
public void eat(){//属性
System.out.println("吃饭!");
}
public void bark(){//行为
System.out.println("汪汪!");
}
}
注意事项:1. 一般一个文件当中只定义一个类2. main 方法所在的类一般要使用 public 修饰3. public 修饰的类必须要和文件名相同4. 不要轻易去修改 public 修饰的类的名称,如果要修改,通过开发工具修改5.当成员变量没有初始化的时候,他们的值都是默认值.
引用类型都是null,简单类型都是对应的0值.
3.类的实例化
3.1类的实例化
例:对于上面定义的狗类来说,用main方法在类中进行一个实例化对象
public static void main(String[] args) {
Dog dog=new Dog();//通过new关键字实例化一个对象
System.out.println(dog.name);//快捷键dog.name.sout---》阿黄
dog.name="旺财";
System.out.println(dog.name);//旺财
}
注意事项
- new 关键字用于创建一个对象的实例
- 使用 “.”来访问对象中的属性和方法.
- 同一个类可以创建多个实例.
3.2类和对象的说明
4.this引用
4.1this引用的缘由
对于如下一个日期类来说
public class MyDate {
public int year;
public int day;
public int month;
public void setDay(int y,int m,int d){
year=y;
day=d;
month=m;
}
public void printDay(){
System.out.println(year+"-"+month+"-"+day);
}
public static void main(String[] args) {
MyDate myDate=new MyDate();
myDate.setDay(2023,4,5);
myDate.printDay();
}
}
运行结果为
问题1:当形参名不小心与成员变量名相同时:
public void setDay ( int year , int month , int day ){year = year ;month = month ;day = day ;}
问题2:声明两个实例化对象时,调用的是哪一个方法
public static void main(String[] args) {
// 构造三个日期类型的对象 d1 d2
Date d1 = new Date();
Date d2 = new Date();
// 对d1,d2的日期设置
d1.setDay(2020,9,15);
d2.setDay(2020,9,16);
// 打印日期中的内容
d1.printDay();
d2.printDay();
}
4.2什么是this引用
如上图所示,this.year指的是public int year中的year,等式后面的year指的是局部变量中的
year
运行如下代码
public class MyDate {
public int year;
public int day;
public int month;
public void setDay(int year,int month,int day){
/**
* year=year;
* day=day;
* month=month;
*/
this.year=year;
this.day=day;
this.month=month;
}
public void printDay(){
System.out.println(this.year+"-"+this.month+"-"+this.day);
}
public static void main(String[] args) {
MyDate myDate=new MyDate();
myDate.setDay(2023,4,5);
myDate.printDay();
MyDate myDate1=new MyDate();
myDate1.setDay(2023,3,5);
myDate1.printDay();
}
}
运行结果为
this引用是编译器自动添加的,用户在实现代码时一般不需要显式给出。
注意: this 引用的是调用成员方法的对象 。
4.3this引用的特性
this有3种用法:
- this.成员变量(普通的成员变量不能是静态的)
- this.成员方法(普通的成员方法不能是静态的)
- this()调用其他的构造方法,必须放在第一行
5.对象的构造及初始化
5.1如何初始化对象
public static void main ( String [] args ) {int a ;System . out . println ( a );}// Error:(26, 28) java: 可能尚未初始化变量 a
public static void main(String[] args) {
Date d = new Date();
d.printDate();
d.setDate(2023,4,5);
d.printDate();
}
// 代码可以正常通过编译
5.2构造方法
public class MyDate {
public int year;
public int day;
public int month;
public MyDate(){
this(2023,4,4);//调用带有3个参数的构造方法,等打印完在进行下一行
System.out.println("不带参数的构造方法");
// this(2023,4,4);//报错,this在构造方法中调用其他的构造方法必须放在第一行
}
public MyDate(int year,int month,int day){
this.year=year;
this.day=day;
this.month=month;
System.out.println("带3个参数的构造方法");
}
public void setDay(int year,int month,int day){
this.year=year;
this.day=day;
this.month=month;
}
public void printDay(){
System.out.println(this.year+"-"+this.month+"-"+this.day);
}
public static void main(String[] args) {
MyDate myDate=new MyDate();
}
public static void main2(String[] args) {
//MyDate myDate=new MyDate();
MyDate myDate=new MyDate(2023,4,5);
}
public static void main1(String[] args) {
MyDate myDate=new MyDate();
myDate.setDay(2023,4,5);
myDate.printDay();
MyDate myDate1=new MyDate();
myDate1.setDay(2023,3,5);
myDate1.printDay();
}
}
一个对象的产生,最起码分为2步:(new......)
1、为对象分配内存
2、调用合适的构造方法(构造方法不止一个)
构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
当我们没有提供任何的构造方法的时候,编译器会帮我们提供一个不带参数的构造方法,也就是说,一个类至少有1个构造方法。
但是当类中写了两个构造方法时,删除了一个,还有一个构造方法时,此时系统不提供构造方法
5.3构造方法特性
当两个方法的方法名相同,参数类型不同时,构成了重载 ,如下图:
当调用不带参数的构造方法时:
当调用带3个参数的构造方法时: