目录
类与对象
1.概念
2.属性/成员变量/字段
1) 从概念或叫法上看: 成员变量 = 属性 = field(字段)
2) 属性是类的一个组成部分,一般是基本数据类型,也可是引用类型(对象,数组)
3.注意事项和细节说明
1) 属性的定义语法同变量,示例:访问修饰符 属性类型 属性名; 这里老师简单的介绍访问修饰符: 控制属性的访问范围 有四种访问修饰符 public, proctected, 默认, private
2) 属性的定义类型可以为任意类型,包含基本类型或引用类型
3) 属性如果不赋值,有默认值,规则和数组一致。
4.类和对象的内存分配机制
Java 内存的结构分析
1) 栈: 一般存放基本数据类型(局部变量)
2) 堆: 存放对象(Cat cat , 数组等)
3) 方法区:常量池(常量,比如字符串), 类加载信息
5.创建对象
Cat cat ; //声明对象 cat
cat = new Cat(); //创建
Cat cat = new Cat();
6.成员方法
成员方法的定义:
1) 形参列表:表示成员方法输入
2) 返回数据类型:表示成员方法输出, void 表示没有返回值
3) 方法主体:表示为了实现某一功能代码块
4) return 语句不是必须的。
访问修饰符 返回数据类型 方法名(形参列表..) {//方法体
语句; return 返回值;
}
7.方法的调用机制原理
1.当程序执行到方法时,就会开辟一个独立的空间(栈空间)
2.当方法执行完毕,或者执行到return语句时,就会返回,
3.返回到调用方法的地方
4.返回后,继续执行方法后面的代码
5.当main方法(栈)执行完毕,整个程序退出
8.方法递归调用
2.方法的局部变量是独立的,不会相互影响,比如n变量
3.如果方法中使用的是引用类型变量(比如数组,对象),就会共享该引用类型的数据。
4.递归必须向退出递归的条件逼近,否则就是无限递归,出现(StackOverflowError)
5.当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。
public class HanoiTower {
public static void main(String[] args){
Tower t1 = new Tower();
t1.move(3,'A','B','C');
}
}
class Tower{
//num 表示要移动的圆盘的个数,a,b,c,表示a,b,c底座
public void move(int num ,char a,char b,char c){
if(num == 1){
System.out.println(a + "-->" + c);
} else{
//如果有多个圆盘,可以划分为(上面部分)和(最下面圆盘)两部分
//(1)移动上面部分到 b 借助 c
move(num - 1,a,c,b);
//(2)把最底圆盘移到 c
System.out.println(a + "-->" + c);
//(3)把 b盘所有盘全放到 c ,借助 a
move(num - 1,b,a,c);
}
}
}
9.方法重载(OverLoad)
2)形参列表:必须不同(形参类型或个数或顺序,至少有一样不同,参数名无要求)
class OMyCalculator{
public double calculate(int n1, int n2){
System.out.println("calculate(int n1, int n2)被调用");
return n1 + n2;
}
public double calculate(int n1, double n2){
System.out.println("calculate(int n1, double n2)被调用");
return n1 + n2;
}
public double calculate(double n1, int n2){
System.out.println("calculate(double n1, int n2)被调用");
return n1 + n2;
}
public double calculate(int n1, int n2,int n3){
System.out.println("calculate(int n1, int n2)被调用");
return n1 + n2 + n3;
}
10.可变参数
概念
java 允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。 就可以通过可变参数实现
访问修饰符 返回类型 方法名(数据类型... 形参名) {
}
public int sum(int...nums){
System.out.println("这个可变参数长度为:" + nums.length);
int sum = 0;
for(int i = 0;i < nums.length;i++){
sum += nums[i];
}
return res;
}
注意事项
1)可变参数的实参可以为0个或任意多个。
2)可变参数的实参可以为数组。
3)可变参数的本质就是数组.
4)可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后5)一个形参列表中只能出现一个可变参数
11.作用域
1.属性和局部变量可以重名,访问时遵循就近原则。
2.在同一个作用域中,比如在同一个成员方法中,两个局部变量,不能重名。
3.属性生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁。局部变量,生命周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而销毁。即在一次方法调用过程中。
作用域范围不同
全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)局部变量:只能在本类中对应的方法中使用
5.修饰符不同
全局变量/属性可以加修饰符局部变量不可以加修饰符
12.构造器
基本语法:
[修饰符] 方法名(形参列表){
方法体;
}
class ConsPerson{
String name;
int age;
//构造器(没有返回值,不能写 void 关键字,构造器的名称需和类名相同)
//构造器是特殊的方法
public ConsPerson(String pName,int pAge){
System.out.println("构造器被调用~~~属性已被初始化");
name = pName;
age = pAge;
}
public ConsPerson(String pName){//构造器重载
name = pName;
}
public ConsPerson(){}//默认的无参构造器被覆盖,如果还想用就需要在类中写上
}
注意事项
1.一个类可以定义多个不同的构造器,即构造器重载
比如:我们可以再给Person类定义一个构造器,用来创建对象的时候,只指定人名.不需要指定年龄
2.构造器名和类名要相同3.构造器没有返回值
4.构造器是完成对象的初始化,并不是创建对象
5.在创建对象时,系统自动的调用该类的构造方法
6.如果程序员没有定义构造器,系统会自动给类生成一个默认无参构造器(也叫默认构造器),比如 Dog 00,使用javap指令反编译看看
7.一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器
13.this 关键字
java虚拟机会给每个对象分配this,代表当前对象。
注意事项和使用细节:
1) this 关键字可以用来访问本类的属性、方法、构造器
2) this 用于区分当前类的属性和局部变量
3) 访问成员方法的语法:this.方法名(参数列表);
4) 访问构造器语法:this(参数列表); 注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一 条语句)
5) this 不能在类定义的外部使用,只能在类定义的方法中使用。