java必备基础1(概述、语法基础、虚拟机、面向对象)

编程入门 行业动态 更新时间:2024-10-12 05:46:47

java必备<a href=https://www.elefans.com/category/jswz/34/1770030.html style=基础1(概述、语法基础、虚拟机、面向对象)"/>

java必备基础1(概述、语法基础、虚拟机、面向对象)

目录

写代码

学习新技术

java概述

java语法基础

JMM 内存模型(java memory model)

Java 虚拟机

程序计数器(ProgramCounter)寄存器

本地方法栈

方法区

面向对象

多态

继承

继承的细节

封装

抽象

成员变量和局部变量的区别

对象

接口

重载(Overload)与重写(Override)

方法重写规则

重载


写代码

        1. 明确需求,要做什么。

        2. 分析需求,怎么做(思路分治思想,分成1、2、3...步骤,拆开去做)。

        3. 确定每步骤做什么,然后去实现。

学习新技术

        1. 该技术是什么?

        2. 该技术用在什么场景,有什么特点,技术的优势、缺点等。

        3. 该技术怎么使用?

java概述

        Java分为三个体系:

        JavaSE(Java2 Platform Standard Edition,java平台标准版)。

        JavaEE   (Java 2 Platform,Enterprise Edition,java平台企业版)。

        JavaME   (Java 2 Platform Micro Edition,java平台微型版)。

        JDK:Java Development Kit:java的开发和运行环境,java的开发工具和jre。

        JRE:Java Runtime Environment:java程序的运行环境,java运行的所需的类库+JVM(java虚拟机)。

        javac命令和java命令做什么事情呢?

  javac:负责的是编译的部分,当执行javac时,会启动java的编译器程序。对指定扩展名的.java文件进行编译。 生成了jvm可以识别的字节码文件。也就是class文件,也就是java的运行程序。

  java:负责运行的部分.会启动jvm.加载运行时所需的类库,并对class文件进行执行.一个文件要被执行,必须要有一个执行的起始点,这个起始点就是main函数.

java语法基础

1. 关键字:其实就是某种语言赋予了特殊含义单词 ,比如:class、extends

        特点:关键字中所有字母都是小写。

2. 标识符:在程序中自定义的名词。比如类名,变量名,函数名。包含 0—9、a—z、$、_ ;

  注意:

    ①:数字不可以开头。

    ②:不可以使用关键字。

3.常量:是在程序中不会变化的数据。

4.变量:其实就是内存中的一个存储空间,用于存储常量数据。

                定义格式:数据类型 变量名

                特点:变量空间可以重复使用

                什么时候用变量?只要数据不确定的时候,就可以定义变量。

           按声明位置分
                在方法体外,类体内声明的变量称为成员变量(全局变量)。
                在方法体外,类体内声明的变量称为局部变量。

        变量的作用域:

        作用域从变量定义的位置开始,到该变量所在的那对大括号结束;

5. 数据类型:

        

        引用数据类型: 数组、类、接口。

        级别从底到高 byte,char,shot--->int--->float--->long--->double

        自动类型转换:从低级别到高级别,系统自动转的。

        强制类型装换:把一个高级别的数赋给一个该数的级别底的变量。

 6. 访问修饰符

        可以使用访问修饰符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

        private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
        default :(即缺省,什么也不写,不使用任何关键字): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
        protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
        public : 对所有类可见。使用对象:类、接口、变量、方法

                

7. 运算符号

        ①算数运算符 +、- 、*、 /、 %

        ②赋值运算符 =、+=、-=、*=、/=、%=

        ③比较运算符 !=、==

                 特点:运算完结果,要么true,要么false。

        ④逻辑运算 &、|、^、!、&& 、||

                 &和&&区别:&无论左边结果是什么,右边都参与运算。

                                        && 短路与,如果左边为false,那么右边不参数与运算。

                  |和|| 区别: | 两边都运算

                                     || 短路或 ,如果左边为true,那么右边不参与运算。

            ⑤位运算符:用于操作二进制位的运算符。

              &  |  ^ 

              <<、  >>   >>(无符号右移)

8.语句。

  If     switch    do while     while    for 

  这些语句什么时候用?

1)当判断固定个数的值的时候,可以使用if,也可以使用switch

  但是建议使用switch,效率相对较高。

    switch(变量){

      case 值:要执行的语句;break;

      …

      default:要执行的语句;

    }

