面向对象编程(OOP)
Object Oriented Programming
对象 : Object
C 面向过程
C++ 半面向过程半面向对象
Java 面向对象: 把大象装进冰箱.
介绍
什么是类
具有相同特点(属性)和行为(动作)的集合的总称.
人类
植物类
属性和行为
什么是对象
是某一类的具体体现 实例
将类的抽象概念具体化.
人类的对象: 张三,特朗普,…
植物类的对象 : 路边的梧桐,杨树
手机类的对象 : 正在使用的手机
什么是属性
是一类事物的特点/特征.
人类的属性/特征 : 肤色,年龄,身高,体重…
植物类的属性 : 树干,树叶,树根,花,果实
手机的属性 : 价格,重量,颜色,形状
什么是方法
一类事物都可以进行的动作/行为.
人类的动作 : 吃饭睡觉打豆豆
植物的动作 : 开花,结果,光合作用
手机的动作 : 打电话,发短信
方法
什么是方法?
方法:在程序中要去实现的某一个功能,需要包含多条语句,这些语句包含循环语句结构,选择语句结构等共同来处理一件事情.
定义方法的格式详解
public static void main(String[] args){
//执行语句
System.out.println();
}
* [访问修饰符] 返回值类型 方法名([参数1],[参数2],...){
* 方法内的执行语句;
* ...
* }
* 访问修饰符 : 控制访问权限
* 返回值类型 : 该方法执行后返回的结果的数据类型
* 基本数据类型/引用数据类型
* void : 空,方法执行后不返回任何数据
* ---
* 如果方法需要返回数据,
* 1) 那就需要在返回值类型处写上返回数据的数据类型
* 2) 在方法体的最后使用 return 值;的格式将值明确显示返回.
* 3)只要不是void,必须在方法后加: return 值;
* 4)return 后只能有一值;
* 5)如果需要返回多个值需要将多个值放进数组或方法,将数组或方法返回
* eg.public static void main(String[] args){
* int[] arr = returnMoreValue(1,2);
* System.out.println(arr[0]);
* System.out.println(arr[1]);
* }
* //方法执行返回多个值:2个值为例
* //需要将多个值放入数组,将数组返回
* public static int[] returnMoreValue(int a,int b){
* int[] arr = new int[2];
* arr[0] = a;
* arr[1] = b;
* return arr;
* }
* 方法名 : 见名知意,驼峰原则
* () 参数列表 :
* 1 形式参数 : 该方法执行可能用到的数据
* 2 形式参数的写法: 数据类型 变量名;
* 3 列表内可以写多个参数,多个参数之间用逗号隔开,或者可以不写
* 4 当方法参数列表有参数时,在调用时(让方法执行时)
* 就必须给方法的参数赋值
* 参数类型:进入方法当中的数据是一个什么样的类型
* 参数名称:进入方法当中的数据对应的变量名称
* {
} 方法体
* 备注:方法不允许嵌套
* 执行语句 : 该方法真正的功能体现
Java中方法的分类
JAVA中方法的分类
构造方法
- 概述: 构造方法存在于类中,用于给对象(属性)初始化.
- 构造方法:类或者抽象类中(接口没有),与类名同名,无返回值,不能用static修饰。
- 格式:权限修饰符 类名(参数){方法体}
- 作用:初始化实例对象。
- 调用:创建类的实例对象时,自动调用。
- 继承性:无参构造其子类会自动调用父类的无斜体样式参构造supper()。含参构造不会被继承。
//顾客类的有参构造方法
public Customer(String name, String idCard, String tel, String address) {
this.name = name;
IdCard = idCard;
this.tel = tel;
this.address = address;
}
注意:构造方法分为含参构造和无参构造。JAVA会在编译时自动生成无参构造,但若书写了含参构造,则必须自己写无参构造,否则只能调用含参构造。
静态方法
- 定义:类/接口中,用static修饰的方法。
- 格式: 权限修饰符 static 返回值类型 方法名(参数){} (static可与final,private共存)
- 特点:
- 静态方法属于整个类,不单独属于类的某一个对象。
- 静态方法类加载便存在,比对象先存在,随类而消亡。
- 调用:
- *类名/接口名.静态方法或者 实例对象.静态方法名 两种方式调用,建议使用第一种。
- 静态方法可以调用静态成员,不能调用非静态成员。(其先于非静态成员产生)。
- 继承性:
- 类(包括抽象类)其静态方法是可以被继承的。即可以通过:子类名/子类对象.静态方法的方式进行调用。
- 接口的静态方法不能被其实现类或者子接口继承。即不能采用:实现类名/实现类对象名/子接口名.静态方法名的方式进行调用。
// 接口1
public interface MyInter1 {
public static void fly(){
}
}
// 接口2 继承于接口1
public interface MyInter2 extends MyInter1{
}
// 实现类实现接口1
public class Myclass implements MyInter1{
}
// 测试类
public class Test02 {
public static void main(String[] args) {
Myclass myclass = new Myclass();
MyInter1.fly();
// Myclass.fly(); 错误,接口中的静态方法不能被其实现类继承
// myclass.fly(); 错误,接口中的静态方法不能被其实现类继承
// MyInter2.fly(); 错误,接口中的静态方法不能被子接口继承
}
}
实例/默认方法
- 定义:类中/接口中无static修饰的方法,类中无特殊修饰符,接口中用default修饰
- 格式:
类或者抽象类中:权限修饰符 返回值类型 方法名(参数) {方法体}
接口中:权限修饰符default 返回值 方法名 (参数) {方法体} - 特点:实例/默认方法属于类的实例对象.随时对象创建而加载,对象消失而消亡.
- 调用:只能通过:实例对象/接口的实现类对象.方法名进行调用
- 继承性:可以被子类继承(接口亦然)
// 接口
public interface MyInter3 {
public default void eat(){
System.out.println("走起,咱今天吃火锅去!");
}
}
// 类
public class Myclass3 {
public void eat(){
System.out.println("走起,咱今天吃海鲜去!");
}
}
// 测试类
public class Test03 {
public static void main(String[] args) {
// Myclass3.eat(); // 错误,不能使用类名调用。
new Myclass3().eat(); // 可以通过实例对象调用
// MyInter3.eat(); // 错误,不能使用接口名调用
new MyInter3(){
}.eat(); // 可以通过接口的实现类对象调用,这里匿名内部类实际上是接口的实现类对象。
}
}
抽象方法
-
定义:抽象类或者接口中,用abstract修饰的方法
-
格式:权限修饰符 abstract 返回值类型 方法名(参数);(abstract 不能与static 和final修饰符共存)
-
特点:必须被子类重写,无方法体
-
调用:子类重写后。按照实例方式的调用方式进行调用。
-
继承性:必须重写,谈不上继承不继承。
// 抽象类
public abstract class AbstractClass01 {
// 抽象方法
public abstract void fun();
}
// 子类继承于抽象类
public class Myclass4 extends AbstractClass01{
// 重写抽象方法
@Override
public void fun() {
System.out.println("玩得真开心");
}
}
// 测试类
public class Test04 {
public static void main(String[] args) {
// 创建对象使用重写后的抽象方法
new Myclass4().fun();
}
}
// 运行结果
玩得真开心
私有方法
- 定义:使用private权限修饰符修饰的方法
- 格式:private 返回值类型 方法名(参数){方法体} (private 可以与static,final,abstract共存)
- 特点:private只属于本类,不属于其子类对象。
- 调用:本类可直接调用,其他类或者子类或者该类对象,只能通过类中其他方法进行间接调用。
- 继承性:可以被子类继承(接口亦然),当也只能通过类中其他方法进行间接调用。
// 父类包含私有方法
public class Myclass5 {
// 私有方法
private void eat() {
System.out.print("吃 ");
}
// 公有实例方法
public void fun(){
eat();
System.out.println("玩");
}
}
// 子类
public class Myclass6 extends Myclass5{
}
// 测试类
public class Test05 {
public static void main(String[] args) {
// 创建对象
Myclass5 my = new Myclass5();
// my.eat; // 报错,不能直接调用私有方法。
my.fun(); // 可以间接调用私有方法
// 子类对象间接调用
System.out.println("分割线===========");
new Myclass6().fun();
}
}
数组作为方法参数和返回值
数组作为方法参数
数组作为应用类型能够当成方法的参数进行传递呢?当然可以
- 数组作为方法参数传递,传递的参数是数组内存的地址
public static void main(String[] args){
int[] arr = {
1,2,3,4,5};
//调用方法,传递数组
println(arr);
}
public static void println(int[] arr){
for (int i