面向对象编程基础

类和对象的区别和联系

类是抽象的,概念的,代表一类事物,比如人类,猫类.., 即它是数据类型.

对象是具体的,实际的,代表一个具体事物, 即 是实例.

类是对象的模板,对象是类的一个个体,对应一个实例

image

属性,成员变量,字段

成员变量 = 属性 = field(字段) (即 成员变量是用来表示属性的,统一叫属性

属性是类的一个组成部分,一般是基本数据类型,也可是引用类型(对象,数组)。比如我们前面定义猫类的int age就是属性

属性的定义语法同变量,示例:访问修饰符 属性类型 属性名; 这里老师简单的介绍访问修饰符: 控制属性的访问范围 有四种访问修饰符 public, proctected, 默认, private ,后面我会详细介绍

属性的定义类型可以为任意类型,包含基本类型或引用类型

属性如果不赋值,有默认值,规则和数组一致。具体说: int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000,boolean false,String null

创建对象

先声明再创建 Cat cat ; //声明对象 cat cat = new Cat();

//创建 2) 直接创建 Cat cat = new Cat();

访问属性

基本语法 对象名.属性名; 案例演示赋值和输出 cat.name ; cat.age; cat.color;

类和对象的内存分配机制(重要) 看一个思考题 我们定义一个人类(Person)(包括 名字,年龄)。

类和对象的内存分配机制

Java 内存的结构分析

  1. 栈: 一般存放基本数据类型(局部变量)
  2. 堆: 存放对象(Cat cat , 数组等)
  3. 方法区:常量池(常量,比如字符串), 类加载信息

\1) 先加载 Person 类信息(属性和方法信息, 只会加载一次)

在堆中分配空间, 进行默认初始化(看规则)

把地址赋给 p , p 就指向对象

进行指定初始化, 比如 p.name =”jack” p.age = 10

成员方法

public void speak() { 
    System.out.println("一个好人");}
//成员方法的好处
//1) 提高代码的复用性
//2) 可以将实现的细节封装起来,然后供其他用户来调用即可
/*
成员方法的定义
访问修饰符 返回数据类型 方法名(形参列表..) {//方法体
语句;
return 返回值;
}
*/

image

image

成员方法传参机制(非常重要)

结论:基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参

引用数据类型的传参机制(数组,对象...)

引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参!

方法的递归(非常重要)

简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂问题,同时可以让代码变得简洁

1) 打印问题
2) 阶乘问题
代码
public class Recursion01 {
//编写一个 main 方法
public static void main(String[] args) {
T t1 = new T();
t1.test(4);//输出什么? n=2 n=3 n=4
int res = t1.factorial(5);
System.out.println("5 的阶乘 res =" + res);
}
}
class T {
//分析
public void test(int n) {
if (n > 2) {
test(n - 1);
}
System.out.println("n=" + n);
}
//factorial 阶乘
public int factorial(int n) {
if (n == 1) {
return 1;
} else {
return factorial(n - 1) * n;
}
}
}

image

image

方法重载

java 中允许同一个类中,多个同名方法的存在,但要求 形参列表不一致!

image

可变参数

java 允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。 就可以通过可变参数实现

语法:

访问修饰符 返回类型 方法名(数据类型... 形参名) { }

//1. int... 表示接受的是可变参数,类型是 int ,即可以接收多个 int(0-多)
//2. 使用可变参数时,可以当做数组来使用 即 nums 可以当做数组
//3. 遍历 nums 求和即可
public int sum(int... nums) {
//System.out.println("接收的参数个数=" + nums.length);
int res = 0;
for(int i = 0; i < nums.length; i++) {
res += nums[i];
}
return res;
}

1)可变参数的实参可以为0个或任意多个。

2)可变参数的实参可以为数组。
3)可变参数的本质就是数组.
4)可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后5)一个形参列表中只能出现一个可变参数

作用域

1.在java编程中,主要的变量就是属性(成员变量)和局部变量。
2我们说的局部变量一般是指在成员方法中定义的变量。【举例Cat类: cry】

3.java中作用域的分类
全局变量:也就是属性,作用域为整个类体Cat类: cry eat等方法使用属性【举例】
局部变量;也就是除了属性之外的其他变量,作用域为定义它的代码块中!全局变量(属性)可以不赋值,直接使用,因为有默认值,局部变量必须赋值后,才能使用,因为没有默认值。[举例]

image

构造方法、构造器

语法:

  1. [修饰符] 方法名(形参列表)
  2. 构造器的修饰符可以默认, 也可以是 public protected private
  3. 构造器没有返回值
  4. 方法名 和类名字必须一样
  5. 参数列表 和 成员方法一样的规则
  6. 构造器的调用, 由系统完成

构造方法又叫构造器(constructor),是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。它有几个特点:1) 方法名和类名相同 2) 没有返回值 3) 在创建对象时,系统会自动的调用该类的构造器完成对象的初始化。

image

this关键字

this代表当前对象

this:哪个对象调用,就代表哪个对象

this 关键字可以用来访问本类的属性、方法、构造器

this 用于区分当前类的属性和局部变量

访问成员方法的语法:this.方法名(参数列表);

访问构造器语法:this(参数列表); 注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一条语句)

this 不能在类定义的外部使用,只能在类定义的方法中使用。

posted @ 2024-01-14 17:48  十里-  阅读(25)  评论(0)    收藏  举报