工作原理:用小括号中的变量的值依次和case后面的值进行对比,和哪个case后面的值相同了

     就执行哪个case后面的语句,如果没有相同的则执行default后面的语句;

细节:①:break是可以省略的,如果省略了就一直执行到遇到break为止;

   ②、switch 后面的小括号中的变量应该是byte,char,short,int四种类型中的一种;

   ③、default可以写在switch结构中的任意位置;如果将default语句放在了第一行,则不管expression与case中的value是否匹配,程序会从default开始执行直到第一个break出现。

2)当判断数据范围,获取判断运算结果boolean类型时,需要使用if

3)当某些语句需要执行很多次时,就用循环结构。while和for可以进行互换。

区别在于:如果需要定义变量控制循环次数。建议使用for。因为for循环完毕,变量在内存中释放。

break:作用于switch ,和循环语句,用于跳出,或者称为结束。

break语句单独存在时,下面不要定义其他语句,因为执行不到,编译会失败。当循环嵌套时,break只跳出当前所在循环。要跳出嵌套中的外部循环,只要给循环起名字即可,这个名字称之为标号。

continue:只作用于循环结构,继续循环用的。

作用:结束本次循环,继续下次循环。该语句单独存在时,下面不可以定义语句,执行不到。

9、函 数:为了提高代码的复用性,可以将其定义成一个单独的功能,该功能的体现就是java中的函数。函数就是体现之一。

  java中的函数的定义格式:

  修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数1,…){

    执行语句;

    return 返回值;

  }

  当函数没有具体的返回值时,返回的返回值类型用void关键字表示。

  如果函数的返回值类型是void时,return语句可以省略不写的,系统会帮你自动加上。

  return的作用:结束函数。结束功能。

如何定义一个函数?

    函数其实就是一个功能,定义函数就是实现功能,通过两个明确来完成:

   ①、明确该功能的运算完的结果,其实是在明确这个函数的返回值类型。

      ②、在实现该功能的过程中是否有未知内容参与了运算,其实就是在明确这个函数的参数列表(参数类型&参数个数)。

函数的作用:

    1)、用于定义功能。

    2)、用于封装代码提高代码的复用性。

    注意:函数中只能调用函数,不能定义函数。 

  函数定义名称是为什么呢?

    答:1)、为了对该功能进行标示,方便于调用。

      2)、为了通过名称就可以明确函数的功能,为了增加代码的阅读性。

  重载的定义是:在一个类中,如果出现了两个或者两个以上的同名函数,只要它们的参数的个数,或者参数的类型不同,即可称之为该函数重载了。

  如何区分重载:当函数同名时,只看参数列表。和返回值类型没关系。

10、数 组:用于存储同一类型数据的一个容器。

  好处:可以对该容器中的数据进行编号,从0开始。数组用于封装数据,就是一个具体的实体。

  如何在java中表现一个数组呢?两种表现形式。

    1)、元素类型[] 变量名 = new 元素类型[元素的个数];

    2)、元素类型[] 变量名 = {元素1,元素2...};

      元素类型[] 变量名 = new 元素类型[]{元素1,元素2...};

