Java中一切皆是对象!

注意:8种基本数据类型不支持面向对象的编程机制,基本数据类型的数据也不具备“对象”的特性:没有成员变量、方法可以被调用。

为解决8种基本数据类型不能当成Object类型(所有类的父类)变量使用的问题,Java提供了包装类的概念,为8种基本数据类型分别定义了相应的引用类型,例如:int的包装类是Integer,包装类可以把8种基本数据类型的值包装成对象使用。包装类是java自带类,位于java.lang包下。

Integer i = new Integer(10);

上面例子中,i 只是一个对象的引用,存放在栈中,而实际的数值10则是放在堆里。


对象和构造器:

构造器:
用于创建对象时执行初始化。当创建一个对象时eg:new Person();系统为这个对象的实例变量进行默认初始化。PS:类变量在类创建时就进行默认初始化,故此变量称为类变量,成员变量分为类变量和实例变量。
构造器是创建Java对象的重要途径,通过new关键字调用构造器时,构造器返回了该类的对象(可见构造器实际上是有返回值)。
 
对象的产生:
创建对象的根本途径是构造器。通过new关键字来调用某个类的构造器(系统默认提供一个无参构造器)即可创建这个类的实例(对象)。
 Person p = new Person(); //通过new关键字调用Person类的构造器,返回(创建)一个Person实例(对象),将该Person实例(对象)赋给p变量。 
 
对象作用:访问对象的实际变量、调用对象的方法。
对象 & 实例:可以把new出来的对象叫做实例,大白话说就是这个new出来的“东西”,叫它对象也可以,叫它实例也可以,对象和实例在这个角度上来讲是等价的。
 
对象的实例化:
例如,String a = "abc"; 当你声明String a 的时候,jvm(java虚拟机)就帮你在堆中开辟一块内存空间,用来存放a的数据"abc",这里的a叫作引用,"abc"则为实例!
其实 String a = "abc" 完整的写法是String a = new String("abc") ,String是Java的自带类,位于java.lang包下,所以可以不new。

数组是对象:

Java是面向对象语言(Java中除了8种基本数据类型,全是对象),数据的定义也可以看做是实例化的过程,因此我们在定义数组变量时也可以看做是实例化数组对象的过程。
Object是一切引用类型的父类,所有能被Object接收的均为对象。简言之,所有可以new出来的不管是类也好,接口也好,都可以看做为对象。并且都能被Object接收。
它们的异同之处就在于,对象是一个抽象的概念,而数组是对象,但是它有具体的实例。 
int[] temp = {1,3,5}
//也可以写作
int[] temp = new int[]{1,3,5}

this和super:

对象的this引用:

Java提供了一this关键字,this关键字总是指向调用该方法的对象。根据this出现的位置的不同,this作为对象的默认引用有2种情形:

1.构造器中引用(指向)该构造器正在初始化的对象;

2.在方法中引用(指向)调用该方法的的对象。

 
this最大的作用就是让一个类中的一个方法,访问该类里的另一个方法或者实例变量,示例:
public void run()
{
this.jump();  //jump()为另一个类的方法
}
 
this还可以,通过this调用另一个重载的构造器的初始化代码,this(parameter1,parameter2); 示例:
public Apple(){}
public Apple(String name,String color)
{
this.name = name;
this.coloe = color;
}
public Apple(String name,String color,double weight)
{
//通过this调用另一个重载的构造器的初始化代码
this(name,color);
this.weight = weight;
}
 
this可以代表任何对象,谁调用this所在方法,this就代表谁。Java允许对象的一个成员直接调用另一个成员,可以省略this前缀,但是,如果方法里有个局部变量和成员变量同名,要在该方法里访问这个被覆盖的成员变量,必须使用this前缀。
 

super:

当子类覆盖(重写)了父类方法后,子类的对象将无法访问父类中被覆盖的方法,但使用super关键字可以在子类中调用父类中被覆盖的方法。
如果子类定义了和父类同名的实例变量,则会发生子类实例变量隐藏(不是覆盖)父类实例变量的情形,可以在子类定义的实例方法中通过super关键字访问父类中被隐藏的实例变量。
 
