java是跨平台语言,真正执行的不是2进制码,而是字节码.
?
JVM---java virtual machine java虚拟机.java虚拟机不是跨平台的,jvm是由C语言编写的.
因为linux,window,mac等等操作系统所用的jvm是不同的.
?
java有两类数据类型:原生数据类型和引用类型.
原生数据类型:int,byte(-128~127 8位),short(16位),long(32位),
???????????????? float,double,char,boolean.
?
关于计算机的数据表示:
位bit ---只有0,1两个状态,是计算机中最小的表示单位.
字节byte --- 1 byte=8bit.
KB --- 1 KB =1024 Byte.? 1024 = 2的10次方.
MB --- 1 MB = 1024 KB.
GB --- 1024 MB.
?
5%(-2)==1? -5%2==-1 -5%(-2)==-1 证明了余数的符号和被除数一样.
?
java三大基本特征:封装,继承,多态.
?
属性定义在类中叫成员变量,定义在方法中叫局部变量.
使用前,局部变量必须初始化;但是成员变量可以不初始化,因为成员变量可以自己有自己的默认值.
?
对于java的方法参数传递,无论是原生类型还是引用类型,统一都是传值.
?
在定义一个类的时候,如果没有构造方法,java编译器会自动添加一个默认的构造方法;
如果为类声明了构造方法,那么java编译器就不会再添加默认的构造方法了.
?
new关键字顺序完成的三件事件:
为对象开辟内存空间--->调用类的构造方法--->将生成的对象地址返回.
?
如果想在一个构造方法中调用另外一个构造方法,那么使用this()方式调用.
但是this()之前不能有任何可执行的代码.
因为如果在构造方法中的this()之前有代码,那么该程序不晓得先执行
哪个构造方法执行的数据才是正确的了.
?
当生成子类对象时,java默认先调用父类不带参数的构造方法.
但是可以改变这种机制,利用super()来去调用父类任何的构造方法.
?
因为super()和this()在子类的构造方法中都必须处于第一行,两个
特殊的方法有冲突,所以在子类同一个构造方法中不能同时有
super和this两个特殊的构造方法.
?
继承---子类可以继承父类的属性和方法,但是只有构造方法不能被继承.
子类的构造方法可以隐式地调用父类不带参数的构造方法.
?
当两个方法发生重写关系时,可以在子类方法中通过super.xxx()形式调用
父类的xxx()方法,并且super.xxx()不必放在第一行.
?
?多态---子类就是父类,比如:人是男人的父类,所以可以认为男人是人.
Person man =new Man();??? //Person是Man的父类.
多态---父类型的引用可以指向子类型的对象,或者接口类型的引用可以
指向实现该接口的类的实例.
?
抽象类:使用abstract关键字.抽象类无法实例化,不能new出来抽象类对象.
抽象方法:也用abstract关键字,有声明无实现,没有{}括号,用;直接结束.
抽象方法一定是定义在抽象类中的.
如果一个类包含抽象方法,那么这个类一定是抽象类.
但是如果一个类是抽象类,它也可以包含具体方法,也可包含抽象方法,
也可以什么方法都不包含.
如果父类是个抽象类,子类去继承这个父类,那么子类必须要实现父类中
所有的抽象方法.
?
接口中的所有方法都是抽象方法.
接口中的方法可以使用abstract关键字,也可以不使用.
其实接口是一个特殊的抽象类.
一个非抽象类实现某个接口,那么该类必须要实现该接口中声明的所有方法.如果该类是个抽象类,那么无需实现接口中的方法了.
?
static可以修饰属性,修饰方法,也可修饰类.
static在内存中分配的空间永远是静止的,所以无论生成出多少个对象,
这些对象都会使用唯一的这份静态的内存空间.
static可以通过不用new出对象来访问,直接通过类就可以访问.
?
子类可以继承父类的static静态方法,但是子类不能重写父类的静态方法.其实子类一直隐藏着父类的静态方法.
?
final---可以修饰属性,方法,类. final修饰的类,方法,属性不能被继承和重写和覆盖.
?
为什么成员变量可以有默认值,局部变量没有?
类成员变量因为你在new一个对象时,分配了内存空间后会给所有的成员变量一次初始化,没有赋值的会给成员变量对应类型的“0”值,然后才构造对象初始化。每一个对象都有一个成员变量的副本,一直存在于对象的堆空间直到这个对象空间被回收。
局部变量在用的时候是直接入栈的,如果没有赋值,这个变量就没有初始值,也就无法操作,所以局部变量要初始化。并且局部变量在方法结束后会出栈,就像它没有来过一样。
?
static代码块---静态代码块.主要是完成一些初始化的工作.
首先执行静态代码块(将类加载到java虚拟机上),然后执行构造方法(JVM生成对象).
加载的时候只会加载一次,所以静态代码块只会执行一次.
?
静态的只能访问静态的;非静态的可以访问一切.
不能再静态方法中使用this关键字.
?
接口中所声明的方法都是抽象方法.接口中的方法都是public的.
接口中的成员变量是public,final,static的.实际的开发中其实基本不在接口中定义属性.
?
protected---作用在类内部,相同的包下以及该类的子类(子类和父类不在同一个包下)访问.
不加任何修饰符---int i;作用在类内部以及相同的包下类使用.
?
equals ---对于object类来说,equals就相当于==.
但是对于继承了object类然后重写了equals方法的类来说,就不同于==.
比如String类重写了equals方法,就是判断对象的内容是否相同.
比如对于一个自定义的student类. Student s1 = new Student("123");Student s2 = new Student("123");
System.out.println(s1.equals(s2));?? // 这里返回的是false.因为这里没有重写equals方法,所以equals就相当于==.
?
String类是一个特殊的类.String类有个特殊的东西---StringPool(字符串池).
比如:String str = "aaa";
首先java会到字符串池中区查找是否存在"aaa"这个对象,如果不存在,则在字符串池中区创建一个aaa对象,
然后将StringPool中这个aaa对象的地址返回来,赋给引用变量str.
如果在字符串池中存在这个对象,则不创建任何对象,直接将字符串池中这个对象的地址返回来.
?
String str = new String("aaa");
首先在字符串池中查找有没有aaa这个对象,如果有,则不在字符串池中去创建aaa对象,
而直接在堆heap中创建一个aaa字符串对象,然后将aaa这个对象的地址返回,赋给str引用.
如果在字符串池中没有这个对象,那么先在池中创建这个对象,再去堆heap中创建aaa对象,
然后将堆中地址返回来.
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?