JMM 内存模型(java memory model

。。。

Java 虚拟机

  1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆。

        存储的都是局部变量 ( 函数中定义的变量,函数上的参数,语句中的变量 );

        只要数据运算完成所在的区域结束,该数据就会被释放。

        Java 栈的区域很小,只有 1M,特点是存取速度很快,所以在 stack 中存放的都是快速执行的任务,基本数据类型的数据,和对象的引用(reference)

        JVM 只会直接对 JavaStack(Java 栈)执行两种操作:①以帧为单位的压栈或出栈;②通过 - Xss 来设置, 若不够会抛出 StackOverflowError 异常。

用于存储数组和对象,也就是实体。啥是实体啊?就是用于封装多个数据的。

    1:每一个实体都有内存首地址值。

    2:堆内存中的变量都有默认初始化值。因为数据类型不同,值也不一样。 

    3:垃圾回收机制。

程序计数器(ProgramCounter)寄存器

        PC 寄存器( PC register ):每个线程启动的时候,都会创建一个 PC(Program Counter,程序计数器)寄存器。PC 寄存器里保存有当前正在执行的 JVM 指令的地址。 每一个线程都有它自己的 PC 寄存器,也是该线程启动时创建的。保存下一条将要执行的指令地址的寄存器是 :PC 寄存器。PC 寄存器的内容总是指向下一条将被执行指令的地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。

本地方法栈

        Nativemethodstack (本地方法栈):保存 native 方法进入区域的地址。

方法区

        method(方法区)又叫静态区,存放所有的①类(class),②静态变量(static 变量),③静态方法,④常量和⑤成员方法。

1. 又叫静态区,跟堆一样,被所有的线程共享。

2. 方法区中存放的都是在整个程序中永远唯一的元素。这也是方法区被所有的线程共享的原因

面向对象

特点: 1.将复杂的事情简单化。

            2.面向对象将以前的过程中的执行者,变成指挥者。

            3.面向对象这种思想是符合现在人们思考习惯的一种思想。

        过程和对象在我们的程序中是如何体现的呢?

    过程其实就是函数;

    对象是将函数等一些内容进行了封装。

多态

        多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。

如图

 多态是对象多种表现形式的体现。例如:现实中,比如我们按下F1键这个工作:当在Flash界面淡出就是AS3的帮助文档;在word下弹出就是word帮助文档。

同一个事件发生在不同的对象产生不同的结果。

多态的优点:1.消除类型之间的耦合性。2.可替换性。3.可扩展性。4.灵活性。5.简化性。

          弊端:当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,不可以访问子类中特有的方法。(前期不能使用后期产生的功能,即访问的局限性)

        如果想用子类对象的特有方法,如何判断对象时哪个具体的子类类型呢?

        可以通过一个关键字 instanceof  //判断对象是否实现了指定的接口或继承指定的类

        Studnet  instance of Person = true; //student 继承了person类

多态存在的三个必要条件:继承、重写、父类引用指向子类对象 parent   parent = new Child();

 当使用多态方法调用方法时,首先检查父类中是否有该方法,如果没有,则编译报错;如果有,再去调用子类的同名方法。

多态好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。

重写:当子类对象调用重写方法时,调用的是子类的方法,而不是父类中被重写的方法。如果想要调用父类被重写方法,则必须使用关键字super。

多态的实现方式:1.重写 2.接口(生活的插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是应为国外有自己定义的接口类型。)

继承

   好处: 1.提高代码的复用性。  2.让类与类之间产生了关系,提供了另一个特征多态的前提。

 父类的由来:其实是由多个类不断向上抽取共性内容而来的。

  java中对于继承,java只支持单继承。java虽然不直接支持多继承,但是保留了这种多继承机制,进行改良。

  单继承:一个类只能有一个父类。

  多继承:一个类可以有多个父类。

  为什么不支持多继承呢?

  因为当一个类同时继承两个父类时,两个父类中有相同的功能,那么子类对象调用该功能时,运行哪一个呢?因为父类中的方法中存在方法体。

  但是java支持多重继承。A继承B  B继承C  C继承D。

  多重继承的出现,就有了继承体系。体系中的顶层父类是通过不断向上抽取而来的。它里面定义的该体系最基本最共性内容的功能。

  所以,一个体系要想被使用,直接查阅该系统中的父类的功能即可知道该体系的基本用法。那么想要使用一个体系时,需要建立对象。建议建立最子类对象,因为最子类不仅可以使用父类中的功能。还可以使用子类特有的一些功能。

  简单说:对于一个继承体系的使用,查阅顶层父类中的内容,创建最底层子类的对象。 

子类出现后,类中的成员都有了哪些特点:

1. 成员变量

        当子父类中出现一样属性时,子类类型的对象,调用该属性,值是子类的属性值。

        如果想要调用父类中的属性值吗,需要使用一个关键字:super

        this:代表是本类类型的对象使用。

        super:代表是子类所属的父类中的内存空间引用。

        注意:子父类中通常是不会出现同名成员变量的,因为父类中只要定义了,子类就不用定义了,直接继承过来用就可以。

2.成员函数

        当子父类中出现一模一样的方法时,建立子类对象会运行子类中的方法。好像父类中的方法被覆盖掉一样。所以这种情况,是函数的另一个特性:覆盖(覆写,重写)

        什么时候用覆盖呢?当一个类的功能内容需要修改时,可以通过覆盖来实现。

3.构造函数

        发现子类构造运行时,先运行了父类的构造函数,为什么呢?

        原因: 子类的所有构造函数中的第一行,其实都有一条隐身的语句super();

        super(): 表示父类的构造函数,并会调用于参数对应的父类中的构造函数。

        为什么子类对象初始化,都需要调用父类中的函数?(为什么要在子类构造函数的第一行加入这个super()?)

        因为子类继承父类,会继承父类中的数据,必须要看父类中是如何对自己的数据进行初始化的。所以子类在进行对象初始化,先调用父类的构造函数,这就是子类的实例化过程。

注意:

        子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();

        如果父类中没有空参的构造函数,那么子类的构造函数内,必须通过super语句指定要访问父类中的构造函数。

        如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数。

问题:super()和this()是否可以同时出现构造函数中

          两个语句只能有一个定义在第一行,所以只能出现其中一个。

super()或者this()为什么一定要定义在第一行?

          因为super()或者this()都是调用构造函数,构造函数用于初始化,所以初始化的动作要先完成。  

继承的细节

         什么时候使用继承?

                当类与类之间存在着所属关系时,才具备继承的前提。a是b中的一种,a继承b。例:狼是犬中的一种。

                所属关系: is  a

                注意:不要仅仅为了获取其他类中的已有成员进行继承。

                所以判断所属关系,可以简单看,如果继承后,被继承的类中的功能,都可以被该子类具备,那么继承成立。如果不是,不可以继承。

在方法覆盖时,注意两点:

        1. 子类覆盖父类时,必须要保证,子类方法的权限必须大于等于父类方法权限可以实现继承。否则编译失败。

        2. 覆盖时,要么都静态,要么都不静态。(静态只能覆盖静态,或者静态覆盖 )

继承的一个弊端:打破了封装性。对于一些类,或者类中功能,需要被继承,或者覆写。

这时候如何解决:final 最终的。

final 特点

1.  这个关键字是一个修饰符,可以修饰类、方法、变量。

2. 被final 修饰类是一个最终类,不可以被继承。

3. 被final 修饰的方法是一个最终方法,不可以被覆盖。

4.被final修饰的变量是一个常量,只能赋值一次。

其实这样的原因的就是给一些固定的数据起个阅读性较强的名称。

    不加final修饰不是也可以使用吗?那么这个值是一个变量,是可以更改的。加final ,程序更加严谨。常量名称定义时,有规范,所有字母都是大写,如果是多个单词组成,中间用_连接。

封装

        是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。

        好处:将变化隔离;便于使用;提高重用性;安全性。

        封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。

抽象

抽象类:abstract

        抽象:不具体,在不断抽取过程中,将共性内容中方法声明抽取,这时抽取到方法不具体,需要被指定关键字abstract所表示,声明为抽象方法。

        抽象方法所在类一定要表示为抽象类,也就是说该类需要被abstract关键字所修饰。

抽象类的特点:

        1:抽象方法只能定义在抽象类中,抽象类和抽象方法必须由abstract关键字修饰(可以描述类和方法,不可以描述变量)。

        2:   抽象方法只能定义方法声明,并不定义方法实现。

        3: 抽象类不可以被创建对象(实例化)。

        4: 只有通过子类继承抽象类并覆盖了抽象类中所抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。

抽象类的细节:

        1:抽象类中是否有构造函数? 有,用于给子类对象进行初始化。

         2:抽象类中是否可以定义非抽象方法?

                        可以。其实抽象类和一般类没有太大趋避,都是描述事物,只不过抽象类在描述事务时,功能不具体。所以抽象类和一般类在定义上,都是需要定义属性和行为的。只不过,比一般类多一个抽象函数。而且比一般类少一个创建对象的部分。

        3: 抽象关键字abstract和哪些不可以共存? final ,private,static

        4:   抽象类中可以不可以不定义抽象方法? 可以。抽象方法目的仅仅为了不让该类创建对象。

        类是一个模板,它描述一类对象的行为。

        在类中定义其它都称之为成员。成员有两种:

            1:成员变量:其实对应的就是事物的属性。

            2:成员函数:其实对应的就是事物的行为。

          所以,其实定义类,就是在定义成员变量和成员函数。但是在定义前,必须先要对事物进行属性和行为的分析,才可以用代码来体现。

        private int age;    //私有的访问权限最低,只有在本类中的访问有效。

  注意:私有仅仅是封装的一种体现形式而已。

  私有的成员:其他类不能直接创建对象访问,所以只有通过本类对外提供具体的访问方式来完成对私有的访问,可以通过对外提供函数的形式对其进行访问。

  好处:可以在函数中加入逻辑判断等操作,对数据进行判断等操作。

  总结:开发时,记住,属性是用于存储数据的,直接被访问,容易出现安全隐患,所以,类中的属性通常被私有化,并对外提供公共的访问方法。

        这个方法一般有两个,规范写法:对于属性 xxx,可以使用setXXX(),getXXX()对其进行操作。

成员变量和局部变量的区别

    1:成员变量直接定义在类中。

          局部变量定义在方法中,参数上,语句中。

    2:成员变量在这个类中有效。

      局部变量只在自己所属的大括号内有效,大括号结束,局部变量失去作用域。

    3:成员变量存在于堆内存中,随着对象的产生而存在,消失而消失。

      局部变量存在于栈内存中,随着所属区域的运行而存在,结束而释放。

        构造函数:用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种。

                特点:1:该函数的名称和所在类的名称相同。 2:不需要定义返回值类型。 3:该函数没有具体的返回值。

   记住:所有对象创建时,都需要初始化才可以使用。

        注意事项:一个类在定义时,如果没有定义过构造函数,那么该类中会自动生成一个空参数的构造函数,为了方便该类创建对象,完成初始化。如果在类中自定义了构造函数,那么默认的构造函数就没有了。

一个类中,可以有多个构造函数,因为它们的函数名称都相同,所以只能通过参数列表来区分。所以,一个类中如果出现多个构造函数。它们的存在是以重载体现的。

        构造函数和一般函数有什么区别呢?

    1:两个函数定义格式不同。

    2:构造函数是在对象创建时,就被调用,用于初始化,而且初始化动作只执行一次。

      一般函数,是对象创建后,需要调用才执行,可以被调用多次。

        什么时候使用构造函数呢?

  分析事物时,发现具体事物一出现,就具备了一些特征,那就将这些特征定义到构造函数内。

        构造代码块和构造函数有什么区别?

  构造代码块:是给所有的对象进行初始化,也就是说,所有的对象都会调用一个代码块。只要对象一建立。就会调用这个代码块。(直接在类中定义且没有加static关键字的代码块称为{}构造代码块。并且执行次序优先于类构造函数)。

        {

                System.out.println("构造块");

        }

  构造函数:是给与之对应的对象进行初始化。它具有针对性。        

this:代表对象。就是所在函数所属对象的引用。

      哪个对象调用了this所在的函数,this就代表哪个对象,就是哪个对象的引用。

  开发时,什么时候使用this呢?

  在定义功能时,如果该功能内部使用到了调用该功能的对象,这时就用this来表示这个对象。

this 还可以用于构造函数间的调用。

  调用格式:this(实际参数);

  this对象后面跟上 .  调用的是成员属性和成员方法(一般方法);

  this对象后面跟上 () 调用的是本类中的对应参数的构造函数。

注意:用this调用构造函数,必须定义在构造函数的第一行。

因为构造函数是用于初始化的,所以初始化动作一定要执行。否则编译失败。

   static是一个修饰符,用于修饰成员(成员变量和成员函数)

        特点:1,想要实现对象中的共性数据的对象共享。可以将这个数据进行静态修饰。

                   2,被静态修饰的成员,可以直接被类名所调用。也就是说,静态的成员多了一种调用方式。类名.静态方式。

                  3,静态随着类的加载而加载。而且优先于对象存在。

        弊端:1.有些数据是对象特有的数据,是不可以被静态修饰的。因为那样的话,特有数据会变成对象的共享数据。这样对事物的描述就出了问题。所以,在定义静态时,必须要明确,这个数据是否是被对象所共享的。

                 2. 静态方法只能访问静态成员,不可以访问非静态成员。

                          因为静态方法加载时,优先于对象存在,所以没有办法访问对象中的成员。

                3.静态方法中不能使用this,super关键字

                 因为this代表对象,而静态在时,有可能没有对象,所以this无法使用。

                4.主函数是静态的。

什么时候定义静态成员呢?或者说:定义成员时,到底需不需要被静态修饰呢?

     成员分两种:

    1,成员变量。(数据共享时静态化)

      该成员变量的数据是否是所有对象都一样:

      如果是,那么该变量需要被静态修饰,因为是共享的数据。 

      如果不是,那么就说这是对象的特有数据,要存储到对象中。 

    2,成员函数。(方法中没有调用特有数据时就定义成静态)

      如果判断成员函数是否需要被静态修饰呢?

      只要参考,该函数内是否访问了对象中的特有数据:

      如果有访问特有数据,那方法不能被静态修饰。

      如果没有访问过特有数据,那么这个方法需要被静态修饰。

成员变量和静态变量的区别:

        1,成员变量所属于对象。所以也称为实例变量。

   静态变量所属于类。所以也称为类变量。

        2,成员变量存在于堆内存中。

   静态变量存在于方法区中。

        3,成员变量随着对象创建而存在。随着对象被回收而消失。

   静态变量随着类的加载而存在。随着类的消失而消失。

        4,成员变量只能被对象所调用 。

  静态变量可以被对象调用,也可以被类名调用。

        所以,成员变量可以称为对象的特有数据,静态变量称为对象的共享数据。

        静态的注意:静态的生命周期很长。

        静态代码块:就是一个有静态关键字标示的一个代码块区域。定义在类中。

        作用:可以完成类的初始化。静态代码块随着类的加载而执行,而且只执行一次(new 多个对象就只执行一次)。如果和主函数在同一类中,优先于主函数执行。

        Public:访问权限最大。

        static:不需要对象,直接类名即可。

        void:主函数没有返回值。

        Main:主函数特定的名称。

        (String[] args):主函数的参数,是一个字符串数组类型的参数,jvm调用main方法时,传递的实际参数是 new String[0]。

  jvm默认传递的是长度为0的字符串数组,我们在运行该类时,也可以指定具体的参数进行传递。可以在控制台,运行该类时,在后面加入参数。参数之间通过空格隔开。jvm会自动将这些字符串参数作为args数组中的元素,进行存储。

        静态代码块、构造代码块、构造函数同时存在时的执行顺序:静态代码块 ———> 构造代码块 ———> 构造函数;

java.lang.object 所有类直接或者间接父类,java认为所有的对象都具备一些基本的共性内容,这些内容可以不断的向上抽取,最终就抽取到了一个最顶层的类中,该类定义的就是所有对象都具备的功能。

具体方法:1. boolean  equals(Object obj):用于比较两个对象是否相等,其实内部比较的就是两个对象地址。而根据对象的属性的不同,判断对象是否相同具体内容也一样。所以在定义类时,一般都会覆写equals方法,建立本类特有的判断对象 是否相同的依据。

public boolean equals(Object obj){

        if ( ! obj instanceof Person) {

         return  false;

        } 

        Person  person = (Person) obj;

        retrun this.age=p.age;

}

2.String toString(): 将对象变成字符串;默认返回格式: 类名@哈希值=getClass().getName()+'@'+Integer.toHexString(hashCode)为了对象对应的字符串有意义,可以通过复写,建立改对象自己特有的字符串表现形式。

3.Class getClass():获取任意对象运行时的所属字节码文件对象

4.int hashCode();返回对象的哈希码值。支持此方法是为了提高哈希表性能。

        Hash碰撞冲突的解决方法

                开放地址法、再哈希法、链地址法(拉链法)、建立一个公共溢出区

                www.yisu/zixun/314818.html

通常equals、toString、hashCode 在应用中都会复写,建立具体对象的特有的内容。

对象

        对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。

 匿名对象使用场景:

    1:当对方法只进行一次调用的时候,可以使用匿名对象。

    2:当对象对成员进行多次调用时,不能使用匿名对象。必须给对象起名字。

        Person p = new Person();

        创建一个对象都在内存中做了什么事情?

        1:先将硬盘上指定位置的Person.class文件加载进内存。

        2:执行main方法时,在栈内存中开辟了main方法的空间(压栈—进栈),然后在main方法的栈区分配了一个变量p。

        3:在堆内存中开辟一个实体空间,分配了一个内存首地址值。new

        4:在该实体空间中进行属性的空间分配,并进行了默认初始化。

        5:对空间中的属性进行显示初始化。

        6:进行实体的构造代码块初始化。

        7:调用该实体对应的构造函数,进行构造函数初始化。

        8:将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)

