写点什么

java 之面向对象 2

作者:喜羊羊
  • 2022 年 9 月 12 日
    河南
  • 本文字数:2355 字

    阅读完需:约 8 分钟

java之面向对象2

目录


内存解析


匿名对象


方法重载


可变个数的形参


方法参数的值传递机制


递归方法的调用


理解“万事万物皆对象”


内存解析栈(stak):


存放基本类型的数据和对象的引用,即存放变量。


如果存放的是基本类型数据(非静态变量),则直接将变量名和值存入 stack 中的内存中;


如果是引用类型,则将变量名存入栈,然后指向它 new 出的对象(存放在堆中)。


举一个交换数值的简单例子,在栈和堆内分别分配内存空间


堆(heap):


存放 new 产生的数据


分为静态域和常量域。


这里暂时不解析常量池


举一个简单交换数值的例子


匿名对象


匿名对象的使用


1.理解:我们创建的对象,没有显式的赋给一个变量名。 即为匿名对象


2.特征:匿名对象只能调用一次。


3.使用:如下


class Student {public void show() {System.out.println("小明爱学 java");}}


class StudentDemo {public void method(Student s) {s.show();}}


class NoNameDemo {public static void main(String[] args) {//带名字的调用 Student s = new Student();s.show();s.show();System.out.println("***************");


  //匿名对象  //new Student();  //匿名对象调用方法  new Student().show();  new Student().show(); //这里其实是重新创建了一个新的对象  System.out.println("**************");      //匿名对象作为实际参数传递  StudentDemo sd = new StudentDemo();  //Student ss = new Student();  //sd.method(ss); //这里的s是一个实际参数  //匿名对象  sd.method(new Student());    }
复制代码


}


方法重载 1.定义:在一个类中,允许存在一个以上的同名方法,只要他们的参数个数或者参数类型不同即可


方法的重载是指一个类中可以定义有相同的名字,但参数不同的多个方法。调用时,会根据不同的参数表选择对应的方法。


“两同一不同”:


同一个类,同一个方法名。


不同:参数列表不同(类型,个数,顺序不同)


只有返回值不同,不构成方法的重载。


2.举例:


arrays 类中重载的 sort( ) / binarySearch( );


3.判断是否是重载:


与方法的权限修饰符,返回值类型,形参变量名,方法体都没有关系


与 void show(int a,char b,double c)}构成重载的有:


void show(int x,char y,double z){} // no


int show(int a,double c,char b){} // yes


void show(int a,double c,char b){} // yes


boolean show(int c,char b){} // yes


void show(double c){} // yes


double show(int x,char y,double z){} // no


void shows(){double c} // no


在进行使用时,要注意有些情况


(输出 ‘ 2 ’ );


比如这里,如果将第一种方式注释掉,系统会将两个数值自动类型提升!


可变个数的形参


说明:


1.声明格式:方法名(参数的类型名...参数名)


2.可变参数:方法参数部分指定类型的参数个数是可变多个: 0 个,1 个或多个


3.可变个数形参的方法与同名的方法之间,彼此构成重载


4.可变参数方法的使用与方法参数部分使用数组是一致的


5.方法的参数部分有可变形参,需要放在形参声明的最后


6.在一一个方法的形参位置,最多只能声明一一个可变个数形参


这里用图片说明一下:


方法参数的值传递机制


方法的形参的传递机制:值传递


  1. 形参:方法定义时,声明的小括号内的参数实参:方法调用时,实际传递给形参的数据 2.值传递机制:如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值


如果参数是引用数据类型,此时实参赋给形参的是实参存储数据的地址值


这里来一道面试题说明一下值传递:


正确的写法:法一:public static void method(int a, int b) {//在不改变原本题目的前提下,如何写这个函数才能在 main 函数中输出 a=100,b=200a = a10;b = b20;System.out.println(a);System.out.println(b);System.exit(O);//退出}


法二:PrintStream ps = new PrintStream(System.out){


public void println(String x) {if("a=10".equals(x)){X ="a=100";}else if("b=10",equaIs(x)){x= "b=200";super.println(x);};System.setOut(ps);


错误(哒咩)public static void method(int a, int b) {a = 100;b = 200;System.out.println(a);System.out.println(b);}


递归方法的调用递归调用是一种特殊的调用形式,指的是方法自己调用自己的形式,但是在进行递归操作的时候必须满足以下的几个条件。一、递归调用必须有结束条件。二、每次调用的时候都需要根据需求改变传递的参数内容。


public class RecursionTest{public static void main(String[] args){// 例题 1:计算 1-100 之间所有自然数的和// 方式 1int sum = 0;for (int i = 1; i <= 100; i++) {sum += i;}System.out.println(sum);


  // 方式2  RecursionTest test = new RecursionTest();  int sum1 = test.getSum(100);  System.out.println(sum1);
System.out.println("-------------------"); int value = test.f(10); System.out.println(value);}
// 例题1:计算1-n之间所有自然数的和public int getSum(int n) // 3{ if (n == 1) { return 1; } else { return n + getSum(n - 1); }}
// 例2:计算1-n之间所有自然数的乘积 n!public int getSum1(int n){ if (n == 1) { return 1; } else { return n * getSum1(n - 1); }}
// 例题3:已知有一个数列: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 + 2) - 2 * f(n + 1);(哒咩)return 2 * f(n - 1) + f(n - 2);}}


}


理解“万事万物皆对象”(了解)1.在 Java 语言范畴中,我们都将功能、结构等封装到类中,通过类的实例化,来调用具体的功能结构 1.1Scanner, String 等 1.2 文件: File1.3 网络资源: URL2.涉及到 Java 语言与前端 Html、后端的数据库交互时,前后端的结构在 Java 层面交互时,都体现为类、对象。


发布于: 刚刚阅读数: 3
用户头像

喜羊羊

关注

还未添加个人签名 2022.09.01 加入

还未添加个人简介

评论

发布
暂无评论
java之面向对象2_java;_喜羊羊_InfoQ写作社区