四、Java面向对象(1)

本文深入讲解Java面向对象的核心概念,包括类与对象、封装、继承、多态等特性,以及构造方法、this关键字、static关键字的使用场景和注意事项。

1 面向对象概述

1.1 概述

现实世界中是如何描述一个事物的呢?
	举例:学生
			姓名,年龄,性别...
			学习,吃饭,睡觉
			
	属性:该事物的描述信息
	行为:该事物能够做什么
	
我们学习编程语言,是为了模拟现实世界的事物的。
而我们学习的编程语言Java中最基本的单位是:类。
所以,我们就应该把事物通过类来体现出来:
由此,我们就得到了现实世界事物和类的对应关系:

事物:						类:	
	属性						成员变量
	行为						成员方法
	
	
类:是一组相关的属性和行为的集合。是一个抽象的概念。
对象:是该类事物的具体表现形式。具体存在的个体。

举例:
	学生:类
	班长:对象

1.2 类与对象概述

(1)面向对象
		面向对象是基于面向过程的编程思想
(2)面向对象的思想特点
	A:是一种更符合我们思考习惯的思想
	B:把复杂的事情简单化
	C:让我们从执行者变成了指挥者
	
	举例:
		买电脑
		洗衣服
		做饭
		...
		万事万物皆对象

(3)面向对象开发,设计,特征
	面向对象开发
		就是不断的创建对象,使用对象,指挥对象做事情。
		
	面向对象设计
		其实就是在管理和维护对象之间的关系。
	
	面向对象特征
		封装(encapsulation)
		继承(inheritance)
		多态(polymorphism)
		
(4)把大象装进冰箱(理解)
	A:面向过程实现
	B:面向对象实现
	
	注意:如何让我们的操作更符合面向对象思想呢?
	A:有哪些类
	B:每个类有哪些成员
	C:类与类的关系		
(5)类与对象
	A:现实世界的事物
		属性	事物的基本描述
		行为	事物的功能
	B:Java语言中最基本的单位是类。所以,我们要用类来体现事物
	C:类
		成员变量	事物属性
		成员方法	事物行为
	D:类:是一组相关的属性和行为的集合。是一个抽象的概念。
	  对象:是该类事物的具体存在,是一个具体的实例。(对象)
	  
	  举例:
		学生:类
		班长:对象
(6)类的定义及使用
	A:类的定义
		成员变量	定义格式和以前一样,就是位置不同,在类中,方法外。
		成员方法	定义格式和以前一样,就是去掉了static。
	B:使用类的内容
		a:创建对象? 格式
			类名 对象名 =  new 类名();
		b:如何使用成员变量和成员方法呢
			对象名.成员变量
			对象名.成员方法()

1.3 对象内存图

创建一个对象
在这里插入图片描述
三个对象内存图
在这里插入图片描述

2 类

2.1 类的成员变量

成员变量和局部变量的区别?
	A:在类中的位置不同
		成员变量:在类中方法外
		局部变量:在方法定义中或者方法声明上
	B:在内存中的位置不同
		成员变量:在堆内存
		局部变量:在栈内存
	C:生命周期不同
		成员变量:随着对象的创建而存在,随着对象的消失而消失
		局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
	D:初始化值不同
		成员变量:有默认初始化值
		局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
		
	注意事项:
		局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
class Varialbe {
	//成员变量
	//int num = 10;
	int num; //0
	
	public void show() {
		//int num2 = 20; //局部变量
		//可能尚未初始化变量num2
		//int num2; //没有默认值
		int num2 = 20;
		System.out.println(num2);
		
		//int num = 100;
		System.out.println(num);
	}
}


class VariableDemo {
	public static void main(String[] args) {
		Varialbe v = new Varialbe();
		
		System.out.println(v.num); //访问成员变量
		
		v.show();	
			
	}
}

2.2 匿名对象

匿名对象:就是没有名字的对象。

匿名对象的应用场景:
	A:调用方法,仅仅只调用一次的时候。
		注意:调用多次的时候,不适合。
		那么,这种匿名调用有什么好处吗?
			有,匿名对象调用完毕就是垃圾。可以被垃圾回收器回收。
	B:匿名对象可以作为实际参数传递

2.3 封装

封装:
	(1)隐藏实现细节,提供公共的访问方式
	(2)好处:
		A:隐藏实现细节,提供公共的访问方式
		B:提高代码的复用性
		C:提高代码的安全性
	(3)设计原则
		把不想让外界知道的实现细节给隐藏起来,提供公共的访问方式
	(4)private是封装的一种体现。
		封装:类,方法,private修饰成员变量
		

private关键字:

private关键字
	(1)私有的意义,可以修饰成员变量和成员方法
	(2)特点:
		被private修饰的后的成员只能在本类中被访问
	(3)private的应用:
		以后再写一个类的时候:
			把所有的成员变量给private了
			提供对应的getXxx()/setXxx()方法

2.4 this关键字

this关键字:
	(1)代表当前类的引用对象
		记住:哪个对象调用方法,该方法内部的this就代表那个对象
	(2)this的应用场景:
		A:解决了局部变量隐藏成员变量的问题
		B:其实this还有其他的应用

2.5 构造方法

	(1)作用:用于对对象的数据进行初始化
	(2)格式:
		A:方法名和类名相同
		B:没有返回值类型,连void都不能有
		C:没有返回值
		
		思考题:构造方法中可不可以有return语句呢?
		可以。而是我们写成这个样子就OK了:return;
		其实,在任何的void类型的方法的最后你都可以写上:return;
	(3)构造方法的注意事项
		A:如果我们没写构造方法,系统将提供一个默认的无参构造方法
		B:如果我们给出了构造方法,系统将不再提供默认构造方法
			如果这个时候,我们要使用无参构造方法,就必须自己给出。
			推荐:永远手动自己给出无参构造方法。
	(4)给成员变量赋值的方式
		A:setXxx()
		B:带参构造方法
	(5)标准案例
		class Student {
			private String name;
			private int age;
			
			public Student(){}
			
			public Student(String name,int age) {
				this.name = name;
				this.age = age;
			}
			
			public String getName() {
				return name;
			}
			
			public void setName(String name) {
				this.name = name;
			}
			
			public int getAge() {
				return age;
			}
			
			public void setAge(int age) {
				this.age = age;
			}
		}
		
		测试:
		class StudentDemo {
			public static void main(String[] args) {
				//方式1
				Student s1 = new Student();
				s1.setName("林青霞");
				s1.setAge(27);
				System.out.println(s1.getName()+"---"+s1.getAge());
				
				//方式2
				Student s2 = new Student("刘意",30);
				System.out.println(s2.getName()+"---"+s2.getAge());
			}
		}

2.6创建对象过程的内存图

在这里插入图片描述

3 static关键字

3.1 static特点

static的特点:(它可以修饰成员变量,还可以修饰成员方法)
	A:随着类的加载而加载
		回想main方法。
	B:优先于对象存在
	C:被类的所有对象共享
		举例:咱们班级的学生应该共用同一个班级编号。
		其实这个特点也是在告诉我们什么时候使用静态?
			如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。
		举例:
			饮水机(用静态修饰)
			水杯(不能用静态修饰)
	D:可以通过类名调用
		其实它本身也可以通过对象名调用。
		推荐使用类名调用。
		
		静态修饰的内容一般我们称其为:与类相关的,类成员

3.2 静态的内存图

在这里插入图片描述

3.3 static注意事项

static关键字注意事项
	A:在静态方法中是没有this关键字的
		如何理解呢?
			静态是随着类的加载而加载,this是随着对象的创建而存在。
			静态比对象先存在。
	B:静态方法只能访问静态的成员变量和静态的成员方法
			静态方法:
				静态成员变量:只能访问静态变量
				静态成员方法:只能访问静态成员方法
			非静态方法:
				成员变量:可以是静态的,也可以是非静态的
				成员方法:可是是静态的成员方法,也可以是非静态的成员方法。
		简单记:
			静态只能访问静态。
			静态比对象先存在,而非静态的成员是依赖于对象的,所以静态只能访问静态的

3.4 静态变量和成员变量的区别

静态变量和成员变量的区别
		A:所属不同
			静态变量:属于类,类变量
			成员变量:属于对象,对象变量,实例变量
		B:内存位置不同
			静态变量:方法区的静态区
			成员变量:堆内存
		C:生命周期不同
			静态变量:静态变量是随着类的加载而加载,随着类的消失而消失
			成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失
		D:调用不同
			静态变量:可以通过对象名调用,也可以通过类名调用
			成员变量:只能通过对象名调用

3.5 main方法解析

main方法的格式讲解:
	public static void main(String[] args) {...}
	
	public:公共的,访问权限是最大的。由于main方法是被jvm调用,所以权限要够大。
	static:静态的,不需要创建对象,通过类名就可以。方便jvm的调用。
	void:因为我们曾经说过,方法的返回值是返回给调用者,而main方法是被jvm调用。你返回内容给jvm没有意义。
	main:是一个常见的方法入口。我见过的语言都是以main作为入口。
	String[] args:这是一个字符串数组。值去哪里了?
		这个东西到底有什么用啊?怎么给值啊?
			这个东西早期是为了接收键盘录入的数据的。
			格式是:
				java MainDemo hello world java

