java 内存分配,继承、封装和多态,修饰符和非修饰符

一、java虚拟机中内存的分配

  1. 方法区(静态区)
  • 被所有的线程共享,方法区包含所有的class(class是指类的原始代码,要创建一个类的对象,首先要把该类的代码加载到方法区中,并且初始化)和static变量。
  • 方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
  1. 栈区
  • 每个线程包含一个栈区,栈中只保存基础数据类型本身和自定义对象的引用;
  • 每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问;
    每运行一个java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Java进程对应唯一一个JVM实例,每一个JVM实例唯一对应一个堆,每一个线程有一个自己私有的栈。进程所创建的所有类的实例(也就是对象)或数组(指的是数组的本身,不是引用)都放在堆中,并由该进程所有的线程共享。
  1. 堆区
  • 被所有的线程共享,存放由new创建的对象和数组。
  1. 本地方法区
  2. 程序计数器



二、方法重载

重载(Overloading)的定义:如果有两个方法的方法名相同,但参数不一致,哪么可以说一个方法是另一个方法的重载。具体说明如下:
  • 方法名相同
  • 方法的参数类型,参数个不一样
  • 方法的返回类型可以不相同
  • 方法的修饰符可以不相同
  • main 方法也可以被重载

与重写的区别:重载就是在同一个类当中,而重写则发生在不同的类当中,并且两者要有继承关系,重写是方法名字和参数的列表是要完全一致的,重写的意义在于父类的方法已经不能满足时,子类重写为自己需要的方法。



三、构造方法

  • 构造方法又称为构造函数/构造器/Constructor,其语法结构为:[修饰符列表] 构造方法名(形式参数列表){方法体},对于构造方法来说,不需要指定返回值类型,并且也不能写void,其方法名必须和类名保持一致。
  • 构造方法的作用:通过构造方法的调用可以创建对象。并且创建对象的同时,会对实例变量赋默认值。调用方式为 new 构造方法名(实参列表),当一个类中没有定义任何构造方法的话,系统会默认给该类提供一个无参数构造方法,这个构造方法被称作缺省构造器。
  • 每一个构造方法实际上执行结束之后都有返回值,但是这个“return 值;”这样的语句不需要写。构造方法结束的时候java程序会自动返回值,并且返回值类型是构造方法所在类的类型。由于构造方法的返回值类型就是类本身,所以返回值类型不需要编写。
  • 当一个类显示的将任意一个(不管是有参还是无参的)构造方法定义出来了,那么系统则不再默认为这个类提供缺省构造器。
  • 构造方法支持重载机制。在一个类当中编写多个构造方法,这多个构造方法显然已经构成了方法重载机制。


