Java笔记第四章

第四章函数

          在生活中我们要去做某件事,是在脑海中产生做某件事的想法而不是直接就细致入微的规划好前一秒什么动作后一秒又是什么动作,显然这样的做法既没有多大意义还繁琐。如此,我认为函数的运用就跟此相似。main主函数在程序中就相当于“脑”,调用函数就是产生做具体动作的想法,而动作的具体完成靠的是函数实现。

那么这有什么优缺点呢?将在下面的内容中做出解答

优点:主函数代码量降低,可读性高,便于修改,栈内存优化,代码重用

缺点:调用时会开辟堆栈内存,降低效率

 

函数的定义         

被封装出来能解决重复的具有独立功能实现的问题的代码段

函数的格式(组成部分)

       访问权限

              指的就是函数的使用范围(内部和外部)

              public,private,protected

              (默认不写)

       函数类型

              static 静态函数,abstract 抽象函数,native 本地函数,synchronized 同步函数

              (默认不写 成员函数)

       函数名【标识符】

               Ps:参考标识符命名规则和命名规范。

       参数列表

              接受外界传入函数的特定类型或可兼容的数据

       函数体  

               实现独立功能的代码块

       返回值(区分类型)

              功能实现结果,使用return。返回类型一致或可兼容。

 

函数的分类

       有/无参数,有/无返回值

函数传参

       实际参数(实参)

              就是在调用函数的时候,给函数传递的数据(常量,变量)叫做实参

       形式参数(形参)

              就是定义函数的时候,参数列表当中的数据,叫做形参

       传递内容是地址

Ⅰ.常量在常量池中的地址

Ⅱ.对象在堆中的地址

让我们看一下下面测试的运行结果:

 

public class Text{
    public static void main(String[] args){
        int[] a = new int[5];

        show(a);            //打印数组a初始值

        f(a);               //调用函数f()
        
        show(a);            //再次打印a数组

    }
    
    public static void f(int[] b){        //函数f()
        for(int i=0;i < b.length;i++)
            b[i]=1;
    }
    
    public static void show(int[] c){     //打印函数
        for(int i=0;i<c.length;i++)
            System.out.print(c[i]);
        System.oout.println();
    }
}

           a  数组初始值默认为0。数组在Java中也是对象,调用函数   f(a) 所传递的数组  a  实际上是数组  a  在堆内存中的对象的首地址。所以调用函数后数组  a  的值发生了改变。

    变量作用域,

局部变量但凡是在函数中创建的变量 称之为是局部变量 局部变量的作用域仅仅在当前的函数当中(形式参数一定是局部变量)。

 

函数栈

(函数运行基于栈内存)

       栈是一个先进后出的容器结构,函数被调用进栈(主函数绝对第一个进栈),函数结束弹栈。

 

函数的重载

       同一类中出现的同名函数,仅在参数的类型、数量、顺序上做区分

       调用传参先找是否有确切参数定义的函数;若没有再找是否有可兼容的函数;若没有则报错,引用不明确

 

 

函数的递归调用

       函数自己调用自己。利用函数的运行基于栈内存,先进后出

       递归      

递归其实是分治法的一种实现方式(一种实现思路)

       分治法是一种算法思想,分治法主要解决的问题是将大问题,进行拆分,拆分成若干个小的问题进行求解,最终将每个小问题的解进行合并。其实,分治法就是一种暴力破解法(穷举),也是一种搜索最优答案的算法

              要先写结束条件!

              先递后归;

                     前进段   指的就是讲问题从大化小

                     结束段   问题无法再继续化小,则处理当前的问题

                     返回段   将小问题处理完毕之后,向上返回(有些问题是不需要返回的)

非递归方式

import java.util.Scanner;
public class Text{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        System.out.print("Enter:");

        int n=sc.nextInt();                //键盘输入n的值

        System.out.println(fibo(n));       //调用普通函数,打印第n项的值
    }
    
    public static int fibo(int n){        //普通函数,返回第n项的值
        int a=1;
        int b=1;
        int num=1;
        for(int i=3;i<=n;i++){
            num=a + b;
            a=b;
            b=num;
        }
        return num;
    }
}

递归方式

import java.util.Scanner;
public class Text{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        System.out.print("Enter:");
        
        int n=sc.nextInt();                //键盘输入n的值

        System.out.println(fibo(n));       //调用递归函数,打印第n项的值
    }

    public static int fibo(int n){
        if(n==1||n==2)                      //结束递归的条件
            return 1;
        return fibo(n-1)+fibo(n-2);         //递归的实现
    }
}

