类和对象
对象:
- 万物皆对象,客观存在的事务皆为对象
类:(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
}
}
}