1、什么是面向对象?
**面向对象是一种解决问题的思想。**主要依靠对象和对象之间交互完成某个事情。
(对象一般是抽象对象,比如人,衣服,洗衣机,难点在于对对象的理解,多做题和实践)
面向对象最重要的就是对象,难点在于:
1、找对象 (对象从何而来,为什么产生)
2、创建对象
3、使用对象
2、面向对象与面向过程
比如 你自己买手机 需要你自己设计一个过程自己完成,而面向对象相当于你有一个秘书,你直接告诉秘书我想换手机,秘书就会帮你去下单,取快递,然后你用
而需要注意的是面向过程和面向对象并不是一门语言,而是解决问题的一种方法或者思想,没有好坏,只有特定的应用场景。
3、类定义和使用
知道对象前需要知道类。
1、从语法上来说,是使用class关键词来定义类的;
2、对象是现实生活中的实体,而类是抽象的;
3、类就是用来描述某个对象的
class 类名
{
字段/属性
方法/行为
}
例如:
class WashMachine //类名 采用大驼峰更好
{
public String brand; //定义字段或属性
public String type;
public double weight;
public double lenght;
public double height;
public double color;
public void washClothes() //定义方法、功能或行为
{
System.out.println("洗衣功能");
}
public void dryClothes()
{
System.out.println("脱水功能");
}
public void setTime()
{
System.out.println("定时功能");
}
}
> 属性/字段还有方法/功能/行为都属于类的信息。
类相当于图纸,对象相当于房子,通过类可以产生一个对象。
注意事项:
1、一般一个文件当中只定义一个类,不定义多个;
2、main方法所在的类一般要使用public修饰(注意:Eclipse默认会子啊public修饰的类中找main方法);
public static void main(String[]args)
{
System.out.println("xiyiji:main");
}
3、public修饰的类必须要和文件名相同;
4、不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改。
类也可以叫做类型,如上自己定义了类型叫洗衣机
public class java
{
public static void main(String[]args)
{
WashMachine ok=null; //此时ok就是一个变量,是WashMachine类型
}
}
定义了一个类,就相当于在计算机中定义了一种新的类型,与int和double类似,但int和double是java语言自带的类型,而类是用户自定义的新的类型。
4、类的实例化
4.1、什么是实例化?
由自定义的类型产生的对象的过程,叫做实例化。除此之外,实例化也是一种套用自定义类模板的方法。
4.2、如何实例化一个对象?
使用new实例化一个洗衣机(WashMachine)对象:
WashMachine ok=new WashMachine();
//通过new关键字来实例化一个WashMachine对象
同一个类也可以创建多个实例,实例化出的对象,占用实际的物理空间,存储类成员变量。
类是抽象的概念,对象才是真正的实体。
通过对象的引用,可以访问和修改对象中的成员/属性:
这个类里面有brand,type,weight,lenght,height,color这几个属性。如何访问引用的对象里的属性?
如:
System.out.println(ok.brand); //通过【类名.成员/方法】来访问对象
能访问对象里的属性(如brand)也可以赋值:
ok.brand="立白"; //将属性brand赋值为立白
4.3、属性/字段
1、普通的成员属性/普通的成员变量;
例:
public double weight;
2、静态的成员属性/静态的成员变量。
例:
public static double color; //static
3、这些属性字段在堆上,属性是定义在方法/功能的外面,类的里面,是成员变量。如果再在方法/功能里定义一个变量,它是一个局部变量。
4、对于成员变量来说,在未赋值的情况下,调用类中的成员,输出为默认值,其中,引用类型都为null,
简单类型[4种整数类型(byte、short、int、long),2种浮点类型(float、double),1种字符类型“char”,1种布尔类型“boolean”]都是对应的0值,如下。
int -> 0
float 0.0
long 0L
布尔类型boolean false
char ‘\u0000’
5、this引用
5.1为什么要有this引用?
对于以下代码:
public class MyDate
{
public int year;
public int month;
public int day;
public void setDay(int y,int m,int d) //局部变量,局部变量优先
{
year=y;
month=m;
day=d;
}
public void printDay()
{
System.out.println(year+"-"+month+"-"+day);
}
public static void main(String[]args)
{
MyDate myDate=new MyDate();
myDate.setDay(2022,2,27 );
myDate.printDay();
MyDate myDate2=new MyDate();
myDate2.setDay(2022,2,22 );
myDate2.printDay();
}
}
该代码能够顺利编译成功,但如果遇到以下几个问题:
(1)形参名与成员变量名相同:
public void setDay(int year,int month,int day) //局部变量,局部变量优先
{
year=year;
month=month;
day=day;
}
根据局部变量优先原则,方法中的year都为方法的参数year,编译无法通过,需要通过this来调用类中的成员变量
public void setDay(int year, int month, int day)
{
this.year = year; //此时year就代表当前对象的year
this.month = month;
this.day = day;
}
(2)当两个对象都在调用方法setDay和printDay时,函数不能确定打印的是那个对象的数据,此时需要this来确定打印对象
public void printDay()
{
System.out.println(this.year+"-"+this.month+"-"+this.day);
}
5.2 什么是this引用?
java编译器给每个“成员方法”增加了一个隐藏的引用类型参数(this),该引用参数指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。
public class MyDate
{
public int year;
public int month;
public int day;
public void setDay(int year,int month,int day)
//局部变量,局部变量优先,除此之外setDay和printDay都是成员方法
{
this.year=year;
this.month=month;
this.day=day;
}
public void printDay()
{
System.out.println(this.year+"-"+this.month+"-"+this.day);
}
}
this引用的是调用成员方法的对象。
public static void main(String[]args)
{
MyDate myDate=new MyDate();
myDate.setDay(2022,2,27 );
myDate.printDay();
}
this引用的特性:
1、this的类型:哪个对象调用就是哪个对象的引用类型;
2、this只能在成员方法中使用;
3、在“成员方法”中,this只能引用当前对象,不能引用其它对象,具有final属性;
4、this不可以为空。
this的三种用法:
1、this.成员变量(成员变量不能是静态的)
2、this.成员方法(成员方法不能是静态的)
3、this()调用其他的构造方法(必须放在第一行)
6、什么是构造方法?
构造方法是一个特殊的成员方法。
1、没有返回值类型,设置为void也不行;
2、方法名字需要和类名是一样的;
3、一般情况下使用public修饰;
4、在创建对象时,编译器自动调用,且在整个对象的生命周期内只调用一次。
public class MyDate
{
public int year;
public int month;
public int day;
public MyDate(int year,int month,int day)
//方法名与类名相同,public修饰
{
this.year=year;
this.month=month;
this.day=day;
System.out.println("MyDate(int,int,int)方法被调用了");
}
public void printMyDate()
{
System.out.println(year+"-"+month+"-"+day);
}
public static void main(String[]args)
{
//此处创建了一个MyDate类型的对象,并没有显式调用构造方法
MyDate d=new MyDate(2022,2,28);
//输出MyDate(int,int,int)方法被调用了
d.printMyDate(); //2022-2-28
}
}
未完待续…