Java基础之数据类型、内存、修饰符、代码块
Java 数据类型
基本数据类型
- 数值:int、short、long
- 字符:char
布尔:boolean
引用数据类型
- class(类)
- interface(接口)
数组[]
所占字节数(
1 byte= 8 bits)- int:4字节
- char: 规定2字节。若使用UTF-8编码,数字和英文等占1个字节,中文3个字节;若用GBK编码,中文是2个字节
- float:4字节
- short:2字节
- long:8字节
double:8字节
注意:Java中整数默认的是Int,小数默认double
float f = 2.3; // 2.3默认为double,不能转为float,可能丢失精度
float f = 2.3f; // true 末尾加f,表示这是一个float型
long l = 12343565475989778034; // false, 默认为int,但是超出了范围
long l = 12343565475989778034l; // 末尾加l,表示这是long型
但是如下代码第一行是正确的。
byte b = 4; // 默认int,但经过检查4是在byte型范围内的,发生int -> byte的隐式强转
b = b + 3; // false,和为int,int型不能赋值给byte
// aa和bb都是变量,其和不能确定是否在范围内
byte aa = 3;
byte bb = 4;
byte cc = aa + bb; // false
byte cc = 3 + 4; // 但若明确给出常量,则true
- 变量(局部)仅在一对
{}内有效,然后被销毁。局部代码块,可以决定局部变量的生命周期。
{
int a = 3;
}
System.out.println(a); // false, 已经出了这对{},被销毁了
- switch语句
// 若不加break,从匹配到的那个case开始,之后如果都没break,都执行,不会跳出
switch (expression) {
case x:
code;
break;
case y:
code;
break;
default:
code;
break
}
函数重载和重写(覆写@Override)
- 函数重载
- 同一个类中
- 同名
- 参数不同,或者类型不同
- 函数重载和返回类型无关!
- 函数覆写(@Override)
- 继承了父类或者实现了借口,有事需要Override父类的方法,定义子类特有的方法。
- 返回类型,参数列表,函数名都一致。修饰符一般也一致,总的来说,除了内部实现全部一样。
数组--引用类型
- 数组的定义
int[] a = {1, 23, 3};
int[] b = new int[4]; // 此种定义方式必须指定数组长度
int[] c = new int[]{1, 2, 3}; // 一般不这么写
- 二维数组
int[][] arr2= new int[3][]; // 至少给第一维指定长度
// 每行的列数相同,3行2列
int[][] = arr2 = new int[3][2];
// 每行列数不一样
int[][] arr2= new int[3][];
arr2[0] = new int[2]; // 第1行
arr2[1] = new int[3]; // 第2行
arr2[2] = new int[4]; // 第3行
栈内存和堆内存
- 栈内存:存储的是局部对象,作用域结束就被释放
- 堆内存:存储的是数组和对象,凡是new建立的都在堆内存中
int[] arr = new int[3];
// 这句右边new一个引用数据到堆内存,给三个值默认初始化为0
// a指向这个数组对象,即地址。也可以说new出来的数组把它的地址给了arr
// arr = null; 表示空,不绑定地址了
int[] a = new int[3];
int[] b = new int[5];
a = b; // 把b的地址绑定到a,a和b都指向b的地址了
System.out.println(arr); // 打印的是地址,格式为"[I@number",表示int,number为16进制表示的地址
访问修饰符
- public:任何类任何包都可以访问
- private:仅限于当前类中访问
- default(什么修饰符都不写,默认):同一个包的都可以访问,不同包的子类也不能访问
- protected:同一个包,不同包只有子类可访问。(范围比default大一点)
public static void main(String args[])
这是固定格式!
为什么必须这样写?
- public:外界(JVM)调用main()函数,为了方便访问,设为最高权限
static:静态函数,非类成员函数,无需new新对象就可通过
类名.main()直接调用。- void:main()函数就是执行任务,不需要返回什么值。
- main():JVM识别main()字样,当满足
public static void main(String args[])这样的写法时,则把其当成程序的入口开始执行。 String args[]:命令行参数,规定必须要有
public static void abc(String args[]) // 函数名不是main,不是主函数
public static void main() // 缺少命令行参数 String args[]也不是主函数
static void abc(String args[]) // 不是主函数,一定要是public static void main(String args[])
静态static
静态函数
静态函数一般作为工具函数,里面不可以用类成员,只能全用静态成员或者方法,但是成员函数却可以用静态数据和方法。
静态变量
static int money这样就是一个静态数据了。可以被很多对象共享,对象A改变了a,对象B中的a也改变了。大家用同一份money。
package Test;
public class StaticDemo {
private static int money = 100;
public int getMonney() {
return money;
}
public void useMoney() {
money--;
}
public static void main(String[] args) {
StaticDemo a = new StaticDemo();
StaticDemo b = new StaticDemo();
// a用了一块
a.useMoney();
// 还剩99
System.out.println(a.getMonney());
// b用的是同一份money
b.useMoney();
// 还剩98
System.out.println(b.getMonney());
}
}
- 成员变量和静态变量
- 成员变量随对象的建立而建立,随对象消亡而消亡。< -- > 静态变量随着类(和对象即实例区别开)的加载而加载,随类的消亡而消亡。即静态成员是先于实例存在的,还没new出对象就存在了。
- 成员对象只能是new出新实例后调用。< -- > 静态成员可以直接使用,
类名.静态变量即可。 - 成员变量被称为实例变量。< -- > 静态变量被称为类 变量。
- 成员变量位于堆内存的对象中,是对象的特有数据。 < -- > 静态变量位于方法区(的静态区)中,也叫对象的共享数据。
Q:static为何不能调用非静态方法或者数据?
A:因为静态数据先于对象就已经产生,成员变量还不存在,不能访问。同理static函数中不能出现this、super关键字。
Q: 什么时候用static?
A:1. 静态变量,共享数据时,各个对象都使用同一个数据,不必作为对象特有的数据时候。如每个学生的姓名是特有的,但是每个学生可以共用同一个图书馆。
- 静态方法,无需访问类成员时(非静态),就可以定义为静态,一般为工具函数。
各种代码块
public class Abc {
// 构造代码块,没有static。每new一个对象,就执行一次,故称为构造代码块
// 针对不同的对象,进行相同的初始化,而构造函数对不同的对象进行不同的初始化,如给不同的人传入不同的名字和年龄进行初始化
{
System.out.println("我是构造代码块")
}
// 构造函数
Abc() {
System.out.pritnln("我是构造函数,后于构造代码块执行");
}
// 静态代码块最先执行,不论放在main()前面还是后面,都先于main加载,且只执行一次
static {
System.out.println("我最先");
}
public static void main(String args[]) {
Abc a = new Abc(); // 先进入先构造代码块,
// 以下是局部代码块,b只在这对{}内有效
{
int b = 3;
}
System.out.println(b); // false,b已经被释放
}
}
!!!总的来说,执行顺序:static代码块 --> main() --> 构造代码块 --> 构造方法
by @sunhaiyu
2016.12.8
Java基础之数据类型、内存、修饰符、代码块的更多相关文章
- Java—匿名对象/内部类/访问修饰符/代码块
匿名对象 匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量. //创建一个普通对象 Person p = new Person(); //创建一个匿名对象 new Pers ...
- JAVA基础语法——标识符、修饰符、关键字(个人整理总结)
JAVA基础语法——标识符.修饰符.关键字 一 . 标识符 1.1 什么是标识符 就是程序员在定义java程序时,自定义的一些名字,例如helloworld 程序里关键字class 后跟的Dem ...
- java 基础 四种权限修饰符
/** * Java有四种权限修饰符: * public > protected > (default) > private * 同一个类 YES YES YES YES * 同一个 ...
- 2、Java 基础语法标识符、修饰符、变量、 数组、枚举、关键字
Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如 ...
- java基础语法(标识符 修饰符 关键字)
标识符 用来表示类名,变量名,方法名,类型名,数组名,文件名的有效字符序列称为标识符. 1)只有字母(区分大小写),下划线,美元符号和数字组成,长度不受限制.注:字母包括英文26个字母 ,汉字,日 ...
- Java基础语法:static修饰符
一.静态变量 描述: 在类中,使用'static'修饰的成员变量,就是静态变量,反之为非静态变量. 区别: 静态变量属于类的,可以使用类名来访问:非静态变量是属于对象的,必须使用对象来访问. 静态变量 ...
- java基础(14)---修饰符
修饰符:final .static.public.protected.private.default. 一.final(不能修改) 使用final修饰变量定义:该变量一旦被初始化之后就不允许再被修改. ...
- Java基础语法:abstract修饰符
一.简介 描述: 'abstract'修饰符可以用来修饰方法,也可以修饰类. 如果修饰方法,那么该方法就是抽象方法:如果修饰类,那么该类就是抽象类. 抽象类和抽象方法起到一个框架作用,方便后期扩展的重 ...
- Java基础语法:final修饰符
一.final类 描述: 用'final'修饰的类不能被继承,没有子类. 例如,我们是无法写一个类去继承String类,然后对String类型扩展的,因为API中已经将String类定义为'final ...
- Java基础之线程——管理线程同步代码块(BankOperation4)
控制台程序. 除了同步类对象的方法之外,还可以把程序中的语句或代码块制定为synchronized,这种方式更强大,因为可以指定哪个对象从语句或代码块的同步中获益,而不像同步方法那样仅仅是包含代码的对 ...
随机推荐
- loadrunner11的移动端性能测试之脚本录制
以前使用LR11录制过一个app的登录操作,这里记录一下 测试准备 硬件要求 1, 负载测试机一台(内存8G以上,cpu 1.5GHZ以上,存储空间20G以上)或两台以上(控制机和多个负载机). 2 ...
- flask笔记二
web表单 web表单是浏览者和网之间的一个互动平台,完成浏览器和服务器之间的数据交互. 1.用Flask-WTF来处理表单 (1)在根目录下编辑扩展配置--config.py CSRF_ENABLE ...
- libpng处理png图片(二)
一,实现效果:图片剪切, 图片拼接 ------------------切割后------------------> ...
- 利用jenkins做项目的自动化部署
最近领导要求上海本地的项目需要使用进jenkins实现自动化部署,以便可以直接将项目移交给运维的同学,减轻开发的工作量.记录下这次爬坑的过程. 一.前言 Jenkins是基于Java开发的一种持续集成 ...
- .NetCore+Jexus代理+Redis模拟秒杀商品活动
开篇叙 本篇将和大家分享一下秒杀商品活动架构,采用的架构方案正如标题名称.NetCore+Jexus代理+Redis,由于精力有限所以这里只设计到商品添加,抢购,订单查询,处理队列抢购订单的功能:有不 ...
- RADIUS and IPv6[frc-3162译文]
如今项目中需要涉及到RADIUS及IPv6的使用,而网络中的资料相对较少,现对frc-3162进行中文翻译,分享出来. 由于英语水平有限,翻译不恰当的地方,还请提出,便于在下及时修改. 原文链接 这份 ...
- 简单总结一下 XSS
你听说过XSS吗? XSS(Cross-site scripting, 跨站脚本)是一种网站应用程序的安全漏洞攻击,是代码注入的一种. 研究表明,最近几年 XSS 已经超过 "缓冲区溢出&q ...
- Your password does not satisfy the current policy requirements
创建用户,做测试想设置一个简单的密码.报错: 大概是MySQL5.7搞事情,默认安装了validate_password插件. mysql> SHOW VARIABLES LIKE 'valid ...
- Vijos 1011 清帝之惑之顺治 记忆录式的动态规划(记忆化搜索)
背景 顺治帝福临,是清朝入关后的第一位皇帝.他是皇太极的第九子,生于崇德三年(1638)崇德八年八月二ten+six日在沈阳即位,改元顺治,在位18年.卒于顺治十八年(1661),终24岁. 顺治即位 ...
- LRU算法总结
LRU算法总结 无论是哪一层次的缓存都面临一个同样的问题:当容量有限的缓存的空闲空间全部用完后,又有新的内容需要添加进缓存时,如何挑选并舍弃原有的部分内容,从而腾出空间放入这些新的内容.解决这个问题的 ...