我们所写的JAVA程序是".java"为后缀的源文件,但这些文件计算机无法直接执行,需要先进行编译环节,通过编译变为以".class"为后缀的字节码文件,这个字节码文件交由JVM(JAVA虚拟机)来运行.
那我们只要在需要运行java应用程序的OS( *** 作系统)上,安装一个JVM,由JVM来负责Java程序在该系统中的运行即可。不同的OS( *** 作系统)都有与之对应的JVM,所以只需要写一个Java程序,就可以在多个不同的 *** 作系统上执行。这样就实现了Java程序的跨平台性。也称为Java具有良好的可移植性。
JDK,JRE和JVM关系 数据类型 标识符的原则1. 标识符可以由字母、数字、下划线(_)、美元符($)组成,但不能包含 @、%、空格等其它特殊字符
2. 不能以数字开头。如:123name 就是不合法
3. 标识符严格区分大小写。如: tmooc 和 tMooc 是两个不同的标识符
4. 标识符的命名最好能反映出其作用,做到见名知意。
5. 标识符不能是Java的关键字
5条字面值规则1.整数默认为int类型
2.小数默认为double类型
3.byte short char 三种比int小的类型,可以使用范围内的值直接赋值
4.字面值后缀:L F D
5.字面值前缀:0b-2 0-8 0x-16
5条运算规则1.运算结果的数据类型与最大类型保持一致
2.3种比int小的类型,运算时会自动提升成int再运算
3.整数运算溢出的问题,一旦溢出,数据就错误了
4.浮点数运算不精确
5.浮点数的特殊值 Infinity NaN
final 和 static的用法Final用于修饰类、属性和方法:
被final修饰的类不可以被继承
被final修饰的方法不可以被重写
被final修饰的变量不可以被改变,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的.
Static:“静态”,可用来修饰类、成员变量和方法,也可以声明一个静态块。
被static修饰的变量,叫静态变量或类变量,静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。
static方法也叫静态方法,也可以直接使用“类.方法()”来直接调用。
静态块是在JVM加载类的时候执行的,并且只会执行一次。
static final:结合上述两者特性,使用无需实例化,声明必须初始化。可以同时使用static和final修饰成员变量和方法,此时的成员变量和方法可以直接用“类.名称”调用,成员变量的值不能改变,方法不能被覆写。
Overload和override的区别override(重写,覆盖)
(1)方法名、参数、返回值相同。
(2)子类方法不能缩小父类方法的访问权限。
(3)子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
(4)存在于父类和子类之间。
(5)方法被定义为final不能被重写。
(6)被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
overload(重载,过载)
(1)参数类型、个数、顺序至少有一个不相同。
(2)不能重载只有返回值不同的方法名。
(3)针对于一个类而言。
(4)不能通过访问权限、返回类型、抛出的异常进行重载;
(5)方法的异常类型和数目不会对重载造成影响。
override应用
(1)最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。
(2)除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。
总结
override是在不同类之间的行为,overload是在同一个类中的行为。
Overload的方法可以改变返回值的类型,因为它与返回值类型无关。
构造器Construct是否可被Override?
构造器不能被继承,所以不能被重写,但可以继承。当子类中没有任何构造器的时候,会通过super()调用父类的无参构造器。
接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可以继承具体类?抽象类中是否可有静态的main方法?
接口可以继承接口;抽象类可以实现接口,因为抽象类不一定就全是抽象方法;抽象类可以继承实体类;抽象类中可以有静态的main方法。
抽象类和普通类的唯一区别就是不能创建实例对象和允许有abstract方法。
静态变量和实例变量的区别1)语法定义上的区别
静态变量用static修饰
实例变量没有static修饰
(2)运行区别,实例区别
静态变量在类中,不属于实例对象,属于类所有,只要程序加载了字节码,不用创建实例对象静态变量就会被分配空间,已经可以使用。
实例变量是某个对象的属性,只有实例化对象后,才会被分配空间,才能使用。
类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;
而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象;
分析:静态变量共同类所有,值改变后,在之后的实例对象中也改变
实例变量属于当前对象所有
抽象类和接口的区别1.相同点
A. 两者都是抽象类,都不能实例化。
B. interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法。
2. 不同点
A. interface需要实现,要用implements,而abstract class需要继承,要用extends。
B. 一个类可以实现多个interface,但一个类只能继承一个abstract class。
C. interface强调特定功能的实现,而abstract class强调所属关系。
D. 尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现。
E. abstract class是interface与Class的中介。
abstract class
Interface
实例化
不能
不能
类
一种继承关系,一个类只能使用一次继承关系.可以通过继承多个接口实现多重继承
一个类可以实现多个接口
数据成员
可有自己的数据成员
静态的不能被修改即有static final
方法
可以私有的,非abstract方法,必须实现
不可有私有的,默认public,abstract类型
变量
可有私有的,默认是friendly 型,其值可以在子类中重新定义,也可以重新赋值
不可有私有的,默认是public static final 型,且必须给其初值,实现类中不能重新定义,不能改变其值。
设计理念
表示的是“is-a”关系
表示的是“like-a”关系
实现
需要继承,要用extends
要用implements
super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)
this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)
super()和this()类似,区别是,super()在子类中调用父类的构造方法,this()在本类内调用本类的其它构造方法。
super()和this()均需放在构造方法内第一行。
尽管可以用this调用一个构造器,但却不能调用两个。
this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。
break ,continue ,return 的区别及作用break 跳出总上一层循环,不再执行循环(结束当前的循环体)
continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件)
return 程序返回,不再执行下面的代码(结束当前的方法 直接返回)
size()方法和length属性在编程时经常会用到的两个东西,老是记混,因此特地看了一下。
length是数组的一个属性,在获取值的时候是按属性的方法获取。
而size()是链表的一个方法,用于获取链表的长度
面向对象三大特性封装: 把相关的数据封装成一个“类”组件
继承: 是子类自动共享父类属性和方法,这是类之间的一种关系
多态: 增强软件的灵活性和重用性
类和对象的关系- 我们先创建类,再通过类创建出对象
- 我们可以通过一个类创建出多个对象
- 类是抽象的,对象是具体的
Phone p = new Phone(); 这句代码,再内存中会发生什么呢?
1.在栈内存中开辟一块空间,存放引用类型Phone类型的变量p
2.在堆内存中开辟一块空间,存放Phone类型的对象
3.要给这个对象进行初始化,比如:String brand = null;
4.当对象准备好以后,会生成一个唯一的地址值,然后将此地址值交给引用类型的变量p来保存
5.如果以后想要 *** 作此对象的各种资源,可以通过p变量保存的地址值找到该对象,比如:p.call(); p.price = 66.6;
异常异常处理只有两种方式: catch 和 throws,所以必须二选一
由于Java语法本身的特点,需要开发者事先考虑异常如何处理,也就是我们常说的:“未雨绸缪”
对于初级开发者来说,我们可能会捕获,但不处理异常
try {undefined
…
} catch(Exception e) {undefined
}
底层异常,应该向前抛到前面处理
经验少时,不知道该在什么位置捕获处理,应该选择 throws
但是大家需要注意,在异常抛出时,有些异常比如运行时异常,可能并不会强制要求抛出此异常,调用时也没有报错显示需要额外处理,这个时候就需要大家平时多积累,掌握良好的编码习惯了,手动添加代码进行预处理,增强程序的健壮性了。
程序错误分为三种:
编译错误(checked异常);
运行时错误(unchecked异常);
逻辑错误;
throws
用在方法声明处,其后跟着的是异常类的名字
表示此方法会抛出异常,需要由本方法的调用者来处理这些异常
但是注意:这只是一种可能性,异常不一定会发生
throw
用在方法的内部,其后跟着的是异常对象的名字
表示此处抛出异常,由方法体内的语句处理
注意:执行throw一定抛出了某种异常
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)