Java 函数、类、接口


 

函数

递归函数

在方法体内调用方法本身,方法要有出口。
eg. 已知一个数列,f(0)=1,f(1)=4,f(n+2)=2*f(n+1)+f(n),其中n是>=0的整数,求f(10)的值。

public int f(int n) {
    if (n == 0)
        return 1;
    else if (n == 1)
        return 4;
    else
        return f(n - 1) * 2 + f(n - 2);
}

f(10)

 

函数重载

同一个类中,方法名相同,形参表不同(数据类型、参数个数)。

与返回值类型、修饰符无关。

 

参数个数可变

// 放在形参表末尾,调用时该位置可传入0-n个参数,要求类型都是指定类型
public void out(String str, String... args) {
	// 实质是以数组方式传入,所以用数组方式来操作
    for (String arg : args) {
        System.out.println(arg);
    }
}

 

传参方式

java只有一种传参方式:传值,把实参的值拷贝一份传给形参。

拷贝是浅拷贝,基本数据类型、String,拷贝的就是数值常量、字符串常量,修改形参实参不受影响;如果参数是引用类型,比如Map对象、User对象,拷贝的是引用,形参、实参指向同一个对象,修改形参就是修改实参。

 

面向对象的3大特性:封装、继承、多态
 

继承

在子类的构造函数中,可以

super(xxx);   //调用父类带参的构造函数,必须放在方法体的第一行

如果在构造函数中没有显式调用父类的构造函数,会在执行构造函数之前自动调用父类无参的构造函数。
 

重写父类的方法

  • 方法名相同、形参表相同
  • 如果父类方法是类方法(static)| 实例方法,子类方法也要是static | 实例方法,与父类保持一致
  • 子类方法的返回值类型要 <= 父类方法的返回值类型
  • 子类方法抛出的异常类型要 <= 父类方法抛出的异常类型
  • 子类方法的访问权限要 >= 父类方法的访问权限
     

在子类中访问父类的成员

super(xxx)  //调用父类的构造函数
super.xxx   //访问父类的成员变量(要有权限才可以)
super.xxx(xxx)  //调用父类的成员方法

 
创建对象时,会先初始化这个类所有的父类。

 

多态

引用型变量有2个类型:编译时类型、运行时类型。

编译时类型是声明该变量时的类型,运行时类型是实际赋给该变量的类型。

多态:运行时类型可以不一致。
 

public void f(User user) {

}

编译时类型是User,假设User有2个子类Student、Teacher,运行时可以传入Student、Teacher类的对象,类型不一致,即多态。
 

判断某个引用型变量是否是某个类 | 接口的实例

User user = new User();
if(user instanceof User){  //返回boolean值

}

变量 instanceof 类 | 接口名,变量要声明为该类|接口类型,否则通不过编译。

 

内部类

类中可以嵌套其它类

class Outer {
    //......

    class Inner {
        //.......
    }
    
}

 
匿名内部类没有类名,只能使用一次,用来实现接口、抽象类,会在该处创建匿名内部类的一个实例

new 接口|抽象类{

}

 

枚举类

枚举是一种特殊的类,用来表示常量的集合,比如订单状态、用户角色、职称、等级。
 
以前的方式

public class Role {
    public static final String COMMON = "common";
    public static final String VIP = "vip";
    public static final String SVIP = "svip";
}

 
枚举

// 可以不写值,使用时当做Role的静态实例来使用
public enum Role {
    COMMON, VIP, SVIP;  //都是Role的实例,类型都是Role
}


// 也可以写值
public enum Role {
    COMMON("common"), VIP("vip"), SVIP("svip");

    // 提供一个成员变量来存储值。要提供对应的构造函数、getter方法
    private String role;

    private Role(String role) {
        this.role = role;
    }

	// 值是String类型,实例是Role类型,值和实例不能直接比较,实例要先调用getter方法获取对应的值
    public String getRole() {
        return this.role;
    }
}

 

抽象类

public abstract class Xxx {
    //.....

    public abstract String Xxx();

}

抽象类使用abstract修饰,不能创建实例,是用来被继承、重写的。

抽象方法使用abstract修饰,没有方法体。

抽象类中可以不含抽象方法,但如果类中有抽象方法,该类必须声明为抽象类。

 

接口

类是对实例的抽象,抽象类、接口是对类的抽象。

接口定义程序设计规范,本身并不提供任何实现,体现了规范(设计)、实现分离的设计方式。


public interface Xxx {
    // 成员变量默认使用public static final修饰,即常量,在声明时就必须指定初始值
    String XXX = "";

    // 方法默认使用public abstract修饰
    String xxx();


    // 可以定义默认方法,但必须要有方法体
    default void test2() {

    }

    //接口中可以定义静态方法方法,但必须要有方法体,默认使用(也只能使用)public修饰
    static void test3() {

    }

    // 内部也可以定义类、接口、接口,均默认使用(也只能使用)public static修饰

    // 不能有构造函数、初始化块、私有方法

}

 


// 类只支持单继承,接口支持多继承
class 类A extends 类B {

}

interface 接口A extends 接口B, 接口C {

}


// 一个类可以实现多个接口
class 类A implements 接口A, 接口B {

}

// 类在继承的同时可以实现接口
class 类A extends 类B implements 接口A, 接口B {
    
}

 

final关键字

final可修饰类、变量(包括成员变量、局部变量)、方法

  • 被final修饰的类不能被继承
  • 被final修饰的变量,声明时就必须赋值,后续不能修改其值:基本类型、String类型不能改变值,引用类型不能修改对象的引用(内存地址),但可以修改堆中相应的对象。
  • 被final修饰的方法不能被重写

 

初始化块

初始化块和成员变量、成员函数一个级别,一般用于初始化。

class Xxx {
    // 普通初始化块
    {

    }


    // 静态初始化块
    static {

    }


    // ......

}

一个类中可以有多个初始化块,如果都是static初始化块或者普通初始化块,越靠前的越先执行。

static初始化快只能访问类的静态成员,只在JVM加载类的class对象时执行1次,常用于初始化类的静态成员、公共资源。

编译时,会把普通初始化块中的代码放到构造函数函数体内的最前面。每次创建对象时,在执行构造函数之前,都会先执行普通初始化快。普通初始化快常用与初始化对象。

 

lambda表达式

函数式接口:接口中的抽象方法有且只有1个。可以有其它成员,但抽象方法必须要有且只能有1个。


@FunctionalInterface   //声明为函数式接口
interface FI {
    void out(String str1,String str2);
}


class T{
    
    // lambda表达式
    private FI fi = (str,str2) -> {  //参数表直接写参数名,不写类型
        System.out.println(str + " " + str2);
    };
    
}

lambda表达式用于实现函数式接口、并在该处创建一个实例,和匿名内部类相似,但匿名内部类可以实现任何抽象类、接口,lambda表达式只能实现函数式接口。
 

lambda表达式语法

(形参表) -> {  //形参表不写参数类型,直接写参数名
  //......
}

lambda表达式其实就是函数式接口中抽象方法的实现。

只有一个形参时,可以缺省();函数体只有一条语句,且该语句是return语句时,可以缺省{ }、关键字return。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读