注意:
this、super在调用构造器方面:this调用的是同一个类中重构的构造器,super调用的是父类的构造器。另外:不管是否使用super调用来执行父类构造器的初始化代码,子类构造器总会默认调用父类构造器一次。
 

Java内存:

  栈区:

1.每个线程包含一个栈区,栈中只保存基本数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中。
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
 
堆区: 
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息(class的目的是得到操作指令)。
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身。
 
方法区:
在java的虚拟机中有一块专门用来存放已经加载的类信息、常量、静态变量以及方法代码的内存区域。常量池是方法区的一部分,主要用来存放常量和类中的符号引用等信息。
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量(使用static修饰的成员变量)。

面向对象的三大特性:

封装:

将对象的状态信息(eg:Person对象的age变量)隐藏在对象内部,外部程序只能通过该类提供的方法来实现对内部信息的操作和访问。

继承:

继承就是子类继承父类的特征和行为,使得子类具有父类的各种属性和方法(重用父类代码)。

多态(难点):

Java引用变量,编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定(即子类对象赋给父类变量),如果编译时类型和运行时类型不一致,就可能出现多态。
 
     1.多态定义:相同类型的(引用)变量,调用同一个方法(父类和子类都有的同名方法)时呈现出多种不同的行为特征。        
      当引用变量polymophicBc编译时类型为BaseClass类型,而运行时类型为SubClass类型,运行时调用该引用变量的方法时,其方法行为总是表现出子类SubClass方法的行为特征,而不是父类BaseClass方法的行为特征。
 BaseClass polymophicBc = new SubClass();  
 
2.多态的条件:有继承关系;子类重写父类方法;父类引用变量指向子类对象。
 
3.优点:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。当一个新的情景出现时,无须对现有的代码进行改动,而只需要增加一个新的类和新的同名方法。

类的生命周期:

java源文件编译成的class字节码文件,在java虚拟机中运行,java类的生命周期就是指一个class文件从加载到卸载的全过程。
 
 
1.加载:找到需要加载的类并把类的信息加载到jvm的方法区中,然后在堆区中实例化一个java.lang.Class对象,作为方法区中这个类的信息的入口。Ps:日常我们说的类加载——指的是类的生命周期中加载、连接、初始化三个阶段。
 
2.连接:连接阶段比较复杂,一般会跟加载阶段和初始化阶段交叉进行,这个阶段的主要任务就是做一些加载后的验证工作以及一些初始化前的准备工作。
 
3.类的初始化:按照顺序自上而下运行类的变量赋值语句和静态语句。而没有static修饰的赋值语句和执行语句在实例化对象的时候才会运行。
所以,java的静态变量也叫做类变量,它开始于类的创建,结束于类的消亡。非静态变量叫做实例变量,它开始于类的实例的创建,结束语类的实例的消亡。
 
4.使用:当初始化完成之后,java虚拟机就可以执行Class的业务逻辑指令,通过堆中java.lang.Class对象的入口地址,调用方法区的方法逻辑,最后将方法的运算结果通过方法返回地址存放到方法区或堆中。
类的使用包括主动引用和被动引用。主动引用会引起类的初始化eg:通过new关键字实例化对象、读取或设置类的静态变量。被动引用不会引起类的初始化eg:定义类数组、引用类的常量。
 
5.卸载:当对象不再被使用时,java虚拟机的垃圾收集器将会回收堆中的对象,方法区中不再被使用的Class也要被卸载,否则方法区(Sun HotSpot永久代)会内存溢出。类的卸载过程其实就是在方法区中清空类信息。

