1、Java类的成员变量:
Java类中的成员变量可以是任何一种数据类型(包括基本数据类型和引用数据类型);
在定义成员变量时可以对其进行初始化,如果不进行初始化,Java会使用默认值对其进行初始化,如下图。
成员变量的作用范围是整个类体。
2、Java类的构造方法
在对象的创建时,相当于使用了new + 构造方法来创建对象;
构造方法与类同名且没有返回值,如果自己不定义构造方法,则系统默认为其类提供一个形如类名 () { }的构造方法(将所有基本数据类型初始化为0,引用类型定义为null),如果我们定义了构造方法,系统则不会再为我们提供默认的构造方法。
Java中构造方法在调用时,构造方法中的形参会在栈内存中分配空间,当构造方法调用结束后,改栈空间就会被清理。如下图代码:
在该方法中的main函数中,当生成一个tom对象时,内存中的变化情况入下:
其中在栈内存中,存放了tom对象的引用,以及在构造函数执行过程中生成的栈空间,存放着两个形参的内存,在堆内存中则存放了该对象的成员变量的信息,当构造函数执行结束后,栈空间中的_id与_age的就会被释放掉。
看下面代码中内存的情况:
手画了一下大概的内存情况:
最后main方法执行完成后,堆内存中的start与end也被释放了,然后Java的垃圾回收机制则会去清理堆内存里的数据。
3、类:具有同一类事物的一个抽象。 对象:一个类的一个特殊的实例。
类与对象之间的关系:关联、继承、聚合(聚集、组合)、多态和实现。
4、面向对象的设计思想:继承、封装、多态和抽象。
5、Java中用关键字class定义一个类;用new来创建一个对象;引用(对象的引用,栈中的一小块儿内存指向堆空间的一大块儿内存。。。);new一般与构造函数一起使用(和类重名,没有返回值)。
6、方法重载(overload):在同一个类中,方法的名字一样,方法的参数类型或者参数个数可以不同。(构造函数的重载)。
在调用时,会根据不同的参数表选择对应的方法。(C++的静态多态。。。)
7、this关键字:this指的是当前对象,在堆内存中,存在一个自己的引用指向自身。(最常见是可以用于构造函数,当构造函数中的传参与类的属性一样时就可以使用如this.name = name这种写法以区分。)this也可以看作是一个变量,它的值是当前对象的引用。
8、static关键字:在类中,用static声明的成员变量为静态成员变量,其为该类的公用变量,在第一次使用时被初始化,对于该类的所有对象来说,static成员变量只有一份,分配在数据区。
用static声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它,所以static方法中不能访问非static的成员变量。(静态方法不再是针对某个对象的调用,所以不能访问非静态成员。)
可以通过对象引用或者类名(不需要实例化)访问静态成员。
9、package和import语句
为了解决众多类的命名冲突的问题,Java引入package机制,提供类的多重命名空间。(包起名的方法:一般把公司的域名反过来,这个类的class文件一定要位于正确的目录下,跟package的命名结构一样。)
使用时,用import关键字引用,引入单个类也可以,使用.*引入所有的类。Java中可以不使用import语句就可以直接使用java.lang包中的类,比如最常见的System和String类。
在使用时一定要注意环境变量的classpath路径,必须class文件的最上层包的父目录位于classpath下。也可以将其打到一个jar包里,将jar包的路径放到环境变量中(命令:jar -cvf xx.jar *.*)
10、访问控制权:private (default:什么都不写) protected public
11、extends关键字:一个类从另外一个类继承,继承中子类继承了父类的所有的成员变量以及所有的方法,包括private变量,但是private成员变量不能用。
12、super关键字:使用super关键字引用基类的成分。
13、继承中的构造方法:
子类的构造过程必须调用基类中的构造方法;
子类可以在自己的构造方法中使用super(参数列表)调用基类的构造方法(如果调用super,必须写在子类构造方法的第一行,即先构造父类然后构造子类;可以使用this(参数列表)调用本类中另外的构造方法。);
如果子类的构造方法中没有显式地调用基类的构造方法,则系统会默认调用基类无参的构造方法,如果基类没有无参构造方法,则编译会报错。
14、方法重写(overwrite/override):
在子类中可以根据需要对基类中继承的方法进行重写;
重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型(防止出错,在基类中复制。。。);
重写方法不能使用比被重写方法更严格的访问权限。
15、final关键字:
final的变量值不能够被改变,类似C++的const(final成员变量,final局部变量,传参);
final的方法不能被重写;
final的类不能被继承。
16、Java所有的老祖宗类,Object
Object类是所有Java类的根基类,如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类;
toString方法:Object类中定义有public String toString()方法,其返回值是String类型,描述当前对象的有关信息,返回值是:类名+@+哈希code;用户可以根据需要在自定义类型中重写toString()方法。
equals()方法:Object类中定义了public boolean equals(Object obj)方法,提供对象是否相等的逻辑比较;x.equals(y)当x和y是同一个对象的引用时返回true,否则返回false;JDK中重写了String和Date类中的equals方法,调用这些对象的equals方法时,当两个对象的是同一个类且对象的属性内容相等时(不要求是同一个对象),返回true,否则返回false;用户也可以根据需要重写自定义类型中的equals()方法。
17、upcasting:父类的引用指向子类对象,接口的引用指向实现了接口类的对象(C++中父类的指针指向子类) 反之downcasting
18、多态:实现多态的三要素 继承、重写和父类引用指向子类对象。
动态绑定是指:在程序执行期间,判断所引用对象的实际类型,根据其实际的类型调用其相应的方法(虽然传入的是一个父类的名称,但是引用所指向的是一个子类对象,所以在程序运行时会调用子类重写父类的方法而不是父类的方法)。
19、抽象类:
用abstract关键字来修饰一个类时,这个类叫抽象类;用abstract来修饰一个方法时,该方法叫抽象方法;
含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写;
抽象类不能被实例化,抽象方法只需声明而不需实现(在子类中重写实现)。(C++中纯虚函数)
20、接口interface:
接口是抽象方法和常量值定义的集合;从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义而没有变量和方法的实现(所以的方法都是抽象方法,并且都是public的,所有的成员变量都是public的static的以及final的);接口与接口之间可以相互继承,类和接口之间通过实现(implements)。
接口的本质,在内存中可以看到这个类的部分方法,也就是调用接口本身定义的抽象方法。