类与对象
类与对象概念
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:
成员方法
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)全局变量可以不赋值直接使用(有默认值),局部变量必须赋值后使用(无默认值)