面向对象思想
什么是对象(Object)?
万事万物皆对象,对象拥有行为与属性。例如:人(性别,名字)
什么是类(class)
根据事物的共同特征,我们把这些事物抽象为一个类
类是用来描述对象的,或也可以说类是对象的模板,对象是类的示例
类中的数据定义为属性,行为特征定义为方法。
定义类
语法:
[修饰范围] class 类名{
[属性]
[方法]
[构造器]
}
定义属性
语法:
类型 属性名 [= 值]
解释:如果没有为属性赋值,在创建对象时系统会为对象的每个属性分配默认值
默认值如下:
byte\short\int\long 默认 0
float\double 默认 0.0
boolean 默认 false
char 默认 \u0000
引用类型 默认 null
又将属性称为 全局变量\成员变量
调用方法:对象.属性;
定义方法
定义方法就是定义了一段过程(一些事物的描述、是一些计算过程、流程控制)定义一个过程的结构。
调用方法:对象.方法();
语法:(方法的命名第一个单词首字母小写从第二个开始大写首字母)
[修饰范围] 返回值的类型 方法名([参数,参数..]){
语句;
[return 值 ]
}
例如:
public static 返回值类型 方法名称 (类型 参数1,类型 参数2,...){
方法的主体
程序语句;
【return 表达式】
}
无返回:
public class MethodDemo01{
public static void main(String args[]){
printInfo() ; // 调用printInfo()方法
printInfo() ; // 调用printInfo()方法
printInfo() ; // 调用printInfo()方法
System.out.println("Hello World!!!") ;
}
public static void printInfo(){
char c[] = {'H','e','l','l',
'o',',','L','X','H'} ; // 定义字符数组
for(int x=0;x<c.length;x++){ // 循环输出
System.out.print(c[x]) ;
}
System.out.println("") ; // 换行
}
};
有返回:
public class MethoDemo02{
public static void main(String args[]){
int one = addOne(10,20) ; // 调用整型的加法操作
float two = addTwo(10.3f,13.3f) ; // 调用浮点数的加法操作
System.out.println("addOne的计算结果:" + one) ;
System.out.println("addTwo的计算结果:" + two) ;
}
// 定义方法,完成两个数字的相加操作,方法返回一个int型数据
public static int addOne(int x,int y){
int temp = 0 ; // 方法中的参数,是局部变量
temp = x + y ; // 执行加法计算
return temp ; // 返回计算结果
}
// 定义方法,完成两个数字的相加操作,方法的返回值是一个float型数据
public static float addTwo(float x,float y){
float temp = 0 ; // 方法中的参数,是局部变量
temp = x + y ; // 执行加法操作
return temp ; // 返回计算结果
}
};
注意:
如果方法中有void就表示这个方法没有返回值,不可以使用return返回内容。
return可以返回一个方法的结果,也可以使用return结束一个方法。(不执行下面的语句)
方法里传入参数的需要返回参数!
解释:参数实质也是一个变量,这个变量的赋值是在调用方法是完成的。
如果方法有结果,一定要返回一个指定返回类型的结果值。
形参和实参
方法定义中的参数叫形参,调用方法传入的值叫实参
double run(){
System.out.println("这个人在跑步");
return 0.7; //当执行了return语句,方法立刻结束。
}
double run(boolean isChild){
System.out.println("这个人在跑步");
if(isChild){
return 0.7;
}else{
return 0.8;
}
}
方法重载:
方法名相同,但参数的类型和参数的个数不同,通过传递参数的个数及类型不同以完成不同功能的方法调用。
方法的递归调用:
方法自己调用自己
构造器\构造方法\构造函数 (Constructor)
语法:
[修饰范围] 类名([参数,参数]){
语句;
}
Person(){
System.out.println("创建了一个Person对象");
}
作用:用来创建对象,其次还可以在创建对象的同时,做一些初始化工作(过程化的初始化、属性的初始化)。
特点:如果类中没写构造器,在编译时,系统会为这个类分配一个无参构造器。
如果类中写了构造器,系统就不在分配构造器了。
一个类中可以有多个构造器,但构造器的参数类型列表必须不同。
Person(String name,int age,double height){
//当全局变量和局部变量的名字相同,默认使用局部变量
this.name = name;
this.age = age;
this.height = height;
}
Person(String name,int age){
this.name = name;
this.age = age;
}
Person(String name){
this.name = name;
}
创建对象
Person p = new Person();
使用对象的属性
Person p = new Person();
p.name = "tom";
System.out.println(p.name);
调用方法
System.out.print(p2.run(false));
方法及属性重名问题
一个类中属性名不能重复(类中的属性名是属性的唯一标示)
一个类中方法名是可以重复的,但要保证方法的参数类型列表不同
调用构造器
new关键字+构造器()
this关键字
当前对象
如果在一个方法中使用this,代表当前调用方法的那个对象
如果在一个构造器中使用this,代表当前创建出来的那个对象
堆栈:
堆:存放对象的属性,需要使用关键字new才可以开辟。
栈:存放堆内存的地址(对象的名字)