接口

1.是关键字interface

2.接口中包含的成员,最常见有全局常量、抽象方法。

        成员变量:public static final int  x = 3;

        成员方法:public abstract   void  show();

3.接口中有抽象方法,说明接口不可以实例化。接口的子类必须实现了接口中所有抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。

4.类与类之间存在这继承关系extends ,类与接口中间存在实现关系。

5.接口和类不一样的地方,就是接口可以多实现,这就是多继承改良后的结果。java将多继承机制通过多实现来体现。

6.一个类在继承另一个类的同时,还可以实现多个接口。所以接口的出现避免了单继承的局限性。还可以将类进行功能的扩展。

7. 其实java中是多继承。接口与接口之间存在继承关系,接口可以多继承接口。

接口设计上特点:(可以理解成主板上提供的接口)

        1:接口是对外提供的规则。2:接口的功能是扩展。 3:接口的出现降低了耦合性。

抽象类与接口

        抽象类:一般用于描述一个体系单元,将一组共性内容进行抽取,特点:可以在类中定义抽象内容让子类实现,可以定义非抽象内容让子类直接使用。它里面定义的都是一些体系中的基本内容。

        接口:一般用于定义对象的扩展功能,是在继承之外还需这个对象具备一些功能。

抽象类和接口共性:都是向上抽取的结果。