​Java面向对象的概念整理的更多相关文章

  1. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal

    java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型  也就是 ...

  2. java 面向对象基本概念

    1.面向对象与面向过程 (1).都是解决问题的思维方式,都是代码组织的方式. (2).解决简单问题可以使用面向过程 (3).解决复杂问题:宏观上使用面向对象把握,微观处理上仍然是面向过程. 2.面向对 ...

  3. Java面向对象----接口概念

    接口语法 interface 接口名{ //静态常量,抽象方法 } 特点 接口中只能存放静态常量和抽象方法 java接口是对功能的扩展 通过实现接口,java类可以实现多实现 一个类可以同时继承(ex ...

  4. Java面向对象的概念以及OOP思想的优点

    传统面向过程程序设计的思路: 先设计一组函数用来解决一个问题,然后确定函数中需要处理的数据以及存储位置. 面向对象的设计的思路: 先确定处理的数据,然后确定处理数据的算法,最后将数据和算法封装在一起构 ...

  5. Java面向对象----多态概念,对象上下转型

    概念:同一操作作用于某一类对象,可以有不同的解释,产生不同的执行结果 多态存在的三个必要条件 需要存在继承和实现关系 同样的 方法调用而执行不同操作,运行不同的代码(重写操作) 在运行时父类或者接口的 ...

  6. Java面向对象----继承概念,super关键字

    继承概念: 继承需要符合的关系  is-a  , 父类通用更抽象,子类更特殊更具体 类之间的关系 继承体现 组合体现 实现接口体现 继承的意义 代码重用 体现不同抽象层次 extends关键字 Sup ...

  7. Java面向对象----封装概念

    封装 信息隐藏,隐藏对象的细节 访问修饰符 public private protected 默认 属性封装的实现 方法封装的目的(隐藏方法实现细节) package com.tanlei.newer ...

  8. 面向对象的编程思想和Java中类的概念与设计

    面向对象的编程思想学习,面向对象内容的三条主线;1.java类及类的对象2.面向对象的三大特征3.其他关键字学习内容:3.1面向对象与面向过程面向对象与面向过程在应用上的区别 Java中类的概念与设计 ...

  9. java面向对象概念1

    一.java面向对象学习的三条主线: 1.java类及类的成员:属性.方法.构造器:代码块.内部类 2.面向对象的三大特征:封装性.继承性.多态性.(抽象性) 3.其它关键字:this.super.s ...

随机推荐

  1. ReactiveX Operators

    This documentation groups information about the various operators and examples of their usage into t ...

  2. socket 的通信过程

    1.建立套接字 Linux在利用socket()系统调用建立新的套接字时,需要传递套接字的地址族标识符.套接字类型以及协议,其函数定义于net/socket.c中: asmlinkage long s ...

  3. 几个书本上不常见到的C语言函数

    函数名称:getcwd #include <unistd.h> char *getcwd(char *buf, size_t size); 作用:把当前目录的绝对地址保存到 buf 中,b ...

  4. 熟悉VS2017 和Github 第二次作业

    GIT地址 https://github.com/Astone1213 GIT用户名  Astone1213 学号后五位  62114 博客地址 https://www.cnblogs.com/AsL ...

  5. Django之瀑布流

    一. 小功能瀑布流的实现 1.完成效果图 2.代码部分 <1>models.py from django.db import models # Create your models her ...

  6. AMPL下载使用

    AMPL下载使用 依次执行以下操作 wget https://ampl.com/demo/amplide.linux64.tgz tar xzf amplide.linux64.tgz cd ampl ...

  7. 00065字符串缓冲区_StringBuilder类

    1.StringBuilder类,它也是字符串缓冲区,StringBuilder与它和StringBuffer的有什么不同呢? 它一个可变的字符序列.此类提供一个与 StringBuffer 兼容的 ...

  8. 【hdu 6342】Expression in Memories

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把所有的问号都改成'1' 然后会发现只有+0?这种情况 需要把?改成+. 看看这样的0后面的1是不是由问号改过来的就好了.是的话 再 ...

  9. MAVEN项目的搭建

    MAVEN能为我们做什么? 1.Jar的声明式依赖性管理 2.项目的自动构建 搭建流程 环境配置 http://maven.apache.org/download.html 下载最新版本Maven 3 ...

  10. jQuery(表单选择器)