目录
1.面向对象
在程序中使用对象映射现实中的事物,使用对象的关系描述事物之间的联系。
面向对象是解决问题的一种思想,主要依靠对象之间的交互来完成一件事情。
特点:封装性、继承性、多态性。
2.类的定义和使用
2.1类的定义
类是对象的抽象,用于描述一组对象的共同特征和行为。
例如:学生是一个类,而具体的一个学生就是类的对象。
//创建类
class 类名{
成员变量;
成员方法;
}
class为定义类的关键字,{ }为类的主体。
成员变量:用来描述对象的属性。(例:学生的姓名年龄……)
成员方法(方法):用来描述对象的方法。(例:学生看书打篮球……)
局部变量和成员变量的不同:
在Java中,定义在类中的变量称为成员变量,定义在方法中的变量称为局部变量。如果局部变量和成员变量同名(是可以的),但是在此时,在方法中通过变量名访问到的是局部变量,而非成员变量。
class Student{ public int age = 10;//成员变量 void read(){ int age = 20; //局部变量 System.out.println(age);//输出为20 } }
2.2类的使用
定义一个学生类
学生 名字
年龄
读书
玩篮球
class Student{ //成员变量 学生的属性 public String name;//名字 public int age;//年龄 //成员方法 学生的方法 public void read(){ System.out.println(name+"正在读书"); } public void playBasketball(){ System.out.println(name+"玩篮球"); } }
tip:
1.类名要采用大驼峰的形式,方法名要采用小驼峰的形式。
2.此处写的方法不需要带static关键字。
3.一般一个文件中只定义一个类。
4.main方法所在的类一般要使用public修饰。
5.public修饰的类必须要和文件名相同。
6.同一级目录下,类名是不可以重复的
3.类的实例化
3.1什么是类的实例化
定义一个类,就相当于在计算机中定义了一种新的类型。
用类类型创建对象的过程,称为类的实例化。
tip:
1.在Java中,采用new关键字,配合类名来实例化对象。
2.使用 . 来访问对象中的属性和方法。
3.同一个类可以创建多个实例。
3.2类和对象的说明
1.引用是不可以指向引用的。引用只能指向对象。
Student stu1 = new Student(); Student stu2 = stu1; //两个引用指向的都是一个对象, // stu2指向的是stu1这个引用所指向的对象。
2.一个引用不能同时指向多个对象。
Student stu3 = new Student(); stu3 = new Student(); stu3 = new Student(); stu3 = new Student(); //最终stu3这个引用只能存储一个对象的地址。
3.Student stu4 = null;指的是这个引用指向一个null对象(X)。这个指的是stu4这个引用不指向任何对象。
Student stu4 = null;
3.3交换两个数
基本类型无法交换两个数,所以要用引用类型来交换两个数
class MyValue{ public int number; } public class Change { public static void swap(MyValue num1,MyValue num2){ int tmp = num1.number; num1.number = num2.number; num2.number = tmp; } public static void main(String[] args) { MyValue num = new MyValue(); num.number = 10; MyValue num1 = new MyValue(); num1.number = 20; System.out.println("交换前:"+num.number+" "+num1.number); swap(num,num1); System.out.println("交换后:"+num.number+" "+num1.number); } }
图解:
tip:执行完swap()之后,就完成了交换,也就从栈上销毁了。
4.this引用
4.1为什么要有this引用
如果形参名和成员变量名重复了,那函数体中到底是给谁赋值呢,成员变量给成员变量,成员变量给参数,参数给成员变量?会弄不清楚的。
public class Test { public int goods; public int price;//局部变量会优先使用 public Test(){ } public void setPrice(int price,int goods) { price = price; goods = goods;//没有赋值成功,只是给自己(形参)赋值了 } public void printPrice(){ System.out.println(price+" "+goods);//局部变量会优先使用,所以最后的结果是0 0 } public static void main(String[] args) { Test t1 = new Test(); t1.setPrice(10,20); t1.printPrice(); } }//结果是0 0
为了避免这种情况,我们要把指定的price和goods设置为当前对象的price和goods,所以有了this引用。
4.2什么是this引用
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。
public class Test { public int goods; public int price; //构造方法,与类名相同 public Test(){ } public void setPrice(int price,int goods) { this.price = price; this.goods = goods;//把形参赋值给当前对象的price和goods } public void printPrice(){ System.out.println(this.price+" "+this.goods); } public static void main(String[] args) { Test t1 = new Test(); Test t2 = new Test(); t1.setPrice(10,20); //谁调用当前方法(setPrice),谁就是this t1.printPrice(); t2.setPrice(20,30); t2.printPrice();// } }//结果是10 20 //20 30
4.3this引用的特性
this的三种使用方法:
1.this.成员变量 访问成员变量。2.this.func() 访问当前类的构造方法。
3.this()调用当前类的构造方法。(5.2中会有讲解)
tip:
1.this的类型:
2.this只能在成员方法中使用
3.在成员方法中,this只能引用当前对象,不能再引用其他对象。
4.this是成员方法中第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收。(Test this可以省略)
public void setPrice(Test this,int price) { this.printPrice();//访问当前类的构造方法 this.price = price;//访问成员变量 } public void printPrice(Test this){ System.out.println(this.price); }
5.对象的构造及初始化
5.1如何初始化一个对象
对象的产生:1.为对象分配内存 2.调用合适的构造方法
Test t1 = new Test();
5.2构造方法
概念:名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的声明周期内只调用一次。
tip:
1.没有返回值类型,设置为void也不行。
2.一般情况下使用public修饰
3.构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
4.构造方法可以重载(名字相同,参数列表不同)
public class VendingMachine { public int price; //构造方法,与类名相同 public VendingMachine(){ } //方法重载 public VendingMachine(int price){ this.price = price; } public static void main(String[] args) { VendingMachine vm = new VendingMachine(); //构造方法的调用是发生在实例化对象的时候 //对象的初始化一定会调用构造方法。 } }
tip:如果没有定义构造方法,编译器会生成一份默认的无参构造方法,如果定义了构造方法,编译器就不会再生成默认的无参构造方法。(任一个构造方法,实例化一个对象都会调用合适的方法)
构造方法生成的快捷键:
构造方法中可以通过this调用其他构造方法来简化代码。
public class Test { public int price; //构造方法,与类名相同 public Test(){ //必须是构造方法中的第一条语句 this(10); } //方法重载 public Test(int price){ this.price = price; } public void print(){ System.out.println(this.price); } }
5.3默认初始化
为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?
因为对象空间被申请好之后,对象中包含的成员已经设置好了初始值
数据类型 默认值 byte 0 char '\0000' short 0
int 0 long 0L boolean false float 0.0f double 0.0 reference null
5.4就地初始化
在声明变量的时候,就直接给出了初始值。
public int price=10;