目录
面向过程和面向对象
- 面向过程:面向过程就是分析出实现需求需要的步骤,通过一些方法来一步一步实现
- 面向对象(行为化):把整个需求的按照特点、功能划分,将这些存在共性的部分封装成类(类实例化之后才是对象),让对象去解决问题
举例:七夕,你想送你女朋友一个包
面向对象:找个店,买个包。不管是商家,还是包,都是现实中真实存在的事物。这个商店或者包我们就可以称之为对象,在整个的你去买包或者商家卖包,我们忽略了一个过程:包是怎么加工的。
面向过程:找原材料,自己缝制,每一个工序都自己干。
·其实高级的编程语言,就会向着人的思考靠近
·面向对象是更高级的抽象,是对现实世界的映射。
·String Scanner 我们在使用Scanner时,从来没考虑过Scanner为什么能实现键盘输入,这就是别人给我们创建的对象,事实上我们也能自己创建对象。在开发中基本上我们会大量的自己创建自己的对象。
举例:我们准备开4s店,需要有车,需要有门店,尝试去搞一个4s店
先说说我们怎么用代码去描述一辆车:
车:描述信息,描述信息叫做属性,属性实际上从代码的角度来说就是变量
定义变量 :brand color length
问题:怎么描述好几台车?
我们可能会需要几十个甚至上百个数组来维护一百辆车的信息。
这时,我们就要用面向对象的思想,我们将一个汽车的多个属性尝试进行打包,这个过程实际上就是在封装对象。
在Java中,面向对象有三(四)大特征:
- 封装
- 继承
- 多态
- 抽象
造车必须有一个图纸,根据图纸可以造一百台车。这个图纸就是在描述车的具体信息,对车的信息的封装。
封装
1.代码层面
2.思想层面*(最难的,最重要的)
如果把变量直接声明在类里:成员变量(全局变量)
如果把变量声明在某个方法里:局部变量,在某一个范围内才好使。
成员方法
创建对象的过程,类的实例化的过程,对象又叫做类的一个实例
我们创建了一个Car类的对象car1,这个car1就是对象的名。其实这个car1就是个标识符。
·*对象名的命名规则:小驼峰
·*创建对象的语法:类名 对象名 = new 类名( );类名 对象名 = new 构造器(类名())
方法名不能重复
如果一个方法有static
要调用一个非static得方法
就只能创建对象,使用对象,方法得形式使用
自己调自己:递归
递归问题:StackOverflowError 栈溢出(内存溢出)
开发中,到底要不要用递归?如果用的话,要注意什么?
属性
成员方法就相当于js里的函数
public void run(){ System.out.println("我在这里"); }
public------访问权限修饰符
void---------代表没有返回值
run( )-------方法名(标识符)
{ }-----------方法体(这个方法要干啥)
( )-----------用于传参数
ps:参数可以有多个,中间用逗号隔开,Java中的传参需要明确数据类型
在声明方法时,括号里的参数:形式参数(形参),可以当做局部变量使用
在调用方法时,形参是在声明处,实参是在调用处
返回值
boolean、int、基本数据类型都属于返回值类型
方法进行结束时,需要返回一个返回值,返回值的类型就是你在建立方法时设置的基本数据类型
返回值使用:return xxx; 类型要匹配
有返回值的方法在执行后会得到一个具体的值,这个值可以存下来
那么到底什么时候要有返回值,什么时候没有返回值?
其实开发中,大部分的方法都有返回值,void里也可以填写返回值。
return关键字
return关键字终止方法继续执行
返回方法的返回值
主方法
main方法就是主方法,除了main其他都不可执行,只有main可以执行
递归
递归是什么?
简而言之:递归就是一个方法之中,自己调用自己。
实现递归的直观展示:斐波那契数列
斐波那契数列:
下一个数字是前两个数字之和:
eg:0,1,1,2,3,5,8...
我们知道除了0和1,第number个数字等于第number-1个数和第number-2个数的和
运用递归的方式:
public int feibonaqie(int number){
if(number>1){
return feibonaqie(number-1)+feibonaqie(number-2);
}else {
return number;
}
}
再来看一个例子:求阶层
public int jc(int number){
if(number<=1){//递归的方法;
return 1;
}
return number*jc(number-1);
}
方法的重载(Overload):
方法的重载是指一个类中可以定义有相同的名字,但参数不同的多个方法。调用时,会根据不同的参数表选择对应的方法。方法的重载即:同名不同参
重载要求:
方法名相同
参数不同{
1.参数类型不同
2.参数个数
3.参数的顺序
}
与返回值类型无关,与访问权限修饰符无关,与方法体无关
发生在同一个类里重载的好处:
不用为了对不同的参数类型或参数个数,而写多个函数,系统可以自动匹配;
多个函数用同一个名字,但参数表,即参数的个数或(和)数据类型可以不同,调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数。
代码展示
public int max(int num1, int num2){
int max=num1>num2?num1:num2;//求两个数的最大值
return max;
}
public int max(int num1,int num2,int num3){
int max1=num1>num2?num1:num2;//求三个数的最大值
int max=max1>num3?max1:num3;
return max;
}
主方法运行:
public static void main(String[] args) {
test03 x=new test03();
System.out.println(x.max(1,3));
System.out.println(x.max(1,3,5));
}
运行结果:
3----自动调用两个参数的方法
5----自动调用三个参数的方法
不定长参数:
public int sum(int...arr){
int result=0;
if(arr.length<2){
result=arr[0];
}else{
for (int i : arr) {
result+=i;
}
}
return result;
}
public static void main(String[] args) {
test03 x=new test03();
System.out.println(x.sum(1,5,6));
}
访问权限
public:一个工程下任意位置都可以访问
类,属性上,方法,构造器
protected:可以跨包,如果跨包,必须是他的子类
属性,方法,构造器
(默认的):当前包下可以访问
类,属性,方法,构造器
private:只有当前类可以访问
属性,方法,构造器
构造器(构造方法)
语法:访问权限修饰符 类名(参数列表){ }
public a(){}
特点:Java在new对象的时候,先看对象所对应的类有没有构造器,有的话有什么样的构造器;如果没有构造器,则无法构建对象(创建对象)
每个类会有一个默认的无参的构造器
在对象被实例化时调用了构造器
我们创建对象实际上是通过构造器创建的
如果一个类中显示的声明了一个构造器,原来默认自带的无参构造器就没用了。如果方法有多个构造器,方法必须重载。
方法的重写
方法重写基于继承,子类继承父类,子类可以调用父类的方法,同时子类也可以重写父类中的方法,来实现和父类中不同的业务处理逻辑。重写要求子类中方法与父类中的方法名称仙童,参数相同,参数类型相同。当子类调用该方法时,基类中的方法则被覆盖。方法重写即:重写父类方法,同名也同参
示例:动物会叫,叫声各不相同
动物类
public class Animal {
public void speek(){
System.out.println("动物都会叫");
}
}
狗类,继承自动物类
class Dog extends Animal {
/*
重写父类的speek方法
*/
@Override
public void speek() {
System.out.println("汪汪汪");
}
}
猫类,继承自动物类
class Cat extends Animal {
/*
重写父类的speek方法
*/
@Override
public void speek() {
System.out.println("喵喵喵");
}
}
重点
- 之前我们学习过8中基本数据类型
- 从今天开始我们的数据类型就更多了,我们能够遇见的所有的类,包括我们刚刚创建的Car 是一种数据类型。(除了基本数据类型,其他都是引用数据类型)。所有的类都是引用数据类型
·此刻起,我们才真正了解了class这个关键字,用来创建一个类,用来创建一个数据类型,因为类就是一个数据类型。像car1,car2,car3......car100叫引用,它是指向内存中的一块区域,存放 空间,我们叫做堆。
我们需要了解两块内存空间:
- 栈:我们存的是变量和基本数据类型(特点:先进后出)地址是一个十六进制的字符串
- 堆
引用数据类型的初始值为null
赋值时除了String以外,其余的引用数据类型都需要new
成员方法:(JS)里的函数
定义一个成员方法
public :访问权限修饰符
void :没有返回值
run( ):方法名(标识符)
{ }:方法体(这个方法要干哪些事)
( ):传参数
·参数可以有多个,中间用逗号隔开
·Java中的传参需要明确数据类型
·在声明方法时,括号里的参数:形式参数(形参),可以当做局部变量使用
·在调用方法时,
形参是在声明处,实参是在调用处
有返回值的方法
public
boolean:返回值类型,我这个方法经过一系列的运行过后,要得到一个具体的值,返回值,返回值的类型是boolean
返回值用return xxx; 类型要匹配
有返回值的方法在执行后会得到一个具体的值,这个值可以存下来
到底什么时候要有返回值,什么时候没有返回值?
开发中,大部分的方法都有返回值
return关键字
- return关键字终止方法继续执行
- 返回方法的返回值
问题:在void的方法中,能不能有return?
能
标识符的命名规则:
(字母、数字、下划线、美元符号、数字不能开头)
- 类名:大驼峰(所有单词的首字母大写)
- 属性名、方法名:小驼峰(除了第一个单词,其他的单词的首字母大写)
省略一部分要执行的代码
在一个方法中调用其他方法
访问权限修饰符
- public 共有的,公共的 权限最大,只要是public声明的方法,只要在同一个工程中,都能用。
·可以放在类、属性、方法、构造器上
- protected 受保护的:可以跨包,如果跨包必须是它的子类
·可以放在属性、方法、构造器上
- 默认的(啥也不写)default:只有当前包下可以访问(把包导进来也不行)
·可以放在类、属性、方法、构造器上
- private 私有的 权限最小,只有在当前类才能用
·可以放在属性、方法、构造器上
成员方法
- 方法名不能重复
·如果一个方法有static,要调用一个非static的方法,就只能创建对象,使用对象.方法的形式调用
Ch01 c = new Ch01( ) ;
c.run( );
·自己调自己:递归
·递归的问题:StackOverflowError 栈溢出(内存溢出)
在开发中到底要不要用递归?如果用的话,要注意什么?
斐波那契数列
方法的重载(OverLoad)
要求和特点:
- 方法名相同
- 参数不同才能构成方法的重载
- 参数的类型不同
- 参数的个数不同
- 参数的顺序不同
·与返回值类型无关;与访问权限修饰符无关;与方法体无关。方法的重载只跟参数有关
- 方法的重载一定是发生在同一个类里
方法的重载的好处
为了把功能相似甚至是相同的方法可以用同一个名字
不定长参数
- 参数列表中只能(至多)有一个不定长参数
- 不定长参数必须在最后位置
·不定长参数的本质是数组
·java.lang包下的所有的类不需要显式的导入,剩下的都需要导包
构造器(构造方法)
语法:访问权限修饰符 类名(参数列表){ }
特点(特性):
- Java在new对象的时候,先看对象所对应的类有没有构造器,有的话有什么样的构造器;如果没有构造器,则无法构建对象(创建对象)
- 每个类会有一个默认的无参的构造器
- 在对象被实例化时调用了构造器
- 我们创建对象实际上是通过构造器创建的
- 如果一个类中显示的声明了一个构造器,原来默认自带的无参构造器就失效(被覆盖)。如果有多个构造器,必须重载。
类与类之间的关系(2种)
1.has a的关系(包含、使用、有的关系)
eg:人有一只猫
总结
今天学习了面向对象的程序,例如:类、方法、参数的使用和调用。
封装和成员方法、递归、不定长参数、重载,其中递归的实际应用——斐波那契数列,让我认知焕然一新。
过程虽然枯燥,但这是为了之后的知识奠定基础,所以今天知识在课后依然有复习,并且通过课堂作业进行了巩固,今天又是知识满满的一天!