之前没学过Java,因工作需要开始学习Java| react| vue 全栈开发,fighting!!
学习资料「Java开发实战经典」、「Java编程思想」、「React学习手册」。
小白也想变的很厉害!!
记录一下Java注意事项和学习盲点:
- 修饰符:修饰符,可选,告诉编译器如何调用该方法。定义了该方法的访问类型。
- 返回值类型 :方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void。
- 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
- 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
- 方法体:方法体包含具体的语句,定义该方法的功能。
Java面向对象的三个特性:
(1)封装性 类的属性封装。e.g. private;(2)继承性;(3)多态性。多态包括方法重载和对象多态。
- 方法重载:方法名称相同,只是参数类型、个数不同。e.g. 最常用的重载方法 System.out.println(),因为这个方法可以打印任意类型的数据。
- 对象多态:子类对象可以和父类对象相互转换,根据使用子类的对象不同,完成的功能也不同。
定义Java类时,单词的首字母必须大写。对象使用前必须实例化
构造方法:(1)其名称必须与类名一致。(2)其声明处不能有任何返回值类型的声明。(3)不能在构造方法中使用return返回一个值。
String
String中使用“==”是用来进行地址值比较的,而不是直接比较字符串内容是否相等,如果要比较字符串内容/地址是否相等,需要使用eauals()方法。
String实例化的方式:
(1)直接赋值:只要是以后声明的字符串内容相同,则都不会再开辟新的内存空间【内容重复时,会将对象指向已经存在的地址】
(2)使用标准的new调用方法:无论如何 都会开辟一个新空间。
字符串的内容不可改变,改的实际是堆内存地址的指向。
this关键字 作用:(1)表示类的属性(2)使用this调用本类的构造方法(3)表示当前对象。
代码块:静态代码块优先于主方法执行,而在类中定义的静态代码块会优先于构造块执行,而且不管有多少个对象产生,静态代码块只执行一次。
继承: e.g. extends
只允许单继承(多层继承),不能使用多重继承。意思就是,只能有一个爸爸,但是爸爸还能有爸爸,即爷爷(多层继承)。不可以有多个同级别爸爸(多重继承)。
子类不能直接访问父类中的私有属性,可通过setter或者getter方法调用访问;子类可以调用父类中的非私有方法,但是不能直接调用父类中的私有成员。
子类对象在实例化前会先默认调用父类中的构造方法,在实例化子类对象前需要先将父类中的属性进行初始化,实际上在子类的构造方法中隐含了一个super()的语法。
子类的方法覆写,权限不能更高,权限关系 private < default < public.
方法的重载overloading和覆写/重写overriding是很像的
重载:方法名相同,参数类型/个数不同,权限没要求,在一个类里。
覆写/重写:方法名相同;参数类型/返回值可以不相同,但必须是父类返回值的派生类;被覆写的方法不能有更严格的权限,发生在继承类中。
重载原则补充:
- 被重载的方法可以改变返回类型;
- 被重载的方法可以改变访问修饰符;
- 被重载的方法可以声明新的或更广的检查异常;
- 方法能够在同一个类中或者在一个子类中被重载。
- 无法以返回值类型作为重载函数的区分标准。
覆写/重写原则补充:
-
访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
-
父类的成员方法只能被它的子类重写。
-
声明为 final 的方法不能被重写。
-
声明为 static 的方法不能被重写,但是能够被再次声明。
-
子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。
-
子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
-
重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
-
构造方法不能被重写。
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
- (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
- (2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
- (3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
this和super也是很像的 区别在于this先访问本类中的方法,如果没有,从父类中查找。super是直接访问父类中的属性/方法
final(1)final声明的类不能有子类(2)final声明的方法不能被子类所覆写(3)final声明的变量即成为常量,常量不能修改。使用final声明变量时,要求全部的字母大写。
abstract 抽象类 抽象方法不要使用private声明。原因是abstract抽象方法必须被子类覆写,而使用private声明的话,是无法子类覆写的。
interface 接口
interface 接口名称{
全局常量;
抽象方法;
}
接口中的抽象方法必须是public访问权限,可省略写。
子类通过implements关键字实现接口,e.g. class 子类 implements 接口A,接口B... { }
子类可既要实现接口又要继承抽象类,e.g. class 子类 extends 抽象类 implements 接口A,接口B... { }
一个抽象类中可以定义多个接口或者抽象类,在一个接口中也可以定义多个抽象类或者接口。在抽象类中可以定义多个内部抽象类,在接口中可以定义多个内部接口。
在类的设计中,一定要明确一个原则,一个类不要去继承一个已经实现好的类,只能继承抽象类或实现接口,如果接口和抽象类都可以使用,那么优先使用接口,避免单继承局限。
对象转型:
对象向上转型:父类 父类对象 = 子类实例; e.g. Object obj = a;
对象向下转型:子类 子类对象 = (子类)父类实例 e.g. A x = (A)obj; A是接口
在进行对象的向下转型前,必须首先发生对象向上转型
多态性
多态的优点
1. 消除类型之间的耦合关系;2. 可替换性;3. 可扩充性;4. 接口性;5. 灵活性;6. 简化性
多态存在的三个必要条件:继承;重写;父类引用指向子类对象
多态方式一:重写;方式二:接口;方式三:抽象类和抽象方法
instanceof: 关键字判断对象是哪个类的实例
在进行字符串判断时常把字符串常量写在前面是因为这样可以避免空指向异常。
设计模式:
(1)工厂设计:接口对象的实例是通过工厂取得的,这样以后如果再有子类扩充,直接修改工厂类客户端就可以根据标记得到相应的实例,灵活性比较高。
(2)代理设计:【类似 网络的代理】 e.g. 三角关系 用户上网
代理----------------->真实
(3)适配器设计:【中间过度 a-->b-->c】图形界面编程的事件处理中经常使用此设计模式
Object类:
在Java中所有类都有个一个公共的父类object,一个类只要没有明显的继承,那么肯定是object类的子类。
最好覆写object类中的equals()、hashCode()、toString()
包装类 e.g. Integer、Character、Short、Long、Float、Double、Boolean、Byte
装箱与拆箱 装箱将一个基本数据类型变成包装类,而将一个包装类变成基本数据类型的过程为拆箱
异常的捕获及处理 标准是 try-catch-final,实际上可以不写catch语法,可以直接使用System.out.println(异常对象);或者e.printStackTrace();
try{
// 有可能出现异常的语句
}catch(异常类 异常对象){
//编写异常的处理语句
}catch(异常类 异常对象){
//编写异常的处理语句
}
finally{
//一定会运行到的code
}
throws关键字 使用该声明的方法表示此方法不处理异常,而交给方法的调用处进行处理
不要在主方法中使用throws。虽然在主方法处使用throws关键字,在程序主方法中就可以不再使用try...catch语句进行异常的捕获及处理。但是程序出现问题后肯定交给JVM进行处理,将导致程序中断。
throw 人为抛出异常,抛出时直接抛出异常类的实例化对象即可。throw不会单独使用。
assert 断言 Java设计时考虑系统应用 为了避免某些用户使用assert作为关键字,所以正常运行时断言不会起任何作用,如果要起作用,Java运行时应加参数 -ea (全称:enableassertions) e.g. javac Test.java java -ea Test
包 package 多人协作
运行时 e.g. javaac -d classname.java //-d表示生成目录
java packagename.classname //执行类时输入完整的“包.类名称”
import 包的导入
import 包名称.子包名称.类名称; //手工导入需要的类
import 包名称.子包名称.*; //由JVM自动加载所需要的类
如果一个类要被外包访问,则此类一定要定义成public class。如果在一个程序中同时导入了两个包的同名类,在使用时就必须明确地写出完整的“包.类名称”
如果一个类的所有方法都是使用static声明,则导入时就可以直接使用import static的方式导入。
Java命名规范:
类:所有单词的首字母大写 e.g. TestJava
方法:第一个单词首字母小写,之后每个单词首字母大写 e.g. getInfo()
属性:第一个单词首字母小写,之后每个单词首字母大写 e.g. studentName
包:所有单词的字母小写 e.g. org.xx.demo
常量:所有单词的字母大写 e.g. FLAG