抽象类和接口区别:1. 抽象类只能被继承,而且只能单继承。接口需要被实现,而且可以多实现。

                                 2. 抽象类中可以定义非抽象方法,子类可以直接继承使用。接口中都有抽象方法,需要子类去实现。

                                 3. 抽象类使用是 is a 关系,接口使用是like  a 关系。

                                 4. 抽象类的成员修饰符可以自定义,接口中的成员修饰符是固定的,全部都是public的。

        在开发之前,先定义规则,A和B分别开发,A负责实现这个规则,B负责实现这个规则。至于A是如何对规则具体实现的,B不需要知道的。这样这个接口的出现就降低了A和B直接耦合性。
   

重载(Overload)与重写(Override)

重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值形参不能变化。即外坑不变,核心重写。

重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。

方法重写规则

  1.  参数列表与被重写方法的参数列表必须完全相同。
  2. 返回类型与被重写方法的返回类型可以不同,但是必须是父类返回值派生类。
  3. 访问权限不能比父类中被重写的方法的访问权限低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明protected。
  4. 父类的成员方法只能被它的子类重写。
  5. 声明为final不能被重写。
  6. 声明为static不能被重写,但能够被再次声明。
  7. 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
  8. 子类和父类不在同一个包中,那么子类只能够重写父类,声明为public 和protected的非final的方法。
  9. 声明的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是重写方法不能抛出新的的强制性异常,或者比被重写方法声明的更广泛的强制异常,反之则可以。
  10. 构造方法不能被重写。
  11. 如果不能继承一个类,则不能重写该类的方法。当子类调用父类被重写的方法时,需要使用super()关键字。

