- 自动生成文档,以/*开始,以/结束
- 8种基本类型=4种整型+两种浮点类型+1种用于表示Unicode编码的字符单元的字符类型char+boolean
- Person person; 只是声明了一个变量,这个变量将指向一个Person的对象
- Person person=new Person();才是实例化了一个类,并且将这个引用指向这个实例化的对象
- 为A对象创建了一个实例。但在内存中开辟了两块空间。
一块空间在堆区,存放new A()这个对象。
另一块空间在堆栈,也就是栈,存放 a,a的值为new A()这个对象的内存地址。因为java在JVM(java虚拟机)中运行,所以a描述的内存地址不一定是这个对象真实内存的地址。 - final指示常量
- java.lang.* 是什么 java.util.*
- int转float为什么会丢失精度,long转double也是
- 枚举enum Size{S,M,L,X}; Size s=Size.S;
- String类对象是不可变字符串,但是可以修改变量的引用地址,针对不可变字符串,编译器采用了让字符串共享的方案;
- String类对象要用equals()方法来检测字符串是否相等,用==号的话只能比较两个字符串是否在同一个位置,但是假如他们在不同位置但是字符又是相等的就有问题,+或者substring产生的结果不是共享的
- 读取输入Scanner in=new Scanner(System.in);
- String name=in.nextLine();//可以读取整行,以换行符为分隔符
- String firstName=in.next();//以空格为分隔符
- int age=in.nextInt();//其他数据类型类似
- 读取文件: Scanner in=new Scanner(Path.get(“myfile.txt”),“UTF-8”);
- 如果文件名包含反斜杠符号,那么就要反义一次"c:\mymydirectory\myfile.txt"
- 写入文件: PrintWriter out=new PrintWriter(“myfile.txt”,“UTF-8”);//如果文件不存在,则创建
- switch的case标签可以是char、byte、short、int、枚举常量、字符串字面量
- 创建数字数组元素初始化为0,对象数组元素则初始化为null,表示元素还未存放任何对象
- 数组大小不可变,array list大小可变
- 遍历foreach:
int[]num={1,2,3,4};
for(int each:nums){
System.out.println(each);
}
- 数组排序Arrays.sort(a);
- 数组复制int[] nums=Array.copyOf(a,length);
- 创建不规则数组:int[][] odds=new int[n][];
- 类关系:依赖(uses-a)、聚合(has-a)、继承(is-a)
- 一个对象变量并没有实际包含一个对象,而仅仅引用一个对象
- Java中,必须使用clone方法获得对象的完整拷贝
- Java所有的对象是在堆中构造的
- 这里的堆跟数据结构里面的堆区别在哪里
- 在java的类中,可以return一些int等基本类型的数据,但是不要返回一个对象或者数组,因为这个时候返回的是对象的引用,那么在外部就有可能对这个对象产生破坏。如果真的要返回一个可变对象的引用,应该首先对它进行克隆(clone)
- final域必须在构建的时候就初始化,后面不能再改动,即不会有set方法
- private final StringBuilder evaluations;表示evaluation变量中的对象引用不会再指示其他StringBuilder对象,但是这个对象可以被修改
- 静态方法不能够修改自己的的变量,也可以认为静态方法是没有this参数的方法,使用类名来调用静态方法而不需要初始化这个类
- 两种情况下使用静态方法:
一个方法不需要访问对象状态,其所需参数都是通过显式参数提供(例如:Math.pow(x,a))
一个方法只需要访问类的静态域
- 工厂模式(重)
- Java不对局部变量进行初始化,但是会对对象的实例域进行初始化
- 在Java中,所有的继承都是公有继承,跟C++不一样
- this有两种用法
一是引用隐式参数
二是调用该类其他的构造器this(1);
并且这个函数调用要放在本构造函数的第一行
- super也有两种用法:
一是调用超类的方法
super.getName();
二是调用超类的构造器super("Alice");
- 一个对象变量可以指示多种实际类型的现象被称为多态,在运行时能够自动地选择调用哪个方法地现象被称为动态绑定
- 在java程序设计语言中,对象变量是多态的,一个Employee变量既可以引用一个Employee类对象,也可以引用一个Employee类对象。
Manager manager=new Manager();
Employee[] staff;
//多态
staff[0]=new Employee();
staff[1]=manager;
//动态绑定
staff[0].setSalary();//仅打印基本工资
staff[1].getSalary();//打印奖金+基本工资
//但是不能用一个父类引用变量去调用子类中特有的方法
boss.setBonus(1000); //合法
staff[1].setBonus(1000); //非法,Error
- 在Java中,package与import语句类似于C++中的namespace和using指令
- Java中import不等于#include,因为C++编译器无法查看任何文件的内部,除了正在编译的文件以及在头文件中明确包含的文件。Java编译器可以查看其他文件的内部,只要告诉它到哪里去查看就可以了,所以可以
import java.lang.*
- Integer、Long、Float、Double、Short、Byte、Character、Boolean等对象包装类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。同时对象包装类还是final,因此不能够定义它们的子类。
list.add(3);
在这里等同于list.add(Integer.valueOf(3));
,这种变换被称为自动装箱(autoboxing),当然也会有自动拆箱- 拆箱和装箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时,插入必要的装箱拆箱方法调用,虚拟机只是执行这些字节码。
- 函数的传递参数可变,有点神奇的东西
public class PrintStream{
public PrintStream printf(String fmt,Object... args){
return format(fmt,args);
}
}
在这里面Object…是等同于Object[]的
当然其他的类型也可以,比如int... nums