Java基础

Java基础,第1张

Java基础 Java跨平台性

我们所写的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

this和supper的区别

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()是链表的一个方法,用于获取链表的长度

面向对象三大特性

封装: 把相关的数据封装成一个“类”组件

继承: 是子类自动共享父类属性和方法,这是类之间的一种关系

多态: 增强软件的灵活性和重用性

类和对象的关系
  1. 我们先创建类,再通过类创建出对象
  2. 我们可以通过一个类创建出多个对象
  3. 类是抽象的,对象是具体的

对象的创建过程分析:

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 的区别

throws

用在方法声明处,其后跟着的是异常类的名字

表示此方法会抛出异常,需要由本方法的调用者来处理这些异常

但是注意:这只是一种可能性,异常不一定会发生

throw

用在方法的内部,其后跟着的是异常对象的名字

表示此处抛出异常,由方法体内的语句处理

注意:执行throw一定抛出了某种异常

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5707574.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存