对象及类的概念

对象是java程序的核心,在java程序中“万事万物皆对象”

对象可以看成是属性和方法的封装体

类是用来创建同一类型的对象的模板,在一个类中定义了该类对象所应具有的属性和方法

J2SDK提供了很多类供变成人员使用,编程人员也可以定义自己的类

面向对象的编程------一组对象互相配合通过沟通完成特定的功能

引用-----引用是java面向对象基本概念,java中除基本类型之外的变量类型都称之为引用类型。java中的对象是通过引用对其操作的

类的定义主要有两方面组成:属性和方法

属性

属性可以使用java语言中的任何一种数据类型(包括基本类型和引用类型)

在定义属性时可以对其初始化,如果不对其初始化,java使用相应数据类型默认的值对其初始化

属性的作用范围为整个类体

方法

必须设置返回值类型(构造方法除外),如果没有返回值,则返回值类型为void

实参的数目,类型以及次序必须和形参一致

如果方法有返回值(即返回值类型不是void),则必须保证方法体一定会调用return语句,如果return后为变量,则要保证该变量一定会被初始化。

参数传递原则:基本类型传递的是该数据值本身。引用类型传递的是对对象的引用,而不是对象本身

如何在内存中区分类和对象

类是静态的概念,位于方法区

对象是new出来的,位于堆内存,

类的每一个非静态属性在不同的对象中有不同的值保存在该对象的堆区,不共享

类的静态属性被所有的对象共享,值位于方法区

类的所有方法被所有的对象共享,位于方法区,方法只有在执行的时候占用内存

个人推断和理解(仅为了理解,不一定对)

假设我们将一个变量名中当前保存的值为当前值,当当前值的数据为基本类型时,则最终值即为当前值

当当前值为一个引用时,则最终值为引用所指向的值

方法名,属性名也可以看作变量

在new出一个对象时,类中所有的属性名和方法名在该对象中都有。

只是静态属性名和方法名(静态和非静态)的当前值都为引用,且引用固定不可变化,固定指向该类的静态属性和方法的区域,所以该类new出的所有对象的静态属性和方法名的最终值都为该类的静态属性和方法。

对于非静态属性,其当前值可以为基础类型和引用类型,非静态属性的当前值为引用时,他的引用是变化的,不固定的,可以指向不同的区域

比如A类对象1的非静态属性可以指向B类对象1的区域,也可以值像B类对象2的区域,A类对象2的非静态属性同样

但A类对象1的静态属性和方法只能唯一固定指向方法区A类的静态属性和方法区域

所以一个类的静态属性和方法被该类所有的对象所共享

虽然静态方法和非静态方法都被共享,但静态方法可以通过类名直接调用,且静态方法中只能使用静态属性

因为方法只有在执行时才会占用堆栈内存,此处的共享指的是共享方法区方法定义的,并不共享执行时堆栈内存。同一方法的每一次调用都会占用不同的堆栈内存

而静态属性的调用不会再使用额外的堆栈内存

对象的创建

必须使用new关键字创建对象(?)

构造方法

构造方法是定义在java类中用来初始化该类对象的方法

构造方法与类名相同

构造方法没有返回值

一个类可以通过重载的方式定义多个构造方法

如果不显示的定义构造方法,那么编译器会为该类自动添加形如   类名 () {}  的构造方法

继承类(子类)的构造方法

子类的构造方法中必须调用其父类的构造方法(显示的调用或者默认调用无参的父类构造方法)

如果子类的构造方法中没有显示的调用父类的构造方法,则系统会默认调用父类的无参数构造方法

如果子类的构造方法中没有显示的调用父类的构造方法,而父类中又没有无参的构造方法,则编译出错

子类的构造方法可以使用 super(argument_list) 来显示的调用父类的构造方法,且必须写在子类构造方法的第一行

可以使用this(argument_list) 来调用本类其他的构造方法

约定俗成的命名规则

类名的首字母大写

变量名和方法名的首字母小写

都运用驼峰标识

方法的重载

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

参数不同指的是参数的类型,个数或者次序的不同

