JDK: Java development kit
JRE: Java Runtime Evironment
java–>.class
.class名称是由java中class的名字决定的,和java名称无关
.class是字节码文件,JAVA是跨平台的语言,真正执行的不是二进制代码而是字节码。
c不能跨平台,但是JVM是c写的
float a = 1.2会报错,用double不会报错
如果使用float,可以用float a = 1.2f
不能够将范围大的值赋给表示范围小的值,(但是可以强制转换)
如int类型不能够赋给float,但是范围小的可以赋给范围大的
若有若干变量参与运算时,结果取决于这些变量中范围最大的那个,如有int, float, double时,最终结果是double
取模时的符号永远与被除数相同。
关系运算的结果是double类型
逻辑运算符的短路特性
逻辑与:若第一个为false,将不会执行后面的运算,即发生的短路
逻辑或:若第一个为true,将不会执行后面的,即发生短路
条件运算符 type d = a?b:c
若a对 d=b, 若a错, d=c
类命名:首字母大写,若若干个单词,则每个首字母都大写,其他小写
方法命名:首字母小写,若多个单词,除首个其他大写如addThree…
属性命名:和方法命名相同
局部变量必须声明且赋初值(与c++不同)
成员变量必须声明,但是可以不附初值。
没有初始化的成员变量,初始值为
byte short int long 为0
float double 为0.0
char ‘\u000’
Boolean : false
构造方法,static
构造方法完成对象属性的初始工作
名字和类命完全相同
无返回值,无void
不能够显式调用类的构造方法,构造方法通常通过new关键字隐式调用
new关键字在生成对象时完成了三件事情
1、为对象开辟了内存空间
2、调用类的构造方法
3、将生成的对象地址返回
如果一个java源文件中定义了多个类,那么这些类中最多只有一个能够是public
构造方法重载:只需要看参数即可,如果想在一个构造方法中调用另外一个构造方法,那么可以使用this.()方法调用。this.()括号里参数表示目标构造函数的参数this.()必须作为构造方法的第一条语句
若想生成子类对象必须先生成父类对象。
super关键字,super表示对父类对象的某个构造方法。super()中可有参数
注意事项:
构造方法不能够被继承,方法和属性可以
子类的构造方法隐式的调用父类的不带参的构造方法
若父类没有不带参的构造方法,使用super显式的进行方法调用,super关键字在构造方法中第一行语句。
重写,重载,多态
方法重写override:子类和父类返回类型一样,方法名称一样,参数一样则为重写,又称为覆写
重载是一个类内部,重写是父类和子类
当两个方法是重写关系时,在子类中可以通过super. 调用父类方法,不必放在第一个,因此此时父类对象已完成构造
若没有显式指定该类的父类,则继承于java.lang.Object是所有类的直接或间接父类。
多态:父类型的引用可以指向子类的对象
Parent p = new Child();当多态使用调用方法时,会首先检查parent中有无此方法,如果没有,则编译错误,若有再去调用子类该方法。
p实际上是Parent类型,但是指向child对象
向下转换
Animal a = new Dog();
Dog dog = (Dog)a;
是对的。
父类可强制转换为子类型中,但是指向谁就可以转换成谁,因为指向Dog所以可以转换成dog
一共有两种强制类型转换:
向上类型转换upcast,比如将Cat转换成Animal类型,即子类型转为父类型,对于向上类型转换,不需要显示指定,不需要强制转换语法
Cat cat = new Cat();
Animal animal = cat;即可
向下类型转换downcast,比如将Animal类型转换为Cat类型,即将父类型转换为子类型,对于向下类型转换必须是显式指定(必须使用强制类型转换)
Animal animal = New Cat();
Cat cat = (Cat)animal;
抽象类:abstract class:抽象类无法实例化
抽象方法:用abstract修饰,抽象方法定义在抽象类中,有定义无实现。之前是具体方法(有声明有实现)。
抽象类中可以包含具体方法
在子类继承父类(父类是个抽象类)的情况下,那么子类必须要实现父类中所定义的所有抽象方法,否则该子类需要声明成一个abstract class
父类shape为abstract
子类triangle
Shape shape = new Triangle(); 正确
接口interface:地位等同于class
接口中所有方法都是抽象方法
在声明接口的方法时,可以使用abstract关键字,也可以不使用,通常情况下会省略
类可以实现接口,实现使用implements代表某类实现接口
接口中的成员变量都是public final static
一个类实现了某个接口,那么该类必须要实现接口中声明的所有方法,若为抽象类,则无需实现接口中类
Java是单继承,即只能有一个父类,但是一个类可以有多个接口,用逗号分隔
class Myclass implements MyInterface, Myinterface2
多态:所谓多态,就是父类型的引用可以指向子类型的对象,或者接口类型的引用可以指向实想该接口的类的实例。关于接口和实现接口的类之间的强制类型转换方式与父类和子类之间的强制类型方式完全一样
static关键字,可用于修饰属性,也可用于修饰方法,还可以修饰类
static修饰属性:无论一个类生成了多少个对象,所有这些对象共同使用唯一一份静态的成员变量,一个对象对该静态成员变量进行了修改,其他对象的值也随之发生了变化。
若一个成员变量是static,则可以通过类名.成员变量使用
static修饰方法:静态方法
可以并且推荐类名.方法名称来使用
子类不能够重写父类的静态方法
静态方法不能够被覆盖,静态也不能够覆盖(但可以隐藏)–》父类子类静态
静态方法只能继承,不能重写(Override)
A a = new B()时,静态方法要看A的类型,不看指向谁
Final关键字:可修饰属性、方法、类
Final修饰类:当一个类被final所修饰,表示该类是一个终态,即不能够被继承
Final修饰方法:当一个方法被final修饰时,即该方法是一个终态方法,即不能够被重写override
Final修饰属性:当一个属性被final修饰,该属性不能够被改写
当final修饰一个原生数据类型的时候,表示该原生数据来行的值不能够发生变化,如果final修饰一个引用类型时,表示该原生数据类型的值不能再指向其他对象了,但该引用所指向对象的内容可以发生变化,对于final类型成员变量,一般有两种赋值方式::
在声明final类型的成员变量时就赋上初值
在声明final类型的成员变量时不赋初值,但在类的所有构造方法中都为其赋上初值
static静态代码块
先执行静态代码块,后构造方法
静态代码块在类被加载的时候执行,而构造方法是在生成对象的时候执行,想要调用某个类生成对象,首先需要将类加载到JVM中,然后由JVM来加载这个类生成对象
类的静态代码块指挥执行一次,是在类被加载的时候执行的,因为每个类只会被加载一次,所有静态代码块也只会被执行一次。而构造方法则不然,每次生成一个对象的时候都会调用类的构造方法,new一次就会调用构造方法一次
如果继承体系中既有构造方法,又有静态代码块,那么首先执行最顶层的类的静态代码块,一直执行到最底层类的静态代码块。注:静态代码块只会执行一次
不能再静态方法中访问非静态成员变量,可以在静态方法中访问静态的成员变量,可以在非静态方法中访问静态成员变量
静态的只能访问静态的,非静态的可以访问一切
不能在静态方法中使用this关键字,this关键字是对当前对象的引用,但静态代码不涉及当前对象的概念
接口、抽象类
接口中所声明的方法都是抽象方法,接口中的方法都是public
接口中也可以定义成员变量,接口中的成员变量都是Public Final Static,可省略
abstrat final class是错误的
abstract需继承,定义约定,让子类实现其约定,final不可继承
包package用于完成不同功能的类分门别类,放在不同的目录下
命名规则:反转域名
如果定义类时没有使用package,那么Java就认为我们所定义的类位于默认的包里default package
编译带有package声明的Java源文件:
直接编译,然后根据类中所定义的包名,将逐一手工建立目录结构,最后将生成的class放在该目录结构中(不常用)
编译参数-d 方式为javac -d 源文件.java
两个包aa.bb.cc和aa.bb.cc.dd,那么我们称后者是前者的子包
import导入包
String类剖析
equals方法,该方法定义在Object类,因此Java中的每个类都会具有该方法,判断这两个引用是否为同一个对象,对于Object类equal等价于“==”
对于String类的equals方法来说,它是判断当前字符串与传进来的字符串内容是否一致
对于String对象的相等性判断使用equals()方法,而不要使用“==”
String是常量,其对象一旦创建完毕就无法改变,当使用“+”拼接字符串时,会生成新的String对象,而不是向原有的String对象追加内容
相等性比较:
对于原生数据类型来说,比较的是左右两边的值是否相等
对于引用类型来说,比较左右两边的引用是否指向同一对象,或者说左右两边的引用地址是否相同
Java.lang.Object类
java.lang包在使用时无需显式导入
API:Application Programming Interface
当打印引用时,实际上会打印出引用所指对象的toString方法的返回值,因为每个类都直接或间接的继承自Object,而Object类定义了toString(),因此每个类都有同String这个方法
String不可被继承
StringPool(字符串池)
String str3=“bbb”
String str4=“bbb”
再次,str3和str4中并没有生成对象,而是在字符串中将已存在的“bbb”返回,所以str3==str4
但是String str = new String(“aaa”)这种==比较是比较对象
new出来的放在堆里面,字符串放在栈里面
当String s = new String(“aaa”)
首先在StringPool中查找有没有“aaa”这个字符串对象,如果有,则不在StringPool中再创建aaa对象,直接在堆中创建一个aaa字符串对象,然后将堆中的aaa对象地址返回来
如果StringPool中没有,则首先在StringPool中创建一个“aaa”其余一致
访问修饰符
public属性和方法可以被所有类访问
protected受保护的
private私有的
默认的(不加任何修饰符)在类内部以及相同包下面的类使用
protected:被protected所修饰的属性和方法在类的内部、相同包以及该类的子类所访问。是子类内部,并不是子类生成的对象实现。
判断某个对象是否是某个类的实例,语法形式
引用名 instanceof 类名
返回的是布尔值
StringBuffer可添加内容,转换成String
String str = StringBuffer.toString().