1、一个程序有且仅有一个main方法启动,main方法是作为java程序启动的唯一入口。
public static void main(String[] args) {
Student student = new Student(11,"111");
System.out.println(student);
}
权限修饰符:
public:修饰一个类是公开的 public修饰的类一定和文件名一致,一个类中有且仅有一个 public类
protect
private:修饰类 私有类
default:默认不写
修饰类 | 修饰方法 | 修饰域 | ||
---|---|---|---|---|
public | 公开类 | 都可以访问 | 都可以访问 | |
private | 私有类 | 该方法只能在本类中被访问不能被其他类访问 | 该方法只能在本类中被访问不能被其他类访问 | |
protect | 子类可以继承可以访问 同包下的类也可以访问 | 子类可以继承可以访问 同包下的类也可以访问 | ||
default | 只有同包的可以访问 当前类可以访问 | 只有同包的可以访问 |
作用域 当前类 同包 子类 其他
public √ √ √ √
protected √ √ √ ×
default √ √ × ×
private √ × × ×
类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。
2、static关键字
1、修饰类 静态类:静态内部类
2、修饰静态域:类的所有对象共享这个域
3、修饰方法 静态方法:不用创建对象直接 通过方法名加传参就可以调用 只能访问静态属性,不能访问非静态属性和对象
static修饰变量:static修饰的变量属于类变量,该变量被该类所产生的所有对象共享
static修饰的是方法,this修饰的是类
static修饰的方法属于类方法:
(1)this关键字不能在static方法中使用。
(2)静态方法不能使用非静态方法
(3)非静态方法能使用静态方法。
(4)静态方法可以调用静态方法
static代码块:static修饰的代码块在main方法之前执行,以便于优化程序,优化main方法
3、final
final修饰的变量:
final修饰的变量叫做常量,只能被赋值一次,值不能变化
基本数据类型:其数值一旦在初始化之后便不能更改
引用数据类型:在对其初始化之后便不能再让其指向另一个对象,但指向该对象的内容可以改变
final固定的是一个地址
final修饰全局变量:必须赋值,否则变量出栈时需要修改方法区中的值,这样不符合final得到特性
final修饰局部变量(存在方法区中):final修饰的局部变量可以不赋初始值,但是要想使用这个局部变量,就必须赋值
final修饰的方法:不能被重写,如果你有两个方法,该方法必须被子类重写,那么一定不能定义成final类型
final修饰的类:不能被继承
final的作用:防止变量被二次赋值防止方法重写,防止类被继承,防止指令重排序
4、基本数据类型:
整型:byte(-128~127 8位 1个字节)short int long
浮点型:float double 字符:char boolean
public static void main(String[] args) {
byte c = 10;
c = c+1;//会报错 需要强制类型转换
c+=1;//不会报错
System.out.println(c);
}
自动拆装箱:是一个编译器行为 是java编译器做的一个语法糖行为
装箱 valueOf
拆箱:对象.intvalue 对象.longValue()
Integer a = 1;
int c = a.intValue();
int intValue = 42;
Integer integerValue = Integer.valueOf(intValue); // 将int转换为Integer对象
128陷阱 博客:
5、String类
string不可变 :我们对字符串做出的操作都会产生不同的字符串
string类型没有提供任何修改字符串的方法(防止他的值可以变)
final修饰string类 不能被继承 也就是没法通过重写父类方法的方式 修改值
final修饰了char类型数组(数组也是private修饰的) 保证一旦被赋值之后指向不可变 但是他的值可以变
好处:可以共享数据
提高处理字符串拼接的效率 :stringbuffer线程安全(对类中大部分方法都加了synchronized 锁) stringbuilder单线程下效率高
每一个数组都是java中的一个新创建的类型 比如int[] 数组 他的类型时 int数组类型
冒泡、快排、堆排序、要熟练掌握 Arrays.sort应用
6、抽象类和接口的区别
语义上:
继承抽象类是为了代码复用(提供一种模版)(描述事务本身的(特质)特点和属性)
实现接口更多是为了定义一个规范或者行为准则(接口更多是描述某种行为和能力比如我定义一个飞的接口,那么所有实现这个接口的类都具有飞的能力)
现实使用上区别不大。
java中是单继承多实现的
抽象类可以有普通方法、构造函数 普通域。
接口这些都没有。
7、面向对象编程的特点
封装、继承、多态
如何体现?
封装:把现实世界中的客观事物抽象成一个java类,然后在类中存放属性和方法,比如抽象一个汽车类其中有发动机、车轮等属性,又有启动、前进等方法。
多态:子类继承父类
子类重写父类方法
父类引用指向子类对象
8、程序执行第一步只是给静态变量和静态块赋初始值(0,null等)不会直接将对应的值给他
第二轮才是给对应的值 这个时候如果给静态的对象实例化 从上往下执行(先不管其他对象的实例化)非静态的初始语句初始化块执行
9、类加载的先后顺序
10、Object类所有类的基类
没重写调用的就是Object里面的equals就是==
equals和==区别
基本类型 == 比较值
引用类型 equals比较两个对象的值是否相同
重写equals就要重写hashCode
因为我们重写equals就是为了实现只要两个对象的值相同那么 返回就是true 比如在hashmap里面
如果我们重写了equals方法让他实现值相同就返回true,理论上euqals返回true说明值相同那么他们的hashCode值应该相同,如果不重写它是根据对象的地址生成的hashCode他的值不同,所以我们要重写hashcode保证他时根据对象内容生成的hashcode
基本方法:getClass 、toString、clone、notifyALL 、notify、equals hasCode
11、内部类:
局部内部类、
普通内部类
静态内部类
匿名内部类:匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
public class Test2 {
public static void main(String[] args) {
Thread a = new Thread(new Test3());
a.start();
Thread b = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("122223");
}
});
b.start();
}
}
class Test3 implements Runnable{
@Override
public void run() {
System.out.println("123");
}
}
new Runnable(){}; 代替了Test3实现Runnable接口的步骤,不用写实现类的类名,直接在小括号后面加大括号里面写实现相应的方法
lamndan表达式:
public class Test2 {
public static void main(String[] args) {
Thread c = new Thread(()-> System.out.println("123457"),"c");
c.start();
}
}
//,后面的"c" 是起了一个名字有没有都可以