类与对象

类与对象概念

1)类是抽象、概念的,是数据类型

2)对象是具体、实际的,是实例

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

属性(成员变量)

属性 = 成员变量 = 字段

例:Car(name,price,color)

class Car{
	String name;
	double price;
	String color;
	String[] master;//属性可以是基本数据类型,也可以是引用类型(对象,数组)
}

1)属性的定义语法和变量一致

​ 例: 访问修饰符 属性类型 属性名;

protected String name;

访问修饰符:控制实行的访问范围,分为四种:public、protected、private以及默认

属性可以是基本数据类型,也可以是引用类型(对象,数组)

Car c1 = new Car()
//创建 Car 对象
//c1 是对象名(对象引用)
//new Car() 创建的对象空间(数据)才是真正的对象

属性不赋值有默认值,具体:int、short、byte、long 为 0;float、double 为0.0;char 为 \u0000;boolean 为 false。

创建对象

1)先声明、再创建

Car car;//声明对象 cat
car = new Car();//创建

2)直接创建

Car car = mew Car();

访问属性

对象名.属性名

car.name;

Java 内存的结构分析

栈:一般存放基本数据类型(局部变量)

堆:存放对象(Car car,数组等)

方法区:常量池(常亮,比如字符串),类加载信息

示意图:[Car(name,price,color)]

案例 1:

Person p = new Person();
p.name = "jack";
p.age = 10;
//先加载 Person 类信息(属性和方法信息,只会加载一次)
//在堆中分配空间,进行默认初始化(按规则)
//把地址赋给p,p 就指向对象
//进行指定初始化

案例 2:

image-20240416180933826

成员方法

class Person {
	//public 表示方法是公开
	//void 表示方法没有返回值
	//speak() speak 是方法名,() 是形参列表
	//{} 是方法体
	public Void speak(){
		System.out.println("Hello world.");
	}
}

方法写好但不去调用,就不会输出

先创建对象,然后调用方法

Person p1 = new Person();
p1.speak();

成员方法的定义

访问修饰符 返回数据类型 方法名 (形参列表…){//方法体

​ 语句;

​ return 返回值;//return 语句非必须

}

解释:

形参列表:表示成员方法的输入

​ getSum(int num1,int num2)

返回数据类型:表示成员方法的输出,void 表示没有返回值

方法主体:实现某一功能的代码块

访问修饰符:控制方法使用的范围

注意:

​ 一个方法最多只有一个返回值(返回多个值可以返回数组)

​ 返回类型可以为任意类型,包括基本类型或引用类型(即数组、对象)

​ 如果方法要求返回值,结尾必须有「return 返回值;」语句,如果为 void 可以不用或者写「return;」

​ 方法名遵循驼峰命名法

​ 一个方法可以有 0 到多个参数,用逗号间隔,参数可以是任何类型

​ 参数列表传入类型应该要求一致或者兼容(int 对整型或byte)

​ 定义时参数叫做形式参数(形参)、调用时参数叫实际参数(实参),实参和形参个数、类型、顺序必须一致

​ 方法不能再定义方法(不能嵌套定义)

调用细节

同一个类的方法可以直接调用:
class A{
	public void print(int n){
		System.out.println("打印" = n);
	}

	public void sayOk(){
		print(10);
	}
} 
跨类调用:
class A{
	B b = new B();//创建一个 B 类的对象,然后再调用方法
	b.hi;
} 

class B{
	public void hi(){
		System.out.println("hi");
	}
}

方法递归

让方法自己调用自己:

class T{
	public int fibonacci(int n){
		if(n >= 1){
            
            if(n == 1 || n == 2){
            	return 1;
            }else{
                return fibonacchi(n-1) + fibonacchi(n-2);
                    
		}else{
			
				System.out.println("输入 n >= 1 的整数");
			
			}
		}
	}
}

方法重载

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

好处:方便起名和记名

方法名必须相同,参数列表必须不同(个数或顺序或类型),返回类型无要求

class Calculater{
    //int 和 int
    public int calculate(int n1,int n2){
        return n1 + n2;
    }
    //int 和 double
    public double calculate(int n1,double n2){
        return n1 + n2;
    }
    //double 和 int
    public double calculate(double n1,int n2){
        return n1 + n2;
    }
    //int 和 int 和 int
    public int calculate(int n1,int n2,int n3){
        return n1 + n2 + n3;
    }
}

可变参数

java 允许将同一个类中多个同名同功能,但是参数个数不同的方法,封装成一个方法

语法:

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

​ }

//优化前
class HspMethod{
    public int sum(int n1,int n2){
        return n1 + n2;
    }
    public int sum(int n1,int n2,int n3){
        return n1 + n2 = n3;
    }
    public int sum(int n1,int n2,int n3,int n4){
        return n1 + n2 + n3 + n4;
    }
    //……
//优化后
    public int sum(int... nums){
        int res = 0;
        for(int i = 0;i < nums.length;i==){
            res += nums[i];
        }
    	return  res;
        //「int...」表示接受可变参数,int 是类型,接受零到多个int
        //使用可变参数 nums 的时候可以当做数组使用
    }
}
注意:

1)可变参数的实参可以为 0 到多个

2)可变参数的实参可以是数组

3)可变参数本质就是数组

4)可变参数可以和普通类型放在一起作形参列表,但必须保证可变参数在最后

5)一个形参列表中只能出现一个可变参数

作用域

1)java 编程中主要的变量就是属性(成员变量)和局部变量

2)局部变量一般在成员方法中定义的变量(Cat类中的cry)

3)作用域分类

​ 全局变量:也叫属性,作用域在整个类体

​ 局部变量:除了属性以外的其他变量,作用域在其定义的代码块中

4)全局变量可以不赋值直接使用(有默认值),局部变量必须赋值后使用(无默认值)

网站的管理员,似乎是个萌新🤔,CTBUer