Java面向对象总结<二>

面向对象

1. 构造方法

1.1 编译器提供的无参数构造方法
class Person {
	// 成员变量 Field
	int id;
	String name;
	int age;
	
}

/*
当前代码中是否存在【显式定义】一个无参数的Person类构造方法???
	没有

代码编译过程中,一个class对应一个.class字节码文件

【反编译工具 仅了解】
	javap -c -l -private XXXX.class
*/
class Demo1 {
	public static void main(String[] args) {
		Person person = new Person();
		System.out.println(person);
	}
}

在这里插入图片描述

1.2 用户提供构造方法之后的效果
如果在代码中【显式】定义了构造方法,Java编译器不会在提供无参数构造方法,供程序开发使用。
【要求】
	无论何时,定义类,提供对应的无参数构造方法。

2. 封装【重点,规范】


2.1 JavaBean规范封装
要求:
	1. 所有成员变量全部私有化!!!
	2. 所有的成员变量提供对应的Setter和Getter方法!!!
	3. 一定要提供一个无参数构造方法。
2.2.1 权限修饰符
public
	公开的,公共的,使用public修饰的成员变量,成员方法,和构造方法都可以在类外通过语法要求格式,来进行操作和使用。
private
	私有化,使用private修饰的成员变量,成员方法和构造方法有且只能在类内使用,类外没有操作权限。
/*
权限修饰符演示
*/
class Dog {
	public int id;
	private String name;
	
	public void test() {
		id = 10;
		// 私有化修饰的成员变量,可以在类内使用【80%正确】
		name = "八公";
		
		// 私有化修饰的成员方法,可以在类内使用【80%正确】
		testPrivate();
	}
	
	private void testPrivate() {
		System.out.println("私有化成员方法");
	}
}

class Demo2 {
	public static void main(String[] args) {
		Dog dog = new Dog();
		
		dog.id = 10;
		// 私有化private修饰的成员变量,类外无法使用。
		// dog.name = "八公";
		
		dog.test();
		// 私有化private修饰的成员方法,类外无法使用
		// dog.testPrivate();
	}
}
2.2.2 私有化成员变量setter和getter方法完成
setter
	给予私有化成员变量进行赋值操作
	setter方法格式:
		public void set成员变量名(对应成员变量数据类型参数) {
			赋值语句;
		}
		要求:
			1. 方法名要求符合小驼峰命名法 
				例如: String name; ===> setName
			2. 参数数据类型要求和成员变量一致,并且建议参数名和成员变量一致。
getter
	获取私有化成员变量保存的数据
	getter方法格式:
		public 对于成员变量数据类型返回值 get成员变量名() {
			return 成员变量;
		}
		要求:
			1. 方法名要求符合小驼峰命名法 
				例如: String name; ===> getName
2.2.3 this关键字解决就近原则问题
this什么是???
	在代码中,表示调用当前方法的类对象,或者是new关键字 + 构造方法创建的对象本身。

就近原则问题会在哪里出现:
	1. 构造方法
	2. setter方法
/*
this关键字演示
在代码中,表示调用当前方法的类对象,或者是new关键字 + 构造方法创建的对象本身。
*/
class SingleDog {
	public SingleDog() {
		System.out.println("Constructor 构造方法 : " + this);
	}
	
	public void test() {
		System.out.println("Method 成员方法 : " + this);
	}
}

class Demo4 {
	public static void main(String[] args) {
		SingleDog sd = new SingleDog();
		
		System.out.println("Main 方法 : " + sd);
		sd.test();
	}
}
// Setter和Getter方法
public void setName(String name) {
	// 就近原则 当前name变量,都是setName方法的参数变量/局部变量
	name = name;
}

// ---> 解决问题
public void setName(String name) {
    /*
    this.name 明确告知编译器,当前name是this对应对象的成员变量变量
    name 是方法的内的参数变量/局部变量
    */
    this.name = name;
} 
2.2.4 JavaBean规范代码案例
class Cat {
	// 私有化成员变量
	private String name;
	private int age;
	
	public Cat() {}
	
	/*
	构造方法参数名称对应成员变量名字,明确告知开发者当前数据
	初始化的成员变量是对应哪一个数据。
	同时需要解决就近原则问题
	*/
	public Cat(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	// Setter和Getter方法
	public void setName(String name) {

		/*
		this.name 明确告知编译器,当前name是this对应对象的成员变量变量
		name 是方法的内的参数变量/局部变量
		*/
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
	
	public int getAge() {
		return age;
	}
}

3. 局部变量和成员变量

3.1 局部变量
方法大括号以内的变量,都是局部变量

// i 是for循环以内的局部变量,有且只在当前for循环有效
for (int i = 0; i < 10; i++) {

}

System.out.println(i);

for (int i = 0; i < 10; i++) {

}

// 不同的方法中,使用相同名字的变量没有任何的联系!!!
main(String[] args) {
	int[] arr = new int[10];
	test(arr);
}

test(int[] arr) {
	System.out.println(arr);
}

for (int i = 0; i < 10; i++) {
	System.out.println(i);
	
	// 当前num有且只在当前if语句大括号有效,超出范围无效
	if (5 == i) {
		int num = 10;
	}
	
	System.out.println(num);
}

// 局部变量都是存在于内存的【栈区】
3.2 成员变量
定义在class大括号以内。

描述当前类有哪些属性。

创建对象例如:
	Person person = new Person();
	new关键字用于申请内存【堆区】空间。并且进行了擦除操作。

在这里插入图片描述

3.3 对比
对比成员变量局部变量
位置定义在类大括号以内,其他大括号之外定义在方法中
作用用于描述当前类拥有哪些属性用于方法在运行过程中,数据的临时存储
初始值成员变量在没有被赋值情况下,对于当前数据类型的"零"值未赋值不能使用
作用域哪里持有当前类对象地址,作用域在什么位置所在大括号范围以内
生存期成员变量随着对象创建而存在,也会随着对象的销毁而销毁所在大括号范围以内
3.4 "零"值
一块内存其中所有的二进制位都为0,根据当前内存保存数据类型的情况,对外数据效果不一样,都是对应数据类型的"0"数据.
	byte, short, int ==> 0
	long ==> 0L
	double ==> 0.0
	float ==> 0.0F
	char ==> '\0' \0 是字符集编号为0的字符,为不可见字符 nul
	boolean ==> false
	
	所有的引用数据类型全部 ==> null 
		NullPointerException 自行解决,实在不行,群里50红包,召唤苟磊解决。
3.5 对象销毁 ==> JVM GC机制

在这里插入图片描述
















已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页