软件开发有两个方向,面向对象和面向过程
java是完全面向对象的,
c++ 是一半面向对象,一半面向过程,
c 是完全面向过程的
一、面向过程和面向对象的区别
面向过程注重步骤,按步骤实现功能
面向过程的缺点:
耦合度高,扩展性差,每个功能的具体步骤不可能完全相同,所以每个功能都得写新代码,代码复用率不高
面向过程的优点:
效率高,适合小型嵌入式开发
面向对象是通过调用已有的类去实例化对象,让对象来实现功能,
面向对象的优点:
耦合度低,扩展性强
思考方式的区别:
面向过程是自己写一套代码去实现一个小功能
面向对象是已经有很多实现不同功能的代码封装成一个个类库,我们只需调用不同的类库就可以完成更复杂的功能
二、面向对象的三大特征
封装--加强
继承--扩展
多态--应用
三、类和对象
类实例化为对象,对象抽象为类,分类可以使拥有同类属性的对象继承类属性,减少代码重复
编程时刚好相反,我们通过将实际问题划分成一个个类,每个类有一个个对象,在将每个类里对象的共同特征抽象为类属性,然后写类,new对象,实例化属性,实例化方法(往往需要实例属性传参),通过实例属性和实例方法实现功能
通常对象的动作抽象为方法,静态的数据抽象为属性
四、用代码来描述一个类*
public class Hello{
//main函数
//自定义函数
}
static可以省略
类属性是数据,数据在程序中只能放到变量中。结论:属性其实就是变量。
方法体外声明的变量:成员变量。(这里的属性就是成员变量)
类=成员变量+成员方法
成员方法分为类方法和实例方法,写static的为类方法,否则为实例方法
public class Food { String foodname; }
类是构建对象的模板
public class Panda { String name;//类属性 public void eat(Food f){//方法 System.out.println("然后"+name+"吃了"+f.foodname); } } public class Keeper { String keepName; public void feed(Panda p,Food f) {//饲养员的投食动作抽象为方法 System.out.println(keepName+"投食了"+f.foodname); p.eat(f); } } import com.homework.Day05.Demo01.Food; import com.homework.Day05.Demo01.Keeper; import com.homework.Day05.Demo01.Panda; public class TestKeeper { public static void main(String[] args) { //创建一个具体的手机对象 //语法: 类名 对象名 = new 类名(); Food f = new Food(); //f 是引用的对象的一个变量,是对象名,即以该对象名命名栈中的一块地址并指向堆区中的new对象,所以f并不是对象 对象是存储在堆区的new Food() f.foodname="今天刚空运过来的新鲜柱子"; Panda p = new Panda(); p.name="金虎"; Keeper k = new Keeper(); k.keepName = "陈奶妈"; k.feed(p,f); } }
f 是引用的对象的一个变量,是对象名,即以该对象名命名栈中的一块地址并指向堆区中的new对象,所以f并不是对象 对象是存储在堆区的new Food()
五、自定义的类本质是一种引用数据类型
数据类型分为基本数据类型和引用数据类型,String就是一种引用数据类型
所以String的本质就是类
Keeper 饲养员类就是引用数据类型
Panda 熊猫类就是引用数据类型
所以数据类型的三种声明方式,new对象时也可以使用
Panda p=new Panda(); Panda p; p=new Panda(); Panda p1,p2,p3; p1=new Panda(); p2=new Panda(); p3=new Panda():
方法的参数及返回值类型和变量类型包括基本数据类型和引用数据类型,所以也包括自定义类
结合刚学的成员变量和方法
所以我们有两种进阶用法:
-
用自定义类型声明成员变量
-
把自定义类类型声明成成员方法中的参数类型
第一种
package com.homework.Day05.DemoAni; public class Animal { String name;//用自定义类型声明成员变量 Panda p1;//实例化属性时把Panda对象赋值给p1 这里就可以使用实例化对象的属性 //打印该熊猫最喜欢吃什么? public void eat(){ System.out.println(name+p1.name+"爱吃"+p1.favFood); } } package com.homework.Day05.DemoAni; public class Panda { String name; String favFood;//喜爱的食物 } package com.homework.Day05.DemoAni; public class TestAni { public static void main(String[] args) { Panda p=new Panda();//创建一个熊猫对象 p.name="金虎"; p.favFood="胡萝卜"; Animal a1=new Animal(); a1.name="熊猫"; a1.p1=p;//把p指向对象的内存地址赋值给p1变量 这样p1也可以指向堆区的new对象 a1.eat(); } }
输出结果:
熊猫金虎爱吃胡萝卜
第二种 把自定义类类型声明成员方法中的参数类型
动物园,有饲养员,喂动物,吃食物!
饲养员是一个类------keeper
动物是一个类----------Animal
食物是一个类---------food
package com.homework.Day05.Demo01; public class Food { String foodname; } package com.homework.Day05.Demo01; public class Panda { String name; public void eat(Food f){ System.out.println("然后"+name+"吃了"+f.foodname); } } package com.homework.Day05.Demo01; public class Keeper { String keepName; public void feed(Panda p,Food f) {//把自定义类类型声明成成员方法中的参数类型 System.out.println(keepName+"投食了"+f.foodname); p.eat(f); } } package com.homework.Day05.Demo01; import com.homework.Day05.Demo01.Food; import com.homework.Day05.Demo01.Keeper; import com.homework.Day05.Demo01.Panda; public class TestKeeper { public static void main(String[] args) { Food f = new Food(); f.foodname="今天刚空运过来的新鲜柱子"; Panda p = new Panda(); p.name="金虎"; Keeper k = new Keeper(); k.keepName = "陈奶妈"; k.feed(p,f); } }