class MainDemo {
	public static void main(String[] args) {
		//System.out.println(args); //[Ljava.lang.String;@175078b
		//System.out.println(args.length); //0
		//System.out.println(args[0]); //ArrayIndexOutOfBoundsException
		
		//接收数据后
		System.out.println(args); 
		System.out.println(args.length); 
		//System.out.println(args[0]); 
		for(int x=0; x<args.length; x++) {
			System.out.println(args[x]);
		}
	}
}

3.6 static的使用场景

  1. 变量需要被所有对象共享
  2. 创建工具类的时候(别人使用只要提供一个class和帮助文档即可,可以通过类名直接调用方法)

举例子:
像Arrays、Collections等工具类,也可以自己创建工具类:

/**
* 这是针对数组进行操作的工具类
* @author hcy
* @version V.10
*/
public class ArrayTool {
	
	//把构造方法私有,外界就不能在创建对象了
	/**
	* 这是私有构造
	*/
	private ArrayTool(){}

	/**
	* 这是遍历数组的方法,遍历后的格式是:[元素1, 元素2, 元素3, ...]
	* @param arr 这是要被遍历的数组
	*/
	public static void printArray(int[] arr) {
		System.out.print("[");
		for(int x=0; x<arr.length; x++) {
			if(x == arr.length-1) {
				System.out.println(arr[x]+"]");
			}else {
				System.out.print(arr[x]+", ");
			}
		}
	}
	
	/**
	* 这是获取数组中最大值的方法
	* @param  arr 这是要获取最大值的数组
	* @return 返回数组中的最大值
	*/
	public static int getMax(int[] arr) {
		int max = arr[0];
		
		for(int x=1; x<arr.length; x++) {
			if(arr[x] > max) {
				max = arr[x];
			}
		}
		
		return max;
	}
	
	/**
	* 获取指定元素在数组中第一次出现的索引,如果元素不存在,就返回-1
	* @param arr 被查找的数组 
	* @param value 要查找的元素
	* @return 返回元素在数组中的索引,如果不存在,返回-1
	*/
	public static int getIndex(int[] arr,int value) {
		int index = -1;
		
		for(int x=0; x<arr.length; x++) {
			if(arr[x] == value) {
				index = x;
				break;
			}
		}
		
		return index;
	}
}

4 制作和使用帮助文档

4.1 制作帮助文档

如何制作一个说明书呢?
	A:写一个工具类
	B:对这个类加入文档注释
		怎么加呢?
		加些什么东西呢?
	C:用工具解析文档注释
		javadoc工具
	D:格式
		javadoc -d 目录 -author -version ArrayTool.java
		
		目录:就可以写一个文件夹的路径
		如:javadoc -d doc -author -version -encoding UTF-8 ArrayTool.java(doc目录下)
		
制作帮助文档出错:
	找不到可以文档化的公共或受保护的类:告诉我们类的权限不够

4.2 使用帮助文档

1:打开帮助文档
2:点击显示,找到索引,看到输入框
3:知道你要找谁?以Scanner举例
4:在输入框里面输入Scanner,然后回车
5:看包
	java.lang包下的类不需要导入,其他的全部需要导入。
	
	要导入:
	java.util.Scanner
6:再简单的看看类的解释和说明,别忘了看看该类的版本
7:看类的结构
	成员变量	字段摘要 	
	构造方法	构造方法摘要 
	成员方法 	方法摘要
8:学习构造方法	
	A:有构造方法	就创建对象
	B:没有构造方法	成员可能都是静态的
9:看成员方法
	A:左边
		是否静态:如果静态,可以通过类名调用
		返回值类型:人家返回什么,你就用什么接收。
	B:右边
		看方法名:方法名称不要写错
		参数列表:人家要什么,你就给什么;人家要几个,你就给几个

5 代码块

代码块:在Java中,使用{}括起来的代码被称为代码块。

根据其位置和声明的不同,可以分为
	局部代码块:局部位置在方法体中,用于限定变量的生命周期。
	构造代码块:在类中的成员位置,用{}括起来的代码。每次调用构造方法执行前,都会先执行构造代码块。
		作用:可以把多个构造方法中的共同代码放到一起,对对象进行初始化。
	静态代码块:在类中的成员位置,用{}括起来的代码,只不过它用static修饰了,并且只执行一次。
		作用:一般是对类进行初始化。
		
面试题?
	静态代码块,构造代码块,构造方法的执行顺序?
	静态代码块 -- 构造代码块 -- 构造方法
	静态代码块:只执行一次
	构造代码块:每次调用构造方法都执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值