🐇 控制语句
type
status
date
slug
summary
tags
category
icon
password
Property
 

输入和输出

输出

使用System.out.println()来向屏幕输出一些内容,printlnprint line的缩写,表示输出并换行。如果不想换行,可以用print()
 
格式化输出
如果要把数据显示成特定的格式,就需要格式化输出。格式化输出使用System.out.printf(),通过占位符%?把后面的参数格式化成指定格式:
🦫 方法
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
对于一个java程序来说,如果没有“方法”,会存在什么问题?代码无法得到复用
怎么提高复用性?可以定义方法,然后需要使用该功能的时候,直接调用一下方法即可
 

方法的定义

修饰符列表不是必选项,是可选的,方法的修饰符可以包括:public,protected,private,abstract,static,final,synchronized,其中public,protected,private不能同时存在
 
如果没有返回值使用void关键字;如果存在返回值可以是基本类型和引用类型。 如果存在返回值,使用return语句。return语句后面不能再执行语句,因为不可能会执行到,编译器会发生错误。只要有“return”关键字的语句执行,当前方法必然结束。
如果返回值类型是void,那么在方法体当中不能有“return 值;”这样的语句。但是可以有“return;”语句,这个语句“return;”的作用就是用来终止当前方法的。
🦫 方法重载overload
type
status
date
slug
summary
tags
category
icon
password
Property
 
java语言是怎么进行方法区分的呢? java编译器会通过方法名进行区分。
但是在java语言中允许方法名相同的情况出现。如果方法名相同的情况下,编译器会通过方法的参数类型进行方法的区分。
 
什么时候需要考虑使用方法重载?
在同一个类当中,如果“功能1”和“功能2”它们的功能是相似的,那么可以考虑将它们的方法名一致,这样代码既美观,又便于后期的代码编写(容易记忆,方便使用)。
注意:方法重载overload不能随便使用,如果两个功能压根不相干,不相似,根本没关系,此时两个方法使用重载机制的话,会导致编码更麻烦。无法进行方法功能的区分。
 
 
什么时候代码会发生方法重载?
  • 条件1:在同一个类当中
  • 条件2:方法名相同
🦫 方法递归
type
status
date
slug
summary
tags
category
icon
password
Property
 
方法自己调用自己,这就是方法递归
 
当递归时程序没有结束条件,一定会发生:栈内存溢出错误StackOverflowError,所以递归必须要有结束条件
 
递归假设是有结束条件的,就一定不会发生栈内存溢出错误吗?
假设这个结束条件是对的,是合法的,递归有的时候也会出现栈内存溢出错误,因为有可能递归的太深,一直在压栈,栈内存不够了。
 
 
notion image
🐿️ 类和实例
type
status
date
slug
summary
tags
category
icon
password
Property
 
现实世界中定义了“人”这种抽象概念,而具体的人则是“小明”、“小红”、“小军”等一个个具体的人。所以“人”可以定义为一个类(class),而具体的人则是实例(instance):
notion image
  • class是一种对象模版,它定义了如何创建实例,因此class本身就是一种数据类型
  • instance是对象实例,instance是根据class创建的实例,可以创建多个instance,每个instance类型相同,但各自属性可能不相同
 

定义class

创建一个类,类命名为Person
一个class可以包含多个字段(field),字段用来描述一个类的特征。Person类定义了两个字段,一个是String类型的字段,命名为name,一个是int类型的字段,命名为age
通过class,把一组数据汇集到一个对象上,实现了数据封装。
 
🐿️ 封装
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
一个class可以包含多个field
 
直接把fieldpublic暴露给外部可能会破坏封装性:
显然,直接操作field容易造成逻辑混乱。为了避免外部代码直接去访问field,可以用private修饰field,拒绝外部访问:
直接操作private修饰的field: 报错java: name 在 Person 中是 private 访问控制
 
🐿️ 构造方法
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
创建实例的时候经常需要同时初始化这个实例的字段,例如:
初始化对象实例需要3行代码,如果忘了调用setName()或者setAge(),这个实例内部的状态就是不正确的。
 
能否在创建对象实例时就把内部字段全部初始化为合适的值?
完全可以,这时就需要构造方法。

构造方法

创建实例的时候,实际上是通过构造方法来初始化实例的。
构造方法的名称就是类名。构造方法的参数没有限制,在方法内部可以编写任意语句。和普通方法相比,构造方法没有返回值(也没有void),调用构造方法,必须用new操作符。
 
🐿️ 继承 extends
type
status
date
slug
summary
tags
category
icon
password
Property
 
如果已经定义了Person类:
现在,假设需要定义一个Student类,字段如下:
 
Student类包含Person类已有的字段和方法,只是多了一个score字段和相应的getScore()setScore()方法。
能不能在Student中不要写重复的代码?
这个时候,继承就派上用场了。
 

继承

继承是面向对象编程中非常强大的一种机制,可以复用代码。StudentPerson继承时,获得了Person的所有功能,我们只需要为Student编写新增的功能。
🐿️ 多态
type
status
date
slug
summary
tags
category
icon
password
Property
 

覆写

在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,被称为覆写(Override)
Person类中定义了run()方法:
在子类Student中,覆写这个run()方法:
Override和Overload不同的是,如果方法签名不同,就是Overload,Overload方法是一个新方法;如果方法签名相同,并且返回值也相同,就是Override
注:方法名相同,方法参数相同,但方法返回值不同,也是不同的方法。在Java程序中,出现这种情况,编译器会报错。
 
 
🐿️ 抽象类
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
由于多态的存在,每个子类都可以覆写父类的方法,例如:
Person类派生的StudentTeacher都可以覆写run()方法。
 
如果父类Personrun()方法没有实际意义,能否去掉方法的执行语句?
编译错误,因为定义方法的时候,必须实现方法的语句。
能不能去掉父类的run()方法?
答案还是不行,因为去掉父类的run()方法,就失去了多态的特性:
🐿️ 接口
type
status
date
slug
summary
tags
category
icon
password
Property
 
在抽象类中,抽象方法本质上是定义接口规范:即规定高层类的接口,从而保证所有子类都有相同的接口实现,这样,多态就能发挥出威力。
如果一个抽象类没有字段,所有方法全部都是抽象方法
就可以把该抽象类改写为接口:interface
 
在Java中,使用interface可以声明一个接口:
所谓interface,就是比抽象类还要抽象的纯抽象接口,因为它连字段都不能有。
因为接口定义的所有方法默认都是public abstract的,所以这两个修饰符不需要写出来(写不写效果都一样)
 
当一个具体的class去实现一个interface时,需要使用implements关键字:
🐿️ static关键字
type
status
date
slug
summary
tags
category
icon
password
Property
 

静态字段

在一个class中定义的字段为实例字段。实例字段的特点是,每个实例都有独立的字段,各个实例的同名字段互不影响。
还有一种字段,用static修饰的字段,称为静态字段(static field
 
实例字段在每个实例中都有自己的一个独立“空间”;静态字段只有一个共享“空间”,所有实例都会共享该字段:
 
对于静态字段,无论修改哪个实例的静态字段,效果都是一样的:所有实例的静态字段都被修改了,原因是静态字段并不属于实例:
notion image
虽然实例可以访问静态字段,但是它们指向的其实都是Person class的静态字段。所以,所有实例共享一个静态字段。