普通的方法和构造方法都可以重载

Object类

Object类是所有java类的根基类(所有的类都直接或者间接继承Object类,所以Object变量引用可以指向所有类型的对象)

如果在类的声明中未使用extends关键字指明其根基类(父类),则默认继承Object类

对象转型

父类引用可以指向子类对象。(object类的引用可以指向所有的对象,因为Object类是所有java类的根基类)

虽然父类引用可以指向子类对象,但只能访问父类所应有的属性和方法,包括子类重写的方法,却不能访问子类相对于父类新增加的属性和方法。

父类引用指向的子类对象要想访问子类新增加的属性和方法,则必须进行强制转换,强制转换成子类引用指向子类对象后才可以访问。

可以使用instanceof来判断引用类型变量所指向的对象是否属于该类或者该类的子类

动态绑定和多态

动态绑定和多态是指在执行期间(而非编译期间)判断所引用对象的实际类型,根据其实际类型调用其相应的方法(子类继承或者重写的方法)

也就是说,父类引用指向子类对象调用方法(只能调用父类所具有的方法)时,会判断该对象的实际类型,若实际类型重写了父类的方法,则调用重写后的方法,否则调用继承于父类的方法。

父类引用指向子类对象只能访问父类拥有的属性和方法,而无法访问子类独有的属性和方法。只是如果子类重写了父类的方法,实际上调用的是子类重写后的方法,而不是父类的方法

需要注意,如果子类重写了父类已具有的某个属性,父类引用指向子类对象访问该属性时,实际上是调用父类的属性,而不是子类重写的属性,这点与重写的方法不同,也就是说动态绑定和多态只是针对重写的方法,而不针对重写的属性

一般情况下子类不会重写父类的属性,但写了也不会报错,但某些场合子类是不能重写父类的属性的,否则会报错。例如Gson类的toJson方法中传入子类重写父类属性的子类对象时,就会报错

多态:同一类型的引用变量,调用同一个方法是,执行过程却不相同

多态的条件:1,要有继承   2,多个继承类要重写父类的方法  3, 使用父类引用指向子类对象并调用重写方法

这样同一个父类引用可以指向其多个子类的对象,当使用父类引用来调用方法时,真正执行的是子类重写的方法,子类重写的方法各不相同,这就构成了多态

抽象类

用abstract关键字来修饰一个类时,这个类叫做抽象类。

用abstract来修饰一个方法时,这个方法叫做抽象方法。

抽象类不能被实例化,只能被继承

抽象方法不能有方法体,只能被继承类重写

抽象类不一定有抽象方法,有抽象方法的类一定是抽象类

final关键字

final修饰的变量的值不能被改变

final修饰的方法不能够被重写

final修饰的类不能够被继承

接口

接口是抽象方法和常量值的集合

从本质上将,接口是一种特殊的抽象类,这种抽象类中只包含类常量和方法的定义,而没有变量和方法的实现

接口的特性

多个无关的类可以实现同一个接口

一个类可以实现多个无关的接口

与继承类似,接口与实现类之间存在多态性

接口可以继承其他的接口,并添加新的属性和抽象方法

接口中的属性只能为常量,修饰符默认为public static final,也只能是public static final

接口中的方法只能是抽象方法,修饰符默认为public,也只能是public

