类和对象
对象:
- 万物皆对象,客观存在的事务皆为对象
类:(java程序的基本组成单位)
- 类是对现实生活中一类具有共同属性和行为的事务抽象
- 特点:
- 类是对象的数据类型
- 类是具有相同属性和行为的一组对象的集合
类是对象的模板,对象是类的一个个体,对应一个实例
对象的属性:
- 对象具有各种特征,每个对象的每个属性都具有特定的值
对象的行为:
- 对象能够执行的操作
类的组成:
- 属性:
- 在类中通过成员变量来体现(类中方法外的变量)
- 属性的定义语法同变量(访问修饰符 属性类型 属性名)
- 属性的定义类型可以为任意类型(基本数据类型 引用数据类型)
- 属性如果不赋值 有默认值 规则和数组一致
- 行为:在类中通过成员方法来体现(和前面方法相比去掉static即可)
类的定义步骤:
- 定义类
- 编写类的成员变量
- 编写类的成员方法
对象的使用:
- 创建对象:
- 使用对象:
- 使用成员方法:
作用域
基本使用:
- java中 主要的变量就是属性(成员变量)和局部变量
- 局部变量一般在成员方法中定义的变量
- 成员变量不赋值可直接使用(有默认值)
- 局部变量必须赋值使用
注意事项:
- 成员变量和局部变量可以重名 访问遵循就近原则
- 同一个作用域中 局部变量不能重名
成员变量和局部变量
区别:
- 类中位置不同:
- 内存中位置不同:
- 声明周期不同:
- 成员变量随对象存在而存在,随对象消失而消失
- 局部变量随方法调用而存在,随方法调用完毕而消失
- 初始化不同:
- 成员变量有默认的初始化值
- 局部变量没有默认初始化值,必须先定义赋值再使用
- 作用域范围不同:
- 成员变量可被本类与其他类使用
- 局部变量只能在类中对应方法中使用
- 修饰符不同:
构造方法/构造器(constructor)
概述:
- public class 类名 {
- 修饰符 类名(参数) {
- }
- }
功能:
- 主要是完成对新对象数据的初始化
注意事项:
- 构造方法的创建:
- 如果没有定义构造方法,系统将给出默认的无参构造方法
- 如果定义了构造方法,系统将不在提供默认的构造方法
- 构造方法的重载:
- 如果自定义了带参构造方法,还要使用无参构造方法,就必须再写一个无参构造方法
- 说明:
- 构造方法没有返回值
- 方法名必须和类名一样
- 构造方法的调用由系统完成
- 一个类可以定义多个构造器 即构造器重载
- 构造器是完成对象的初始化 不是创建对象
this关键字
- this修饰的变量用于指代成员变量
- 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
- 方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量
- 解决局部变量隐藏成员变量是使用this
- this代表所在类的对象引用[方法被哪个对象调用,this就代表哪个对象]
- this关键字可以用来访问本类的属性、方法、构造器
- this用于区分当前类的属性和局部变量
- 访问成员方法:this.方法名(参数列表)
- 访问构造器:this(参数列表) 只能在构造器中调用另一个构造器 且须置于第一条语句
- this不能在类定义的外部使用 只能在类定义的方法中属于
标准类的制作
成员变量:
- 使用private修饰
构造方法:
- 提供一个无参构造方法
- 提供一个带多个参数的构造方法
成员方法:
- 提供每个成员变量对应的setXxx()和getXxx()
- 提供一个显示对象信息的show();
创建对象并为其赋值的两种方式:
- 无参构造方法创建对象后使用setXxx()赋值
- 使用带参构造方法直接创建带有属性值的对象
public static void main(String[] args) { Cat c1 = new Cat(); //实例化对象 c1.name = "小橘"; c1.age = 1; Cat c2 = new Cat(); c2.name = "小花"; c2.age = 2; //访问对象属性 System.out.println(c1.name + "猫" + c1.age + "岁"); System.out.println(c2.name + "猫" + c2.age + "岁"); }}class Cat { //定义一个猫类 String name; //属性 成员变量 int age;}
public static void main(String[] args) { Person p1 = new Person(); p1.cal01(10);//调用方法同时赋值}class Person { public void cal01(int n) { int res = 0; for (int i = 1; i <= n; i++) { res += i; }System.out.println(res); }}
public static void main(String[] args) { int n1 = 20; Num n = new Num(); n.num(n1); System.out.println("main:" + n1);//基本数据类型 n1 = 20 int[] t = {1, 2, 3}; n.test(t); System.out.print( "\n" + "mian: "); for (int i : t) { System.out.print(i + "\t");//引用数据类型 200 2 3 }}class Num { public void num(int n1) { n1 = 10; System.out.println(n1); //10 } public void test(int[] t) { t[0] = 200; for (int i : t) { System.out.print(i + "\t"); //200 2 3 } }}

public class exaple041{ public static void main(String[] args) { tes t = new tes(); int res = t.factorial(3); System.out.println(res); }}class tes{ public int factorial(int a) { if (a == 1) { System.out.print(a + " = "); return 1; }else { System.out.print(a + " * "); return factorial(a - 1) * a; } }}/3 * 2 * 1 = 6
//猴子吃桃,每天吃掉桃子的一半加一颗,第十天剩余一个桃子public class exaple041{ public static void main(String[] args) { tes t = new tes(); int a = t.peach(1); if (a == -1){ System.out.println("数据超范围"); }else { System.out.println(a);//1534 } }}class tes { public int peach(int day) { if (day == 10) { return 1; } else if (day >= 1 && day <= 9) { return (peach(day + 1) + 1) * 2; } else { return -1; } }}
//将塔上按大小顺序的圆盘还原到另外的塔上//小盘上不能放大盘并在三个柱子上移动这些盘//一次只能移动一个盘public class exaple041{ public static void main(String[] args) { Tower to = new Tower(); to.move(2, 'A', 'B', 'C'); }}class Tower { //num表示盘的个数,a b c 分别表示 A塔 B塔 C塔 public void move(int num, char a, char b, char c) { //如果只有一个盘 直接a盘移动到c盘 if (num == 1) { System.out.println(a + "->" + c); } else { //如果有多个盘,则可看做两个盘,最低下的盘和上面所有盘 //先把上面所有盘移到b塔,借助c塔 move(num -1, a, c, b);//num = 1 //把最后的一个盘移动到c塔 System.out.println(a + "->" + c); //把b塔上的所有盘移动到c塔,借助a塔 move(num - 1, b, a, c);//num = 0 } }}