常用函数

Math类中的函数

          Math.E;Math.PI;Math.abs();Math.pow();Math.sqrt();Math.random();……

String类及其函数

          字符串是 Java 中特殊的类,使用方法像一般的基本数据类型,被广泛应用在 Java 编程中。Java 没有内置的字符串类型,而是在标准 Java 类库中提供了一个 String 类来创建和操作字符串。
在 Java 中定义一个字符串最简单的方法是用双引号把它包围起来。这种用双引号括起来的一串字符实际上都是 String 对象,如字符串“Java”在编译后即成为 String 对象。因此也可以通过创建 String 类的实例来定义字符串。

           直接定义:

    String str = "Java";
//或

    String str;
    str = "Java";

           类定义:

    String str1 = new String("Java");
    String str2 = new String(str1);

           类中常用函数:

查询相关
    char charAt(int index)
    int indexOf(int ch)  
    int lastIndexOf(int ch)  
    int length()  
    substring(int beginIndex, int endIndex)
判断相关
    boolean contains(String s)
    boolean endsWith(String s)
    boolean startsWith(String prefix)  
    int compareTo(String anotherString)
    boolean equals(String anotherString)
    boolean equalsIgnoreCase(String anotherString)  
    boolean isEmpty()  

对字符串的修改往往都是新建个字符串将修改后内容赋值并返回新的字符串
    String replace(char oldChar, char newChar)  
    String toUpperCase()  
    String toLowerCase()  
    String trim()

注意:      

Ⅰ.对字符串的修改永远都不是对其自身进行的修改,字符串本身是不可变的

Ⅱ.不论使用哪种形式创建字符串,字符串对象一旦被创建,其值是不能改变的,但可以使用其他变量重新赋值的方式进行更改。

Ⅲ.获取长度的方法区分          字符串——>str.length();

                                               数组  ——>lilst.length;

练习程序

import java.util.Scanner;
public class Home04{
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		System.out.print("Enter:");
		String password=sc.nextLine();        //输入密码
		
                //调用判断函数,打印结果
		if(password.length()>=8&&only(password)&&atLeast(password)){ 
			System.out.println("Valid Password.");
		}else{
			System.out.println("Invalid Password.");
		}
	}
	
	public static boolean only(String p){               //判断是否只有数字和字母
		for(int i=0;i<p.length();i++){
			if((p.charAt(i)>=48&&p.charAt(i)<=57)||(p.charAt(i)>=65&&p.charAt(i)<=90)||(p.charAt(i)>=97&&p.charAt(i)<=122)){
			}else{
				return false;
			}
		}
		return true;
	}

	public static boolean atLeast(String p){            //判断数字是否大于两个
		int t=0;
		for(int i=0;i<p.length();i++){
			if(p.charAt(i)>=48&&p.charAt(i)<=57)
				t++;
		}
		return t>=2?true:false;
	}
}

import java.util.Scanner;
public class Home11{
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		System.out.print("Enter first:");
		String str1=sc.nextLine();                //输入第一个字符串
		System.out.print("Enter second:");
		String str2=sc.nextLine();                //输入第二个字符串
		
		showBig(str1,str2);                       //调用函数找最长前缀
	}
	
	public static void showBig(String s1,String s2){
                //找最长前缀,并打印
		for(int i=0;i<(s1.length()<s2.length()?s1.length():s2.length());i++){
			if(s1.charAt(i)!=s2.charAt(i)){
				if(i==0)
					System.out.println("No one!");
				break;
			}else{
				System.out.print(s1.charAt(i));
			}
		}
		System.out.println();
	}
}

import java.util.Scanner;
public class Home12{
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		System.out.print("Enter:");
		String num=sc.nextLine();                   //输入表示十六进制数的字符串
		
                //调用转换函数,打印结果
		System.out.println(hexToDecimal(num.toUpperCase()));
	}
	
	public static int hexToDecimal(String str){        //十六进制数转换为十进制数
		int number=0;	
		for(int i=0;i<str.length();i++){
			if(str.charAt(i)>=48&&str.charAt(i)<=57){
				number=number * 16 + (str.charAt(i) - 48);	
			}else if(str.charAt(i)>=65&&str.charAt(i)<=70){
				number=number * 16 + (str.charAt(i) - 65 + 10);
			}
		}
		return number;
	}
}
发布了4 篇原创文章 · 获赞 0 · 访问量 46

猜你喜欢

转载自blog.csdn.net/weixin_44576890/article/details/104322378