Java学习笔记
JAVA-HOW2J教程笔记·
一、JAVA基础·
1.hello world与命令行运行·
1 | //code: |
2.面向对象·
1 | public class Hero{ |
3.变量·
基本类型·
graph LR a[基本类型]--> b[整型:byte short int long] a-->c[浮点型:float double] a-->d[布尔型:boolean--true,false] a-->e[字符型:char] a-->f[注:String不是基本类型,Immutable-创建不可修改]
变量命名·
变量命名只能使用字母 数字 $ _,首字母不能用数字
final·
一个变量被final修饰的时候,该变量只有一次赋值的机会
4.操作符·
使用Scanner类获取输入·
1 | import java.util.Scanner; |
5.数组·
基本知识·
1 | //create |
常见数组函数·
需要引入包 import java.util.Arrays;
数组函数 | 对应操作 |
---|---|
Arrays.copyOfRange(int[] original, int from, int to) | int[] b = Arrays.copyOfRange(a, 0, 3);复制数组 |
Arrays.toString(a) | 转换成"[1,2,3,4]"字符串形式 |
Arrays.sort(a) | 排序 |
Arrays.binarySearch(a, 62) | 二分查找 |
Arrays.equals(a, b) | 判断是否相同 |
Arrays.fill(a,5) | 使用同一个值,填充整个数组 |
6.类和对象·
引用·
对象不是基本类型——即是引用(即指针)
Hero h = new Hero();
h为引用,代表了右边创建的的Hero类型对象,即h指向右侧的这个对象
Hero h1 = h;
则h1和h指向同一个对象
h = new Hero()
h指向新的对象
继承·
extends关键字
1 | public class Weapon{ |
重载·
1 | //调用方法attack的时候,会根据传递的参数类型以及数量,自动调用对应的方法 |
构造方法·
类里不显示写构造函数时,为隐式构造,即Hero a=Hero()
这样的形式
写了就按照写的来,且可以重载
1 | public Hero(String heroname){ |
this·
在对象内部表示当前这个对象
在一个构造方法中,调用另一个构造方法,可以使用this()
1 | public void setName3(String name){ |
传参·
基本类型传参:函数块内不能改变原变量值,传入的参数为函数内局部变量
引用类型传参:函数块内能改变原变量值
包·
1 | package character; //声明包的名字 |
访问修饰符·
用于修饰类或类里面的函数
修饰符 | 对应含义 |
---|---|
private | 私有的 |
package/friendly/default | 不写修饰符,默认状态 |
protected | 受保护的 |
public | 公共的 |
类之间关系·
自身(访问)、同包子类(同包内的类继承)、不同包子类(不同包间的类继承)、同包类(同一个包内的访问)、其他类(不同包内的访问)
四种修饰符及对应的访问限制·
修饰符 | 自身-访问 | 同包子类-继承 | 不同包子类-继承 | 同包类-访问 | 其他类-访问 |
---|---|---|---|---|---|
private | √ | × | × | × | × |
package/friendly/default | √ | √ | × | √ | × |
protected | √ | √ | √ | √ | × |
public | √ | √ | √ | √ | √ |
能不露就不露出来,作用范围最小原则
- 属性用private封装
- 方法一般用public
- 会被子类继承的方法,用protected
- package用的不多
类属性(静态属性)·
static修饰时,为类属性(静态属性),与之相对的是对象属性(实例属性,非静态属性)
类属性所有对象都共享一个相同值
访问可以用**对象.类属性
和类.类属性
**两种等价方式进行访问。
类方法(静态方法)·
也用static
修饰,与类属性类似,也与对象方法(实例方法,非静态方法)相对。
方法里访问了对象属性,必须用对象方法
没有访问对象属性,可以用类方法
属性初始化·
对象属性-三种办法初始化·
-
声明该属性的时候初始化
-
构造方法中初始化
-
初始化块 如:
{ x=10 }
类属性-两种办法·
- 声明该属性的时候初始化
- 静态初始化块
1 | public static int item=8; //声明时 |
单例模式·
饿汉式·
- 只有一个,通过私有化其构造方法,使得外部无法通过new 得到新的实例。
- 提供了一个public static的getInstance方法,外部调用者通过该方法获取一个对象,而且每一次都是获取同一个对象。 从而达到单例的目的。
- 在getInstance方法外已经创建了一个实例
1 | package charactor; |
懒汉式·
- 在getInstance方法内创建了一个实例
1 | package charactor; |
两种方式选用·
饿汉式,是立即加载的方式,无论是否会用到这个对象,都会加载。如果在构造方法里写了性能消耗较大,占时较久的代码,比如建立与数据库的连接,那么就会在启动的时候感觉稍微有些卡顿。
懒汉式,是延迟加载的方式,只有使用的时候才会加载。 并且有线程安全的考量。使用懒汉式,在启动的时候,会感觉到比饿汉式略快,因为并没有做对象的实例化。 但是在第一次调用的时候,会进行实例化操作,感觉上就略慢。
看业务需求,如果业务上允许有比较充分的启动和初始化时间,就使用饿汉式,否则就使用懒汉式
单例模式三元素·
- 构造方法私有化
- 静态属性指向实例
- public static的 getInstance方法,返回第二步的静态属性
枚举类型·
1 | public enum Season { |
7.接口与继承·
接口·
1 | //接口定义 |
对象转型·
将等号右边的类型转换为等号左边的,本质上能不能转换主要是看右边的类型能不能当成左边的来用
子类转父类(向上转型)·
1 | Hero h = new Hero(); |
父类转子类(向下转型)·
需要强制转化
1 | ad = (ADHero) h; //强制转换 |
没有继承关系的两个类,互相转换会失败·
重写·
子类和父类定义名字一样的方法,调用时调用子类的,即重写
多态·
操作符的多态·
字符串相加表示拼接,数字相加表示加法
类的多态·
即不同的子类,对同一个父类方法的重写
隐藏·
子类调用父类的静态方法(类方法)
super·
使用super对象
调用父类的方法和属性
Object类·
声明一个类的时候,默认是继承了Object
toString()
返回当前对象的字符串表达
finalize()
一个对象没有任何引用指向时,满足回收条件,这个方法被JVM
自动调用
equals()
判断两个对象内容是否相同
==
判断两个引用,是否指向了同一个对象
hashCode()
返回一个对象的哈希值
Object还提供线程同步相关方法
wait()
notify()
notifyAll()
getClass()
返回一个对象的类对象
final·
用final修饰的类不能被继承
修饰方法则不能被重写
修饰变量,则只有一次赋值机会
修饰引用,引用只有1次指向对象的机会
常量:public static final int a = 6;
抽象类·
abstract修饰符来修饰
当一个类有抽象方法的时候,该类必须被声明为抽象类
抽象类可以没有抽象方法
子类必须提供不一样的attack方法实现
1 | public abstract class Hero { |
抽象类和接口的区别·
区别1:
- 子类只能继承一个抽象类,不能继承多个
- 子类可以实现多个接口
区别2:
-
抽象类可以定义
-
public,protected,package,private
-
静态和非静态属性
-
final和非final属性
-
-
但是接口中声明的属性,只能是
-
public
-
静态
-
final的
即便没有显式的声明(默认转换为
public static final
) -
注:抽象类和接口都可以有实体方法。 接口中的实体方法,叫做默认方法
内部类·
分为四种:
-
非静态内部类 可以直接在一个类里面定义,实例化必须建立在一个外部类对象的基础之上,即:new 外部类().new 内部类(),可以访问外部类的属性方法
-
静态内部类 可以直接实例化,不能访问外部类的实例属性方法,但是可以访问静态属性方法
-
匿名类 直接实例化一个抽象类,并“当场”实现其抽象方法。
-
本地类 有名字的匿名类
1 | package charactor; |
默认方法·
默认方法是JDK8新特性,指的是接口也可以提供具体方法了
default public void func(){}
1 | package charactor; |
UML图——类之间的关系·
UML-Unified Module Language 统一建模语言,可以很方便的用于描述类的属性,方法,以及类和类之间的关系