4 面向对象
- 对象=属性+方法;
- 对象的规范=属性定义+方法定义。
4.1对象和类的概念
- 对象是一个变量;
- 类就是类型(是规范,是定义),从对象中抽取共性;
- 类规定了对象应该有的属性内容和方法;
- 对象是实例,是类的一个实现,是一个具体的东西。
4.2 Java类和对象
-
最简单的类 class A{} //没有任何属性和行为;
-
对象 A obj = new A();
例:int a = 5;==>等价为 int a = new int(5) 类型 变量名 = new 类型(参数)
注:A obj1 = new A();A obj2 = new A(); obj1和obj2是两个不同的对象,在内存中有不同的存放地址。
-
对象赋值是Reference 赋值,而基本类型是直接拷贝赋值
public class ReferenceTest { public static void main(String[] args) { int num1 = 5; int num2 = num1;//拷贝 System.out.println("num1: " + num1 + ", num2:" + num2);//输出5,5 num2 = 10; System.out.println("num1: " + num1 + ", num2:" + num2);//输出5,10 MyNumber obj1 = new MyNumber(); MyNumber obj2 = new MyNumber(); System.out.println(obj1.num);//5 System.out.println(obj2.num);//5 System.out.println("=====接下来输出新值====="); obj2 = obj1;//指向同一个数 obj2.num = 10;//改变指向的数 System.out.println(obj1.num);//10 System.out.println(obj2.num);//10 } }
public class ArgumentPassingTest { public static void main(String[] args) { int a=1,b=2; swap(a,b); System.out.println("a is " + a + ", b is " + b);//a=1,b=2 MyNumber obj1 = new MyNumber(); MyNumber obj2 = new MyNumber(); obj2.num = 10; swap(obj1,obj2); System.out.println("obj1 is " + obj1.num + ", obj2 is " + obj2.num);//a=1,b=2 } public static void swap(int m,int n) { //交换不了 int s = m;//拷贝赋值 m = n; n = s; } public static void swap(MyNumber obj3,MyNumber obj4) { //正常交换 int s = obj3.num;//指向 obj3.num = obj4.num; obj4.num = s; } }
-
函数内的局部变量,编译器不会给默认值,需要初始化后才可使用;类的成员变量,编译器会给默认值,可以直接使用。
public class Initialization
{
boolean v1;
byte v2;
char v3;
double v4;
float v5;
int v6;
long v7;
short v8;
public static void main(String[] args)
{
Initialization obj = new Initialization();
System.out.println(obj.v1);//false
System.out.println(obj.v2);//0
System.out.println(obj.v3);//'\u0000'
System.out.println(obj.v4);//0.0d
System.out.println(obj.v5);//0.0f
System.out.println(obj.v6);//0
System.out.println(obj.v7);//0L
System.out.println(obj.v8);//0
}
}
4.3构造函数(constructor function)
-
构造函数的名称必须和类名一样,且没有返回值
public class A { int id; public A(int id2)//构造函数 { id = id2; } } A obj = new A(10);调用构造函数复制id
-
Java有构造函数,但是没有析构函数(构造函数是制造对象的过程,析构函数是清除对象的过程)
-
Java提供了字自动回收机制JVM因此不需要析构函数来释放内存
-
每个变量都是有生命周期的,它只能存储在离它最近的一对{}中
public class LifeCycleTest { public static void main(String[] args) { int a = 0;//a在main函数中都是active for(int i=0;i<5;i++) //i只能活在for循环中 { int k = 0; k++; } if(a>0) { Object obj1 = new Object();//obj1只能在if分支中有效 System.out.println("a is positive"); } else { Object obj2 = new Object();//obj2只能在else分支中有效 System.out.println("a is non-positive"); } } }
-
当变量被创建时,变量将占据内存;当变量消亡时,系统将回收内存
-
每个Java类都必须由构造函数
-
如果没有显示定义构造函数,Java编译器会自动给该类产生一个空的无形参构造函数
class A{}//类 //编译器自动增加一个无参空的构造函数 class A() { public A() {}//无参构造函数 }
-
每个子类的构造函数的第一句话,都默认调用父类的无参数构造函数super(),除非子类的构造函数第一句话是super,而且super语句必须放在第一条。
-
一个类可以有多个构造函数,只要形参列表不相同即可(和函数重载类似,函数名相同,形参不同)
-
在new 对象的时候,会根据实参的不同,自动挑选相应的构造函数
class MyPairNumber { int m; int n; public MyPairNumber() { m = 0; n = 0; } public MyPairNumber(int a) { m = a; n = 0; } public MyPairNumber(int a,int b) { m = a; n = b; } } public class ConstructorTest { public static void main(String[] args) { MyPairNumber obj1 = new MyPairNumber(); MyPairNumber obj2 = new MyPairNumber(5); MyPairNumber obj3 = new MyPairNumber(10,20); System.out.println("obj1 has " + obj1.m + "," + obj1.n); System.out.println("obj2 has " + obj2.m + "," + obj2.n); System.out.println("obj3 has " + obj3.m + "," + obj3.n); } }
4.4信息隐藏和this指针
-
信息隐藏
类的成员属性,是私有的private;类的方法是公有public的,通过方法修改成员属性的值。
class InfoHiding
{
private int id;
public InfoHiding(int id2)//构造函数初始化参数
{
id = id2;
}
public int getId()
{
return id;
}
public void setId(int id2)
{
id = id2;
}
}
public class InfoHidingTest
{
public static void main(String[] args)
{
InfoHiding obj = new InfoHiding(100);
obj.setId(200);//通过方法修改类属性值
System.out.println(obj.getId());//200,不能写成obj.id(非法)
}
}
- VScode中快速为属性添加get和set方法
- 鼠标右击空白处—>点击源代码操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q9ivohf8-1596522966259)(https://i.loli.net/2020/08/04/OSfaec5zZGhKt4l.png)]
- 点击Generate Getters and Setters
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iPc7aAfy-1596522966263)(https://i.loli.net/2020/08/04/sYdOA5cupiwXteR.png)]
- 勾选需要添加get和set方法的属性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nua7IzhA-1596522966265)(https://i.loli.net/2020/08/04/oNzcUHWE6eiYfk4.png)]
- this指针负责指向本类中的成员变量
public class Person
{
private int height;
private int weight;
private int age;
private String name;
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
-
this负责指向本类中的成员方法
this.weight = weight;
}public int getAge() {
return age;
}public void setAge(int age) {
this.age = age;
}public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}
} -
this负责指向本类中的成员方法
-
this可以代替本类的构造函数