重载

重载是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。

每个重载的方法(或者构造函数)都必须有一个独一无二的参数参数类型。(常用的地方就是构造器的重载)

重载规则:

  1. 被重载的方法必须改变参数列表(参数个数或参数类型不一样)。
  2. 被重载的方法可以改变返回类型。
  3. 被重载的方法可以改变访问修饰符。
  4. 被重载的方法可以声明新的活更广的检查异常。
  5. 方法能够在同一个类中或者在一个子类中被重载。
  6. 无法以返回值类型作为重载函数的区分标准。

重写与重载之间的区别

区别点重载方法重写方法
参数列表必须修改一定不能修改
返回类型可以修改一定不能修改
异常可以修改可以减少或删除,一定不能跑出新的或者更广的异常
访问可以修改一定不能做更严格的限制(可以降低限制)

     

总结:方法的重写和重载是java多态性的不同表现,重写是父类与子类之间的一种表现,重载可以理解成多态的具体表现形式。

  1. 方法重载是一个类总定义了多个方法名相同,而它们参数的数量不用或数量相同而类型和次序不同,则称方法的重载
  2. 方法重写一个在子类存在方法与父类的方法的名字相同,而且参数个数与类型一样,返回值也一样的方法,就成为重写。 

更多推荐

java必备基础1(概述、语法基础、虚拟机、面向对象)

本文发布于:2024-03-14 11:54:34,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1736417.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:基础   面向对象   语法   虚拟机   java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!