注意面向对象思想和面向过程思想的区别
一、类和对象的概念和关系
对象(Object):万事万物皆对象,在程序的运行过程中,对象都是在内存中
类(class):是抽象出来是编程时定义的,是对对象的描述,对象是类的实例。
在做面向对象编程时,尽量要使在计算机中对事物的描述和现实世界中对事物的描述尽可能一致
- 任何对象一定具有自己的特征和行为(即:属性和方法)
- 特征: 称为属性,一般为名词,代表对象有什么。在定义类时,可以在类中定义属性,属性体现的是数据的存储。
- 行为: 称为方法,一般为动词,代表对象能做什么。在定义类时,可以在类中定义方法,方法体现的是行为特征,体现的是一段过程。
二、类的定义
1.定义类的语法:
[访问范围修饰符] class {
[定义属性]
[定义方法]
[定义构造器]
}
命名规范要求:类名开头字母大写,后面的词的首字母大写,类名的命名尽可能表示出类的含义
2.定义属性的语法:
[访问范围修饰符] 数据类型 [= 值]
属性有称为全局变量、成员变量
3.定义方法的语法:
[访问范围修饰符] 返回数据类型 ([参数,参数]){
[语句]
[return]
}
命名规范要求:方法名开头字母小写,后面的词的首字母大写
4.对象的属性如果没有赋值,是有默认值的,分别是:
(1) byte、short、int、long类型的属性,默认值是0
(2) char类型的属性,默认值是\u0000 ,也就是空字符
(3) float、double类型的属性,默认值是0.0
(4) boolean类型的属性,默认值是false
(5) String类型的属性,默认值是null
(6) 所有引用类型的属性,默认值是null
例:描述两个人吃饭的过程、两个人自我介绍的过程
1. 先定义人类
public class Person {
}
2. 定义人类的属性 ,为人类定义姓名、性别、年龄、身高、爱好等属性。
public class Person {
String name ;
char sex;
int age;
double height;
String hobbit;
}
3. 创建对象,为对象的这些属性赋值,可以使用对象的这些属性
//创建两个Person类型的对象
//Person p1 是引用类型的变量 ,以后称为引用 在内存中声明了一个长度为64位的空间
//new Person() : new关键字 创建对象
//将创建的对象的地址 存储到 p1引用中 ,后面使用p1就代表那个对象
Person p1 = new Person();
Person p2 = new Person();
//为p1引用的对象的属性赋值
p1.name="tom"; p1.age=20;
p1.height=1.7; p1.sex='男';
p1.hobbit="刷抖音、看电视、看书";
System.out.println("姓名:"+p1.name+",年龄:"+p1.age);
4. 在类中定义两个方法,分别是吃饭和自我介绍
定义吃饭的方法
//void关键字 ,写在方法名的前面,代表这个方法没有返回结果
//参数 代表了 执行这个方法要 传入的值
void eat(String food) {
System.out.println("正在吃"+food);
}
方法的调用: 通过一个对象调用方法
(1)无返回值的
void showInfo() {
System.out.println("姓名:"+name+",性别:"+sex+",年龄:"+age);
}
Person p1 = new Person();
//调用eat方法 p1.eat("烤冷面");
p1.name="tom";
p1.age=20;
p1.height=1.7;
p1.sex='男';
p1.showInfo();
(2)有返回值类型的
String showInfo() {
return "姓名:"+name+",性别:"+sex+",年龄:"+age ;
}
String info = p1.showInfo();
System.out.println(info);
//或者
System.out.println(p1.showInfo());
void eat(String food) {
if("柿子"==food) {
//结束方法
return ;
}
if("面条"==food) {
System.out.println("使用筷子吃"+food);
}else if("大米饭"==food) {
System.out.println("使用勺子吃"+food);
}
System.out.println("吃完了");
}
return关键字:
方法执行到return时就立刻结束,如果一个方法有返回类型,方法执行时一定要有return语 句,return语句的后面返回一个具体的值;如果一个方法没有返回类型void ,可以使用return来控制方法的 结束,return语句的后面不写值。
三、方法参数:
1. 形参:在方法定义时,参数叫形参,形参相当于是一个变量,代表了传入的值
2. 实参:在调用方法时,传入的值叫实参
//i 和 j 就是形参 ,其实就是变量,在运行时代表了传入的值
int add(int i,int j) {
return i+i;
}
int div(int i,int j) {
if(j==0) {
System.out.println("除数不能是0");
return 0;
}
return i/j;
}
Person p1 = new Person();
p1.add(2, 3); //传入的值
四、方法重载:
一个类中,方法的名字相同 但参数类型列表不同就构成了 方法的重载
int add(int i,int j) {
return i+i;
}
int add(int i,int j) {
return i+i;
}
上面的两个方法,方法名相同,参数类型列表相同,属于重复定义,不能编译
可以使用方法重载的语法:方法名可以相同,参数类型列表不同
以下方法都构成了重载
int add(int i,int j) {
return i+j;
}
int add(double i,double j) {
return (int)(i+j); }
void add(int i,String s) {
}
void add(String i,int s) {
}
void add(String i,String s) {
}
重载的方法有什么用?
重载的方法名相同,调用者只要记住这个方法名,根据实参的类型就能区分调用哪个方法了
如果有重载的方法,在调用时我们应该知道调用的是哪个方法。
Person p1 = new Person();
p1.add(2, 3); //调用的是add(int i,int j)的方法
p1.add(2.5, 3.5);//调用的是add(double i,double j)的方法
p1.add(2, 3.5); //调用的是add(double i,double j)的方法
//p1.add(true, false); //编译错误 没有这个方法
p1.add('a', 'b'); // char自动转为int 自动转为double 执行最近的方法 调用的是add(int i,int j)的方法
五、值传递
调用方法时,传入的值是实参,强调一下,传入的是值而不是某个变量
public class Test {
void modify(int i) {
i++;
System.out.print("方法内部的i是:"+i);
}
public static void main(String[] args) {
Test t = new Test();
int i = 3;
//值传递,传入方法的是3 而不是i变量
t.modify(i);
System.out.println("方法外部i是:"+i);
}
}
六、构造器(Constructor)
又称为构造方法、构造函数
构造器的作用:
1. 主要作用:通过调用构造器创建对象,调用构造器是创建对象的唯一途径
2. 次要作用:完成对象的一些初始化工作,包括了对对象属性的初始化,对象过程的初始化
构造器的语法:
[访问范围修饰符] 类名 ([参数,参数]){
语句
}
构造器的特点:
1. 如果类中没有写构造器,系统会为这个类自动添加一个无参的构造器;如果写了构造器,系统就不在自动添加无参构 造器了
2. 一个类中可以有多个构造器,可以构成构造器的重载,构造器的参数类型列表不同就能构成重载
七、this关键字
代表了当前对象
作用:
1. 调用属性,如果属性名和局部变量名不需要做区分,this.可以省略
2. 调用方法,在一个类中调用本类的方法也是this. 也可以省略
3. 调用构造器,在本类中调用自身的其他构造器,使用this调用,this调用构造器,一定要写在构造器的第一行
public class Person {
//全局变量
String name;
int age;
//参数或在方法中定义的变量,叫局部变量
Person(String name,int age){
//将name参数的值 设置到了name参数中
//当代码块中,全局变量名和局部变量名相同时,默认使用的是局部变量
this.name = name;
this.age = age;
this.showInfo();
}
Person(String name){
this.name = name;
}
Person(int age){
this.age = age;
}
Person(){
}
void showInfo() {
//this代表了调用当前方法的那个对象
System.out.println("姓名:"+name+",年龄:"+age);
}
void eat() {
showInfo();
}
}
Person(String name,int age){
//将name参数的值 设置到了name参数中
//当代码块中,全局变量名和局部变量名相同时,默认使用的是局部变量
this.name = name;
this.age = age;
this.showInfo();
}
Person(String name){
this.name = name;
}
Person(int age){
this.age = age;
}
Person(){
//通过无参构造器创建的所有对象,name默认是"无名",age默认是-1 , addr 是中国
//调用 Person(String name,int age) 构造器
this("无名",-1);
addr = "中国";
}
3850

被折叠的 条评论
为什么被折叠?



