JavaSE-2进阶
主要也是面向对象的进阶
1. static
static是静态的意思,可以修饰成员变量和成员方法
1.1 static修饰成员变量
static修饰成员变量,表示该成员变量只在内存中存储一份,可以被共享访问、修改
静态成员变量,推荐直接用类名.静态成员变量
访问
1 2 3 4 5 6
| package com.curious.javasepro.d1_staticdemo;
public class User { public static int onlineNumber; }
|
1 2 3 4 5 6 7 8 9 10 11 12
| package com.curious.javasepro.d1_staticdemo;
public class StaticFieldDemo1 { public static void main(String[] args) { User.onlineNumber += 1; User.onlineNumber += 1; User.onlineNumber += 1;
User usr = new User(); System.out.println(usr.onlineNumber); } }
|
1.2 static修饰成员方法
这个和python的@staticmethod
很像,如果是static修饰的,就可以直接用类名来调用,而不用实例化对象再来访问
静态成员方法:有static修饰,归属于雷,可以被共享访问,用类名或者对象名都可以访问
1 2 3
| public static int getMax(int a, int b) { xxxx }
|
静态方法不能出现this关键字,因为没有对象
1.3 static应用知识:工具类
一次编写,处处可用,可以定义一个如Tools.java
的类
由于工具类无需创建对象,可以将工具类的构造器进行私有 专业!
1 2 3 4 5 6 7 8 9
| public class Tools { private Tools() { } public static void show() { xxxx; } }
|
1.4 static应用知识:代码块(静态代码块、实例代码块)
1.4.1 静态代码块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package com.curious.javasepro.d3_staticcode;
public class StaticDemo1 {
static { System.out.println("-----静态代码块被触发执行了-----"); }
public static void main(String[] args) { System.out.println("-----main方法执行-----"); } } -----静态代码块被触发执行了----- -----main方法执行-----
|
看到这里的话,还是不是很了解静态代码块的作用,真的开发真的会用到这种操作吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package com.curious.javasepro.d3_staticcode;
import java.util.ArrayList;
public class StaticDemo1 {
public static int onlineNumber; public static ArrayList<String> cards = new ArrayList<>();
static { System.out.println("-----静态代码块被触发执行了-----"); onlineNumber = 0; cards.add("AAA"); cards.add("BBB"); }
public static void main(String[] args) { System.out.println("-----main方法执行-----"); System.out.println(onlineNumber); } }
|
1.4.2 实例代码块
每次创建对象的时候,会用到
1.4.3 一个静态代码块的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| package com.curious.javasepro.d3_staticcode;
import java.util.ArrayList;
public class StaticTest3 {
public static ArrayList<String> cards = new ArrayList<>();
static { String[] sizes = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"}; String[] colors = {"♥", "♠", "♦", "♣"}; for (int i = 0; i < sizes.length; i++) { for (int j = 0; j < colors.length; j++) { String card = sizes[i] + colors[j]; cards.add(card); } } cards.add("小王"); cards.add("大王"); }
public static void main(String[] args) { System.out.println(cards); } }
|
工具类,有时候会用到一些字典什么的加载,可能比较慢,要用这种写法?
1.5 static应用知识:单例设计模式
设计模式是一个非常关键的部分,面试非常常问的内容
开发中经常遇到一些问题,一个问题通常有n个解法,其中有一种解法是相对比较优的,这个最优的解法被总结出来了,称为设计模式
单例模式
1.5.1 饿汉单例模式
实现:
SingleInstance.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| package com.curious.javasepro.d4_singleinstance;
public class SingleInstance {
public static SingleInstance instance = new SingleInstance();
private SingleInstance() {
}
}
|
Test.java
1 2 3 4 5 6 7 8 9 10
| package com.curious.javasepro.d4_singleinstance;
public class Test1 { public static void main(String[] args) { SingleInstance s1 = SingleInstance.instance; SingleInstance s2 = SingleInstance.instance; System.out.println(s1==s2); } }
|
1.5.2 懒汉单例模式
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| package com.curious.javasepro.d4_singleinstance;
public class SingleInstance2 {
private static SingleInstance2 instance;
private SingleInstance2() { }
public static SingleInstance2 getInstance() { if (instance == null) { instance = new SingleInstance2(); } return instance; } }
|
1 2 3 4 5 6 7 8 9 10 11
| package com.curious.javasepro.d4_singleinstance;
public class Test2 { public static void main(String[] args) { SingleInstance2 s1 = SingleInstance2.getInstance(); SingleInstance2 s2 = SingleInstance2.getInstance();
System.out.println(s1); System.out.println(s2); } }
|
1.5.3 单例模式在系统中是怎么使用的?以环保通系统为例
TODO
2. 继承
面向对象的重要特征:继承
2.1 继承概述
使用继承最好的是可以提高代码的复用性,比如人和老师都有一些基本的年龄名称这些的,但是学生是学习,老师是教课这样的hhh
子类可以用this,子类用父类的可以用super关键字
2.2 继承的设计规范
2.3 继承的特点
1)感觉第一点比较关键,子类和父类有各自的构造器,子类不能继承父类的构造器(说实话,感觉在自己的开发经验里,继承好像用的比较少,因为从开始的设计规范来说一般不会那么规范?)
2)子类可以简单说不能继承父类私有的(各有各的解释,但是从实现来说是不能继承,因为用不了,或者说不建议)
3)子类不是继承父类的静态成员,因为静态成员只有一份(一种共享的行为)
2.4 继承后:成员变量、成员方法访问特点
2.5 继承后:方法重写
注意这里是重写,以前是重载
1 2 3 4 5 6 7 8
| package com.curious.javasepro.d5_extends;
public class Test { public static void main(String[] args) { Student stu = new Student(); stu.run(); } }
|
父类
1 2 3 4 5 6 7
| package com.curious.javasepro.d5_extends;
public class People { public void run() { System.out.println("父类人会跑"); } }
|
子类
1 2 3 4 5 6 7 8
| package com.curious.javasepro.d5_extends;
public class Student extends People { public void run() { super.run(); System.out.println("子类人会跑"); } }
|
父类人会跑
子类人会跑
2.5.1 @Override重写注解
@Override是放在重写的方法上,作为重写是否正确的校验注解
1 2 3 4 5 6 7 8 9
| package com.curious.javasepro.d5_extends;
public class Student extends People { @Override public void run() { super.run(); System.out.println("子类人会跑"); } }
|
2.5.2 方法重写注意事项和要求
2.6 继承后:子类构造器的特点
2.7 this和super的总结
3. 语法
3.1 包
3.1.1 建包
3.1.2 导包
只要不是相同类下的,就要去导包用
3.2 权限修饰符
3.2.1 什么是权限修饰符
3.2.2 权限修饰符的分类和具体作用范围
3.2.3 权限修饰符使用规范
3.3 final
1 2 3 4
| final double z; public final void method(int aaa) { }
|
3.4 常量
1
| public static final String SCHOOL_NAME = "Curious";
|
一些配置文件做成常量
3.5 枚举(用的少)
3.5.1 枚举的特点
3.5.2 枚举的作用
做信息分类技术
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package com.curious.javasepro.d7_enum;
public class Test { public static void main(String[] args) { method(Season.SPRING); } public static void method(Season s) { switch (s) { case SPRING: System.out.println("春天"); break; case SUMMER: System.out.println("夏天"); break; case AUTUMN: System.out.println("求太难"); break; case WINTER: System.out.println("冬天"); break; } } }
|
1 2 3 4 5 6 7 8 9 10
| package com.curious.javasepro.d7_enum;
public enum Season { SPRING, SUMMER, AUTUMN, WINTER; }
|
3.6 抽象类
3.6.1 概述
1 2 3
| public abstract class Animal { public abstract void run(); }
|
抽象类一般是父类,让子类来继承
3.6.2 抽象类使用场景
3.6.3 抽象类的特征、注意事项小结
抽象类不能创建对象,并且继承了抽象类的必须重写抽象类的全部方法
3.6.4 设计模式(抽象类相关)——模板方法模式(重点)
建议模板,write那块,用final修饰
4. 接口
4.1 接口的定义与特点
1 2 3 4 5 6 7 8 9 10 11 12
| package com.curious.javasepro.d8_interface;
public interface InterfaceDemo { public static final String SCHOOL_NAME = "ABC大学";
public abstract void run(); public abstract void eat(); }
|
简化后
1 2 3 4 5 6 7 8 9 10 11 12
| package com.curious.javasepro.d8_interface;
public interface InterfaceDemo { String SCHOOL_NAME = "ABC大学";
void run(); void eat(); }
|
4.2 接口的基本使用,接口与类的关系:被类实现(可以多实现)
接口可以多实现,实现的时候必须完成上面所有的规定,也是用@Override进行修饰
多实现的例子
4.3 接口与接口的关系:多继承
4.4 JDK8接口新增方法、注意事项
项目Version2.0需要对Inter接口丰富,加入10个新的抽象方法,此时改了接口就要所有实现类实现这些方法
——牵一发而动全身
4.4.1 第一种:默认方法
4.4.2 第二种:静态方法
4.4.3 第三种:私有方法
5. 多态
5.1 多态的概述
Animal可以是个抽象类
5.2 多态的优势
5.3 多态下引用数据类型的类型转换
6. 内部类
6.1 静态内部类(简单,了解)
6.2 成员内部类(了解)
6.3 局部内部类(了解)
TODO
6.4 匿名内部类(重点)
1 2 3 4 5 6
| Animal a = new Animal() { @Override public void run() { xxxxxx; } }
|
Animal是个抽象类