Java特点:继承、抽象、封装、多态
Java基本数据类型:
byte,short,int,long,float,double,char,boolean共8种byte
有效位1字节,short有效位2字节,int有效位4字节,long有效位8字节,float有效
位4字节,double有效位8字节,char有效位2字节,boolean有效位1字节
Java标示符组成:
类名,接口名,枚举名采用驼峰命名,每个单词首字母大写
StudentAge
变量名和方法名采用匈牙利命名,从第二个单词首字母大写studentAge
常量名全部大写,单词组合使用下划线连接
包名和工程名全部小写
一种是自动转换:从小的数据类型到大的数据类型,从子类到父类。
一种是强制转换:从大的数据类型到小的数据类型,从父类到子类。
注意:
byte+byte=int short+short =int byte+short=int char+char =int
instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的
类的实例,返回 boolean 的数据类型。
严格来说,instanceof 是 Java 的一个二元操作符(双目运算符),类似于 ==,>,
< 等操作符。用来测试一个对象是否是为一个类的实例,
用法为:boolean result = obj instanceof class
其中 obj 为一个对象,Class 表示一个类或者一个接口。
当 obj 为 Class 的对象,或者是其直接或间接子类,或者是其接口的实现类,结
果result 都返回 true,否则返回false。
注意:编译器会检查 obj 是否能转换成右边的class类型,如果不能转换则直接报
错,如果不能确定类型,则通过编译,具体看运行时定。
Java多态的实现具有三种充要条件
· 继承
· 重写父类方法
· 父类引用指向子类对象
向上转型:通过子类对象(小范围)转化为父类对象(大范围),这种转换是自
动完成的,不用强制。
向下转型:通过父类对象(大范围)实例化子类对象(小范围),这种转换不是
自动完成的,需要强制指定。
继承:
子类继承了父类,就继承了父类的方法和属性,子类不能继承父类中私有的(private)的成员变量方法
方法重载:在同一个类中方法只能被重载,不能被重写
方法重写:只存在子类与父类中(包括直接父类和间接父类)
组合:
组合创建整体类实例时,必须创建其所有局部类的实例,而对于继承,创建子类实例时,无须创建父类的实例
接口与抽象类:
·接口不能被实例化,所以接口中不能有任何构造方法,你定义构造方法编译会出
错
·接口的实现比如实现接口的全部方法,否则必须定义为抽象类
在抽象类中,具有如下特征:
·如果一个类中有抽象方法,那么这个类一定是抽象类,也就是说,使用关键字
abstract 修饰的 方法一定是抽象方法,具有抽象方法的类一定是抽象类。实现类方法中只有方法具体的实现
·抽象类中不一定只有抽象方法,抽象类中也可以有具体的方法,你可以自己去选
择是否实现这些方 法。
·抽象类中的约束不像接口那么严格,你可以在抽象类中定义构造方法、抽象方法
、普通属性、方 法、静态属性和静态方法
·抽象类和接口一样不能被实例化,实例化只能实例化具体的类
区别:
- 抽象类和接口都不能直接实例化。如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2、抽象类要被子类继承,接口要被类实现。
3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现。
4、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
区别与联系
1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的),所有的成员方法都是abstract的。
3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是“is-a”关系,interface表示的是“has-a”关系。
4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值,抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
6.接口中的方法默认都是 public,abstract 类型的。
结论:
abstract class 和 interface 是 Java语言中的两种定义抽象类的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概 念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能)。这其实也是语言的一种的惯用法,希望同学们能够细细体会。
static关键字:
·在Java类中声明变量、方法和内部类时,可使用关键字static做为修饰符。
·static标记的变量或方法由整个类(所有实例)共享,如访问控制权限允许,可不
必创建该类对象而直接用类名加‘.’调用。
·static成员也称类成员或静态成员,如:类变量、类方法、静态方法等。如果想让一个类的所有实例共享数据,请用类变量(static关键字)
static与abstract不能连用:
因为static修饰的方法是静态方法,其可以直接被类所调用。而abstract
修饰的方法为抽象方法,即无方法体的方法,不能够被直接调用需要在子类或实现
类中去编写完整的方法处理逻辑后才能使用。
静态方法中调用非静态成员不成立
这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使
用,而静态方法在使用前不用创建任何对象
栈内存:使用完会释放内存资源
堆内存:堆内存中分配的内存需要程序员手动释放
堆内存和栈内存的区别如下:
1、定义不同:堆内存是区别于栈区、全局数据区和代码区的另一个内存区域。堆允
许程序在运行时动态地申请某个大小的内存空间。栈内存在函数中定义的一些基本
类型的变量和对象的引用变量都在函数的栈内存中分配
2、特点不同:堆内存实际上指的就是优先队列的一种数据结构,第一个元素有最高
的优先权;栈内存实际上就是满足先进后出的性质的数学或数据结构。栈内存是存
取速度比堆要快,仅次于寄存器,栈数据可以共享。
3、范围不同:堆内存中分配的内存需要程序员手动释放,如果不释放,而系统内存
管理器又不自动回收这些堆内存的话动态分配堆内存,那就一直被占用。栈内存中
为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所
分配的内存空间,该内存空间可以立即被另作他用。
克隆:
1.浅克隆:只复制基本类型的数据,引用类型的数据只复制了引用的地址,引用的对象并没有复制,在新的对象中修改引用类型的数据会影响原对象中的引用。
2.深克隆:是在引用类型的类中也实现了clone,是clone的嵌套,复制后的对象与原对象之间完全不会影响。
3.使用序列化也能完成深复制的功能:对象序列化后写入流中,此时也就不存在引用什么的概念了,再从流中读取,生成新的对象,新对象和原对象之间也是完全互不影响的。
4.使用clone实现的深克隆其实是浅克隆中嵌套了浅克隆,与toString方法类似
//实现Cloneable接口,重写Clone()方法,如果是深克隆,引用类型的实例类也要实现Cloneable接口,并重写Clone()方法
public class Teacher implements Cloneable
private Student student;//Teacher类引用类型
@Override
protected Teacher clone(){
Teacher teacher = null;
try{
teacher = (Teacher)super.clone();
//手动赋值实现深克隆
//teacher.setStudent(this.getStudent().clone());
teacher.student=(Student)student.clone();
//return teacher;
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return teacher;
}
Comparable自然排序:
·实现Comparable<T>接口:public class Book implements Comparable<Book>
重写compareTo()方法实现自然排序(this在前:降序 this在后:升序)
@Override
// public int compareTo(Book o) {
// int num =(int) (this.price-o.price);
// int num2 = num==0?this.name.compareTo(o.name):num;
// return num2;
// }
TreeSet<Book> ts = new TreeSet<Book>(new Comparator<Book>() {
@Override
public int compare(Book b1, Book b2) {
int num = (int) (b1.getPrice() - b2.getPrice());
int num2 = num == 0 ? b1.getName().compareTo(b2.getName()) : num;
return num2;
}
});
反射:
Java 反射机制是在程序的运行过程中,对于任何一个类,都能够知道它的所有属性和方法;对于任意 一个对 象,都能够知道调用它的任意属性和方法,这种动态获取信息以及动态调用对象方法的功能称为 java 语言的反射机制。
Java 反射机制主要提供了以下这几个功能 :
-在运行时判断任意一个对象所属的类
-在运行时构造任意一个类的对象
・ 在运行时判断任意一个类所有的成员变量和方法
-在运行时调用任意一个对象的方法