java学习--面向对象的更多相关文章

  1. Java学习---面向对象的远程方法调用[RMI]

    基础知识 分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果. 常见的分 ...

  2. java学习面向对象之异常之一

    一.异常的概述: 什么是异常?在我们编写java程序的时候,会出现一些问题,比如内存溢出啊或者数组索引超出最大索引啊,这些编程当中出现的这些个问题就是异常.但是异常也分为可以处理的和不可以处理的.比如 ...

  3. java学习面向对象之匿名内部类

    之前我们提到“匿名”这个字眼的时候,是在学习new对象的时候,创建匿名对象的时候用到的,之所以说是匿名,是因为直接创建对象,而没有把这个对象赋值给某个值,才称之为匿名. 匿名对象回顾: class N ...

  4. java学习面向对象之内部类

    什么是面向对象内部类呢?所谓的内部类,即从字面意义上来理解的话,就是把类放到类当中. 那么内部类都有什么特点呢? 1.内部类可以访问包裹他的类的成员. 2.如果包裹他的类想访问被其包裹的类的话就得实例 ...

  5. java学习面向对象之多态

    如何理解多态,让我们举个例子来描述一下,因为单纯的说多态大家可能不理解: abstract class Animal { ; abstract void eat(); public void run( ...

  6. java学习面向对象之接口

    上一节当中我们说道抽象类,抽象类当中的方法可以是抽象的也可以是非抽象的,那么当抽象类中所有方法都是抽象的时候,我们就可以把它重新定义为接口.代码示例: abstract class Animal { ...

  7. java学习面向对象之父子构造函数初始化

    在之前讲到java面向对象继承的时候,我们只讲到了两个比较重要的知识点,一个是父子类当中有同名的成员变量,这个时候,我们引入了super这个关键字来区分这两个同名成员变量,除此之外,我们还讲到了父子同 ...

  8. java学习面向对象之继承

    在我们编写程序的过程当中,会遇到这种情况: 比如现在有一个狗,他的功能有跑,有跳,有吃,有叫,属性有雌雄,大小,颜色等等,同时现在我们也有一个猫,上述功能她也有.这个时候我们写代码的时候,就得分别把上 ...

  9. Java学习 面向对象(下)——Java疯狂讲义th4

    面向对象(下) [TOC] 包装类 通过包装类可以把8个基本类型的值包装成对象使用. 自动拆箱.自动装箱 把字符串类型值转换成基本类型的值: 包装类的 parseXxx(String s)静态方法 包 ...

随机推荐

  1. python day 25--正则表达式

    一.字符组 1.[0-9]表示匹配0-9中的数字 2.[a-z]表示匹配a-z之间的字母 3.[A-Z]表示匹配大写的字母 4.[0-9a-zA-Z]匹配所有字母数字 二.元字符 1.\d 匹配任意数 ...

  2. ASP.NET中出现内存溢出错误System.OutOfMemoryException

    原因1:数据库服务器性能问题导致内存不够用,从而引起内存溢出 原因2:在IIS的应用程序池中进行配置,引起IIS服务器的内存分配问题,从而引起内存溢出   分析:      32位操作系统的寻址空间是 ...

  3. centos7.5 安装mysql8.0.13

    在Linux系统上使用rpm包管理器安装mysql Installing MySQL on Linux Using RPM Packages 环境:CentOS Linux release 7.4.1 ...

  4. Flask+uwsgi+virtualenv环境配置

    Linux系统版本: SLES12sp3 (阿里云) 1. 首先需要安装python-devel,否则后续安装会报错! rpm -qa|grep python-base 结果: python-base ...

  5. c++ 网络库

    1.libevent 2.boost::asio 3.ace boost::asio以前看过,不过忘记了 学习,学习

  6. 转-软件测试人员在工作中如何运用Linux

    从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事,工作时需要用到,面试时会被问到,简历中需要写到. 对于软件测试人员来说,不需要你多么熟练使用Linux所有命令,也不需要你对Linux ...

  7. python:递归函数(汉诺塔)

    #hanoi.py def hanoi(n,x,y,z): if n==1: print(x,"-->",z) else: hanoi(n-1,x,z,y) print(x, ...

  8. JavaScript数据类型(第一天)

    ECMAScript为JavaScript的标准,javascript为网景公司定义,但并不标准,所以欧洲的组织定义了ESMAScript,定义了网页脚本的标准. js组成 ECMAScript js ...

  9. url集合

    restful方面 Java后台框架篇--Spring与Restful风格API接口开发 https://blog.csdn.net/hello_worldee/article/details/781 ...

  10. 三、tcp、ip协议详细

    1. 什么是 TCP/IP? TCP/IP 是一类协议系统,它是用于网络通信的一套协议集合. 传统上来说 TCP/IP 被认为是一个四层协议 1) 网络接口层: 主要是指物理层次的一些接口,比如电缆等 ...