四、继承、封装和多态

  1. 继承
  2. 封装
    在面向对象程式设计方法中,封装(Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。一般使用private访问控制符
  3. 多态
    父类型引用指向子类型对象


五、修饰符

Java语言提供了很多修饰符,主要分为以下两类:

  • 访问修饰符
  • 非访问修饰符
  1. 四种访问修饰符
  • default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
  • private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
  • public : 对所有类可见。使用对象:类、接口、变量、方法
    关于 public class 和 public :一个java源文件当中可以定义多个class;一个java源文件当中public的class不是必须的;一个java源文件当中定义公开(public)类的话,只能有一个,并且该类的名称必须和java源文件名称一致。
  • protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
    其中,父类中声明为public的方法在子类中也必须为public。父类中声明为protected的方法在子类中要么声明为protected,要么声明为public,不能声明为private。父类中声明为private的方法,不能够被继承。
  1. 非访问修饰符
  • abstract
    在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。java中通过使用abstract关键字来定义抽象类和抽象方法。
    抽象类的特点:
    (1)抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类,且抽象方法一定在抽象类中。抽象方法和抽象类都必须被abstract关键字修饰。
    (2)抽象类不可以用new创建和实例化对象。抽象类中的抽象方法要被使用,必须由子类复写所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。
    (3)构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。另外抽象方法不能用private修饰,因为抽象方法必须被子类实现(复写),而private权限对于子类来说是不能访问的,所以就会产生矛盾。抽象类不能使用final关键字修饰,因为final修饰的类是无法被继承,而对于抽象类来说就是需要通过继承去实现抽象方法。
    (4)抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
    (5)抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。
    与接口的区别
    (1)接口通常用interface来声明。
    (2) 抽象类中的方法可以有方法体,但是接口中的方法不行。接口中的每一个方法是隐式抽象的,即接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
    (3)抽象类中的成员变量可以是各种类型的,而接口中的成员变量会被隐式的指定为 public static final 变量,而且只能是 public static final 类型的。
    (4) 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
    (5)一个类只能继承一个抽象类,而一个类却可以实现多个接口。

接口,在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类可以通过继承接口的方式,从而来继承接口的抽象方法。接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。而接口则包含类要实现的方法。接口的特点:接口不能用于实例化对象;接口没有构造方法;接口中所有的方法必须是抽象方法;接口不能包含成员变量,除了 static 和 final 变量;接口不是被类继承了,而是要被类实现;接口支持多继承;接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中所有的方法(除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。)

  • static
    在Java语言中,static表示“静态”的意思,使用场景可以用来修饰成员变量和成员方法,当然也可以是静态代码块。static的主要作用在于即使没有创建对象,也能使用类的属性和方法。特点:
    (1)static可以修饰变量,方法
    (2)被static修饰的变量或者方法不属于任何一个实例对象,而是被类的实例对象所共享。
    (3)在类被加载的时候,就会去加载被static修饰的部分。当类加载完毕之后,即便没有创建对象,也可以去访问。
    在静态方法中没有this关键字,因为静态是随着类的加载而加载,而this是随着对象的创建而存在的。通常静态的可以访问静态的,静态的不能访问非静态的,非静态的可以去访问静态的。但在静态方法中调用非静态方法(或实例变量)时,可以先在静态成员函数中声明一个类的对象,然后再调用类的非静态成员变量或方法。
静态代码块:
(1)语法格式:
static{
      java语句;
}
(2)静态代码块在类加载时执行,并且只执行一次。静态代码块在一个类中可以编写多个,并且遵循自上而下的顺序依次执行。
构造代码块:
(1)语法格式:
{
      java语句;
}
(2) 构造代码块(实例代码块)在创建对象时被调用,每次创建对象都会调用一次,但是优先于构造函数执行。构造代码块可以编写多个,也是遵循自上而下的顺序依次执行。
  • final
    final 表示"最后的、最终的"含义,变量一旦赋值后,不能被重新赋值。final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。关于final
    (1)java语言中规定实例变量被final修饰之后,必须手动赋值,不能采用系统默认值。
    (2)final修饰的实例变量,一般和static联合使用,被称为常量(java规范中要求所有常量的名字全部大写,每个单词之间使用下划线连接),常见的语法格式:public static final 类型 常量名 = 值(static用来表示只保存了一份副本,而final用来保证变量不可变)。
    (3)父类中的 final 方法可以被子类继承,但是不能被子类重写。声明 final 方法的主要目的是防止该方法的内容被修改。
    (4)final 类不能被继承,没有类能够继承 final 类的任何特性。其中,final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
    (5)final修饰的引用一旦指向某个对象之后,不能再指向其他对象,那么被指向的对象无法被垃圾回收器回收。
    (6)final修饰的引用虽然指向某个对象后不能指向其他对象,但是所指向的对象内部的内存是可以被修改的。
  • synchronized 和 volatile
    主要用于线程的编程。

六、变量

  1. 局部变量
    在方法体当中声明的变量叫做局部变量
  2. 成员变量
    在方法体外【类体之内】声明的变量叫做成员变量,分为类变量和实例变量。对于局部变量,必须首先经过显示的初始化,才能使用它。然而对于成员变量,不管程序有没有显示的初始化,Java虚拟机都会先自动给它初始化为默认值。
  • 类变量:也称静态变量,通常有static关键字修饰,随着类的加载而加载,被所有对象所共享,整个生命周期内,系统只为类变量分配一次内存。
  • 实例变量:实例变量随着对象的建立而存在于堆内存中,其生命周期随着对象的消失而消失。每创建一个类的对象时,java虚拟机就会为实例变量分配一次内存,他们之间互不影响。
    其中,类变量既可以通过某个对象名也可以通过类名来访问,实例变量只能通过对象名访问。


七、this、super 关键字

  1. this关键字
    this是一个关键字,用于指向当前正在执行动作的对象。this是一个引用,是一个变量,this变量中保存了内存地址指向其自身,this存储在JVM堆内存java对象的内部。this在大多数情况下是可以省略不写的。this关键字主要有三个应用:
    (1)this调用本类中的属性,也就是类中的成员变量;
    大部分时候,普通方法访问其他方法、成员变量时无须使用 this 前缀,但如果方法里有个局部变量和成员变量同名,为了能够区分局部变量和成员变量,成员变量前的"this."不能省略。
    (2)this调用本类中的其他方法;
    this 关键字最大的作用就是让类中一个方法,访问该类里的另一个方法或实例变量。但this不能使用在带有static的方法当中,因为static方法当中是没有this的,也就是说当前对象是不存在的,其访问实例变量或方法前需要先创建对象。
    (3)this用于调用本类中的其他构造方法。
    语法格式:【this(实参);】,调用时要放在构造方法的首行,且在一个构造方法中只能调用一次其他的构造方法。如果一个类中出现多个构造函数,则通过this括号内的形式参数选择调用哪个构造方法。
  2. super关键字
    super是当前对象的父对象的引用,可以用来访问父类的构造方法、普通方法和属性。super关键字的用法如下:
    (1)访问父类的成员方法和变量;
    当子类的成员变量或方法与父类同名时,可以使用 super 关键字来访问父类的属性或方法(super.父类属性名;super.父类方法名())。如果子类重写了父类的某一个方法,即子类和父类有相同的方法定义,但是有不同的方法体,此时,我们可以通过 super 来调用父类里面的这个方法。
    (2)在子类的构造方法中显式的调用父类构造方法.
    super 关键字可以在子类的构造方法中显式地调用父类的构造方法,基本格式如下:【super(实参);】。如果一个类中没有写任何的构造方法,JVM 会生成一个默认的无参构造方法。在继承关系中,由于在子类的构造方法中,第一条语句默认为调用父类的无参构造方法(即默认为 super(),一般这行代码省略了), 且 super() 必须是在子类构造方法的方法体的第一行。所以当在父类中定义了有参构造方法,但是没有定义无参构造方法时,编译器会强制要求我们定义一个相同参数类型的构造方法。另外,和this( )一样,super( ) 指的也是对象,所以,不可以在 static 环境中使用,包括 static 变量、static 方法和 static 语句块。
    注意:this 和 super 不能同时出现在一个构造方法里面,因为如果一个类继承了其他类,那么在初始化的时候,super默认先调用父类的无参构造,或者super调用父类的有参构造,然后再完成子类特有的属性的初始化。而在构造函数中,this调用的是其他构造函数,而其他构造函数中也有super存在,这样就存在两个super,所以在同一个构造方法里面有相同的语句,就失去了语句的意义,编译器也不会通过。






相关参考链接:
https://www.cnblogs.com/sank/p/10601282.html
https://www.bilibili.com/video/BV1Rx411876f?p=131
https://www.runoob.com/java/java-modifier-types.html
http://c.biancheng.net/view/6394.html
https://baijiahao.baidu.com/s?id=1601254463089390982&wfr=spider&for=pc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值