总结
*1,面向对象编程的概念(理解)
- 对象,面向对象,面向对象编程,
*2,类和对象以及引用(重中之重)
- 类和对象,类的定义,成员变量的定义,对象的创建,引用的定义等
*3,成员方法(重中之重)
- 语法格式,详解,调用格式,传参的过程等
-
对象指一块内存区域
-
类是指分类
具有相同特征和行为的多个共性的抽象描述
引用数据类型,包含成员变量(特征/属性)和成员方法(行为) -
类是用于构件对象的模板(设计图),对象的数据结构由定义它的类决定
-
对象是具体的某一个,类是具有相同特征的对象的统称
类名由多个单词组成时,首字母均要大写
多个单词组成时,第二单词起首字母大写
注意:
a,类定义后,可用new来创建该类的对象,这个过程叫做实例化
b,创建对象本质是,在内存空间的堆区申请一块存储区域,用于存放该对象的独有特征信息
-
基本概念
a,引用数据类型定义的变量叫引用型变量,简称为“引用”
b,记录对象在堆区的内存地址信息(栈区) -
语法格式
定义:类名 引用变量名
访问:引用变量名.
例如: Person p = new Person();
p.name = “张飞”;
System.out.println(p.name);
6,成员方法的定义
class 类名{ 例如:class Person {
返回值类型 成员方法名(形参列表){ void show() {
成员方法体; System.out.println("没事秀一下!");
} }
} }
成员方法名,从第二个单词起首字母大写
-
返回值类型的详解
*指方法体内返回到方法体外的数据内容
*返回值类型指返回值的数据类型,基本、引用均可
*当返回的数据内容是66时,返回值类型是int
*用return返回具体数据内容并结束当前方法
*当返回的数据内容是66时,写成 return 66;
*无需返回数据内容是,写 void类型 -
形参列表的详解
*将方法体外的数据内容带入方法体内部
*列表指多个形参组成的列表格式如下
数据类型 形参1, 数据类型 形参2,…
*带入的数据内容是"hello"时,则形参列表写 String s 即可
*带入的数据内容是66和"hello"时, 则形参列表写 int i, String s 即可
*不需要传入数据内容时,形参列表位置啥也不写 -
方法体详解
*编写描述方法功能的语句块
*成员方法可以实现方法的重用,简化代码
//定义及调用参考Person.java 和 Point.java
引用变量名.成员方法名(实参列表) 例如:p.show();
实参列表主要用于对形式参数列表进行初始化操作,因此参数个数类型以及顺序都要完全一致
实参可以传递直接量变量,表达式,方法的调用等
返回值类型 方法名(参数的类型… 参数名)
方法参数部分指定类型的参数个数是可以改变的,也就是0~n个
一个方法的形参列表中最多只能声明一个可变长形参,并且需要放到参数列表的末尾
基本数据类型的变量作为方法的参数传递时,形参变量数值的改变通常不会影响到实参变量的数值,
因为两个变量有各自独立独立的内存空间
(重要) 形参变量指向内容的改变会影响到实参变量指向内容的数值,
因为两个变量指向同一块内存空间
**当引用数据类型的变量作为方法的参数传递时,若形参变量改变指向后,再改变指定的内容,
则通常不会影响到实参变量指向内容的改变,因为两个变量指向不同内存空间
栈用于存放局部变量
JVM会为每一个方法的调用在栈中分配一个对应的空间(栈帧),与方法一一对应, 栈帧存放方法的参数,局部变量等数据
调用完成后,栈帧消除
11,代码之Person类的定义
/*
编程实现Person类的定义
*/
public class Person {
//数据类型 成员变量名 = 初始值; -其中 =初始值 通常都省略不写
String name; //用于描述姓名的成员变量
int age; //用于描述年龄的成员变量
//自定义成员方法实现所有成员变量的打印
//返回值类型 方法名称(形参列表) {方法体}
void show() {
//成员变量和成员方法都属于类内部的成员,因此可以直接访问成员变量,因此不需要再加引用.的前缀
System.out.println("我是" + name + ",今年" + age + "岁了");
}
//自定义成员方法实现将姓名修改为参数指定数值的行为
void setName(String s) {
name = s;
}
//自定义成员方法实现将年龄修改为参数指定数值的行为
void setAge(int i) {
age = i;
}
//自定义成员方法实现将姓名和年龄修改成参数指定数值的行为 下面的方法不推荐使用, 由于功能之间的耦合性
void setNameAge(String s, int i) {
name = s;
age = i;
}
//自定义成员方法实现可变长参数的使用 看作一位数组使用即可 0到n个
void showArgument(int num, String... args) {
System.out.println("num = " + num);
for(int i= 0; i < args.length; i++) {
System.out.println("第" + (i+1) + "个参数为:" + args[i]);
}
}
//自定义成员方法实现姓名数值的获取并返回的行为
String getName() {
return name; //返回数据并结束当前方法
}
//自定义成员方法实现年龄数值的获取并返回行为
int getAge() {
return age;
}
public static void main(String[] args) {
//1.声明Person类型的引用,指向Person类型的对象
//数据类型(类名) 引用变量名 = new 类名();
//栈区 //堆区
Person p = new Person(); //每个对象都有2种属性,name和age
//2.打印对象中的成员变量值
// System.out.println("我是" + p.name + ",今年" + p.age + "岁了"); //引用数据类型的默认值null
//引用变量名.成员方法名
//调用方法的本质就是根据方法名跳转过去执行方法体后再跳回这个位置
p.show();
System.out.println("------------------------------------------------------------");
//3.修改成员变量的数值
p.name = "张飞";
p.age = 30;
//4.再次打印修改后的数值
//System.out.println("我是" + p.name + ",今年" + p.age + "岁了");
p.show();
System.out.println("------------------------------------------------------------");
//5.通过成员方法的调用,实现成员变量的修改
p.setName("关羽");
p.setAge(35);
p.show();
System.out.println("------------------------------------------------------------");
//6.通过成员方法实现同时修改姓名和年龄
p.setNameAge("刘备",40);
p.show();
System.out.println("------------------------------------------------------------");
int ia = 40;
p.setNameAge("刘" + "备",ia);
p.show();
System.out.println("------------------------------------------------------------");
//7.通过成员方法实现可变长参数的打印
p.showArgument(0);
System.out.println("------------------------------------------------------------");
p.showArgument(1, "参数1");
System.out.println("------------------------------------------------------------");
p.showArgument(2, "参数1", "参数2");
System.out.println("------------------------------------------------------------");
p.showArgument(3, "参数1", "参数2", "参数3");
System.out.println("------------------------------------------------------------");
//8.通过成员方法实现成员变量数值的获取并打印
String str1 = p.getName();
System.out.println("获取到的姓名为:" + str1); //刘备
int ib = p.getAge();
System.out.println("获取到的年龄为:" + ib); //40
}
}
12,代码之Point类的定义
/*
编程实现Point类的定义
特征:横纵坐标
要求:在main中声明Point类型的引用指向Point对象并打印特征,然后将坐标修改为(3,5)后再次打印
*/
public class Point {
int x; //描述横坐标的成员变量
int y; //描述纵坐标的成员变量
//自定义成员方法实现成员变量数值的打印
void show() {
System.out.println("坐标为:(" + x + "," + y + ")");
}
//自定义成员方法实现将横坐标修改为指定参数的行为
void setX(int i) {
x = i;
}
//自定义成员方法实现将纵坐标修改为指定参数的行为
void setY(int j) {
y = j;
}
//自定义成员方法实现int类型的可变长参数使用
void showArgument(int... args) {
for(int i = 0; i < args.length; i++) {
System.out.println("下标为" + i + "的元素是:" + args[i]);
}
}
//自定义成员方法实现获取横坐标数值并返回的行为
int getX() {
return x;
}
int getY() {
return y;
}
//自定义成员方法实现获取纵坐标数值并返回的行为
public static void main(String[] args) {
//1.声明Point类型的引用指向Point类型的对象
Point po = new Point();
//打印成员变量的值
//System.out.println("坐标为:(" + po.x + "," + po.y + ")");
po.show();
//2.将横纵坐标修改为3和5后再次打印
System.out.println("------------------------------------------------------------");
po.x = 3;
po.y = 5;
//System.out.println("坐标为:(" + po.x + "," + po.y + ")");
po.show();
//3.通过成员方法实现横纵坐标的修改
System.out.println("------------------------------------------------------------");
po.setX(10);
po.setY(20);
po.show();
//4.通过成员方法实现可变长参数的使用
System.out.println("------------------------------------------------------------");
po.showArgument(1, 2, 3, 4, 5);
//5.通过成员方法实现坐标的获取和打印
int x1 = po.getX();
int y1 = po.getY();
System.out.println("坐标为:(" + x1 + "," + y1 + ")");
}
}
13,代码之Argument 参数传递的测试
/*
编程实现参数传递的测试
*/
public class ArgumentTest {
//自定义成员方法打印参数传入的整数数据
//int ia = ib = 10
void show1(int ia) {
ia = 200;
System.out.println("show1方法中: ia= " + ia); //10 200
}
//自定义成员方法打印参数传入的数组内容
void show2(int[] arr1) {
arr1[0] = 200;
System.out.println("showarr[0]方法中 = " + arr1[0]); //10
}
public static void main(String[] args) {
//1.声明ArgumentTest类型的引用指向该类型的对象
ArgumentTest at = new ArgumentTest();
//2.使用引用变量调用show1方法进行测试
int ib = 10;
at.show1(ib);
System.out.println("main方法中: ib = " + ib); // ib = 10
System.out.println("------------------------------------------------------------");
//3.调用show2方法进行测试
int[] arr2 = new int[] {10, 20};
at.show2(arr2);
System.out.println("main方法中 = " + arr2[0]); //10 200
}
}
数组名在栈区中存放的是地址, 而成员方法中的数组名在栈区中存放的也是地址,即把arr2的地址赋给了arr1