1. 类与对象
1.1 入门
一个程序就是一个世界,有很多事物(对象[属性, 行为])
类与对象的关系示意图:
1.2 类和对象的区别和联系
1) 类是抽象的,概念的,代表一类事物,比如人类,猫类.., 即它是数据类型.
2) 对象是具体的,实际的,代表一个具体事物, 即 是实例.
3) 类是对象的模板,对象是类的一个个体,对应一个实例
1.3 对象在内存中存在形式(重要的)
1.4 属性/成员变量/字段
1. 基本介绍:
从概念或叫法上看: 成员变量 = 属性 =field(字段) (即 成员变量是用来表示属性的,本文中,统一叫 属性)
2. 属性是类的一个组成部分,一般是基本数据类型,也可是引用类型(对象,数组)。比如我们前面定义猫类的int age就 是属性
注意事项:
1. 属性的定义语法同变量,示例:访问修饰符属性类型属性名;
控制属性的访问范围 有四种访问修饰符public,proctected,默认,private。
2. 属性的定义类型可以为任意类型,包含基本类型或引用类型
3. 属性如果不赋值,有默认值,规则和数组一致。具体说:
int 0 short 0,byte 0,long 0,float 0.0,double 0.0,char \u0000, boolean false,String null。
1.5 如何创建对象
1) 先声明再创建 Cat cat ; //声明对象 cat cat = new Cat(); //创建
2) 直接创建 Cat cat = new Cat();
1.6 如何访问属性
基本语法 对象名.属性名;
类和对象的内存分配机制 :
1.7 类和对象的内存分配机制
Java内存的结构分析
1) 栈:一般存放基本数据类型(局部变量)
2) 堆:存放对象(Catcat,数组等)
3) 方法区:常量池(常量,比如字符串),类加载信息
Java创建对象的流程简单分析
Person p =new Person();
p.name=“jack”;
p.age=10
1) 先加载Person类信息(属性和方法信息,只会加载一次)
2) 在堆中分配空间,进行默认初始化(看规则)
3) 把地址赋给p,p就指向对象
4) 进行指定初始化, 比如 p.name=”jack” p.age=10
2. 成员方法
2.1 基本介绍
在某些情况下,我们要需要定义成员方法(简称方法)。比如人类:除了有一些属性外(年龄,姓名..),我们人类还有一 些行为比如:可以说话、跑步..,通过学习,还可以做算术题。这时就要用成员方法才能完成。现在要求对Person类完善。
2.2 成员方法快速入门
//1)添加speak成员方法,输出“我是一个好人”
//2)添加cal01成员方法,可以计算从1+..+1000的结果
//3)添加cal02成员方法,该方法可以接收一个数n,计算从1+..+n的结果
//4)添加getSum成员方法,可以计算两个数的和
public class Method01{
//编写一个main方法
public static void main(String[]args){
//方法使用
//1.方法写好后,如果不去调用(使用),不会输出
//2.先创建对象,然后调用方法即可
Person p1 = new Person();
p1.speak();//调用方法
p1.cal01();//调用cal01方法
p1.cal02(5);//调用cal02方法,同时给n=5
p1.cal02(10);//调用cal02方法,同时给n=10
//调用getSum方法,同时num1=10,num2=20
//把 方法 getSum 返回的值,赋给 变量 returnRes
int returnRes = p1.getSum(10, 20);
System.out.println("getSum 方法返回的值=" + returnRes);
} }
class Person {
String name;
int age;
//方法(成员方法)
//添加speak 成员方法,输出 “我是一个好人”
//解读
//1. public 表示方法是公开
//2. void : 表示方法没有返回值
//3. speak() : speak 是方法名, () 形参列表
//4. {} 方法体,可以写我们要执行的代码
public void speak() {
System.out.println("我是一个好人");
}
//5. System.out.println("我是一个好人"); 表示我们的方法就是输出一句话
//添加cal01 成员方法,可以计算从 1+..+1000的结果
public void cal01() {
//循环完成
int res = 0;
for(int i = 1; i <= 1000; i++) {
res += i;
}
System.out.println("cal01 方法 计算结果=" + res);
}
//添加cal02 成员方法,该方法可以接收一个数n,计算从 1+..+n 的结果
//解读
//1. (int n) 形参列表, 表示当前有一个形参 n, 可以接收用户输入
public void cal02(int n) {
//循环完成
int res = 0;
for(int i = 1; i <= n; i++) {
res += i;
}
System.out.println("cal02 方法 计算结果=" + res);
}
//添加getSum 成员方法,可以计算两个数的和
//解读
//1. public 表示方法是公开的
//2. int :表示方法执行后,返回一个 int 值
//3. getSum 方法名
//4. (int num1, int num2) 形参列表,2 个形参,可以接收用户传入的两个数
//5. return res; 表示把 res 的值, 返回
public int getSum(int num1, int num2) {
int res = num1 + num2;
return res;
} }
2.3 方法的调用机制原理:(重要!-示意图!!!)
2.4 成员方法的定义
访问修饰符 返回数据类型 方法名(形参列表..){//方法体
语句;
return返回值;
}
1) 形参列表:表示成员方法输入cal(int n),getSum (int num1,int num2)
2) 返回数据类型:表示成员方法输出,void表示没有返回值
3) 方法主体:表示为了实现某一功能代码块
4) return语句不是必须的。
2.5 注意事项
public class MethodDetail{
public static void main(String[]args){
AA a = new AA();
int[] res = a.getSumAndSub(1,4);
System.out.println("和="+res[0]);
System.out.println("差="+res[1]);
//细节:调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数
byte b1=1;
byte b2=2;
a.getSumAndSub(b1,b2);//byte->int
//a.getSumAndSub(1.1,1.8);//double->int(×)
//细节:实参和形参的类型要一致或兼容、个数、顺序必须一致
//a.getSumAndSub(100);//× 个数不一致
a.f3("tom", 10); //ok
//a.f3(100, "jack"); // 实际参数和形式参数顺序不对
} }
class AA{
//细节: 方法不能嵌套定义
public void f4() {
//错误
// public void f5() {
// }
}
public void f3(String str,