JAVASE高级(一)
JAVASE高级(一)
1. 面向对象编程
1.1 面向对象基础
在班里有多个学生,每个学生可以看作一个对象,属性包括姓名、成绩等。
- 开发对象,调用对象对数据处理。
- 面向对象的好处:符合人类思维习惯,变成更简单、更直观。
- 对象的本质:一种特殊的数据结构。
- 对象怎么设计:class也是类,也被称为对象的设计图(模板)。
public class 类名{ |
- 多个变量指向一个对象,地址赋值(类似于浅拷贝)
Student s1 = new Student(); |
1.2 面向对象内容
-
this变量:this是一个变量,可以用在方法里,来拿到当前对象。
-
构造器:创建对象时,对象会调用构造器。如果不写构造器,java会创建一个无参构造器。一旦定义了有参构造器,系统不会自动生成无参构造器。
-
面向对象的三大特征:封装、继承和多态。
-
封装:就是用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些数据的方法设计到一个对象中去。公共:public,私有:private。
-
JavaBean实体类:特殊形式的类。
- 满足:类中成员变量要私有,要有对外提供的set、get方法。类中必须要有一个公共无参的构造器。
- 实体类的应用场景:实体类只负责数据存取,而数据的处理交给其他类来完成,以实现数据和数据处理业务分离。
2. Java API
包上用来分门别类地管理不同程序,有利于程序的管理和维护
2.1 String
String s1 ="absaaa"; |
String注意事项:
-
String的对象是不可变的,改变会指向新的地址。
-
只要是以双引号给出的字符串对象,存储在常量池中,而且内容只会存储一份。
-
new String创建字符串对象,每次new出来都是一个新对象,放在堆内存。
String s1 = "aaaa";
String s2 = "aaaa";
Syste.out.println(s1 == s2);//true
2.2 ArrayList
- 集合:集合是一种容器,用来装数据,类似于数组。
- 相对于数组,集合大小可变,开发中用的更多。
ArrayList list = new ArrayList(); |
3. 面向对象高级
3.1 static
-
定义:static叫静态,可以修饰成员变量、成员方法。
- 类变量对应实例变量,类变量只有一份,会被类的全部对象共享,实例变量也被称为对象的变量。
- 访问:类名.类变量、对象.实例变量。
-
类方法和实例方法:有无
- 访问:类名.类方法
- 注意事项:
- 类方法可以直接访问类的成员。不可以直接访问实例成员。
- 实例方法可以直接访问类成员,也可以直接访问实例成员。
- 实例方法可以出现this关键字,类方法不可以出现this关键字。
-
代码块,实现类的初始化,为类变量赋值
-
实例代码块:每次创建对象时,在构造器前执行。
-
单例设计模式: 确保一个类只有一个对象
- 私有类的构造器
- 定义一个类变量记住类的一个对象
3.2 继承
-
定义:java提供的关键字extends,可以与另一个类建立父子关系。
- 特点:继承父类的非私有成员。
- 创建:子类的对象由子类、父类共同完成。
-
权限修饰符:protected、缺省
- protected可以在子类中访问,子类对象不可以访问
- 缺省可以在同目录中访问。
-
方法重写:子类可以重写一个方法名称、参数列表一样的方法,覆盖父类的方法,即为方法重写。
- 函数上方加上@Override表示重写(更加安全)。
- 访问权限必须大于等于父类的权限。
- 返回值类型需要类型一致或者更小。
- 私有、静态方法不能被重写。
//就近原则 |
- 子类构造器的特点:
- 先构造父亲,再构造自己。利用可省略的super调用父类有参构造器。
3.3 多态
-
定义:多态是在继承\实现情况吓得一种现象,表现为:对象多态、行为多态。
-
前提:有继承、实现关系;存在父类引用子类对象;存在方法重写
-
对于方法:编译看左边,运行看右边,对于变量:编译看左边,运行看左边。
People p = new Teacher(); |
- 使用多态的好处:
- 多态形式下,右边对象是**“解耦合的”**,便于扩展和维护。
- 可以使用父类类型的变量作为形参,可以接收一切子类对象。
public void (People p){}; |
- 存在的问题:多态情况下不能调用子类的独有方法。→类型转换
- 强转前,可以使用instanceof判断
People p = new Teacher(); |
3.4 final关键字、常量
-
final关键字是最终的意思,可以修饰(类、方法、变量)。
- 修饰的该类被称为最终类,特点是不能被继承了
- 修饰的方法被称为最终方法,特点是不能被重写了
- 修饰变量:只能被修饰一次。(局部变量、成员变量)
-
常量:使用static final修饰的成员变量被称为常量,通常用于记录系统的配置信息。
3.5 抽象类
-
Java中有个关键字为abstract,可以修饰类、方法等。
-
抽象类的注意事项、特点:
- 抽象类中不一定有抽象方法,有抽象方法一定是抽象类。
- 抽象类最主要的特点:不能创建对象,仅作为一种特殊的父类让子类继承实现。
- 一个类继承了抽象类,必须重写抽象类的全部抽象方法,否则自己也是抽象类。
-
设计抽象类是为了更好地支持多态。
-
常见应用场景:模板方法设计模式。建议使用final修饰模板方法(防止使用子类重写)。
3.6 接口
- Java提供关键字Interface,用这个关键字可以定义一个特殊的结构:接口。
- 接口不能创建对象;接口是用来被类实现(implements)的,实现接口的类被称为实现类。
- 一个类可以实现对个借口哦,实现类实现多个接口,必须重写完全部接口的全部抽象方法,否则实现类需要定义为抽象类。
public class D implements B, C{ |
- 好处:
- 可以解决单类继承的问题。
- 面向接口编程,实现业务的灵活切换与拓展。
3.7 内部类
-
成员内部类、静态内部类
-
匿名内部类:程序员不需要为这个类声明名字。
-
匿名内部类本质上是一个子类,并会立即创建出一个子类对象。
-
作用:用于更加方便的创建一个子类对象。
-
通常作为一个参数传输给方法。
-
3.8 枚举
- 枚举类的第一行只能罗列一些名称,这些名称都是常量,并且每个常量记住的都是枚举类的一个对象。
- 枚举类的构造器都是私有的,对外不能创建对象。
- 不可以被继承。
3.9 泛型
- 定义类、接口方法时,同时声明了一个或多个类型变量如
、称为泛型类、反省接口 - ?通配符,在使用泛型时可以代表一切类型。
//上限继承,类型可以为Car或者Car的子类 |
- 注意事项:
- 泛型擦除:泛型是在编译阶段,一旦被编译为class文件,就不存在泛型
- 泛型不支持基本数据类型,只能支持对象类型。
3.10 常用api
- Object类
//以下方法可进行重写,实现进一步功能(如内容) |
//该方法是浅克隆(浅拷贝) |
- Objects类
public static boolean equals(Object s, Object b);//先做非空对象,然后比较两个对象 |
- 包装类
- 把基本类型包装为类
public static Integer valueOf(int i); |
- StringBuilder
- StringBuilder代表可变字符串对象,相当于一个容器,里面的字符串是可变的,可以用来操作字符串。
- StringBuilder比String更适合做字符串的修改操作,效率更高,代码更简洁。
//构造器 |
-
StringBuffer
- 与StringBuilder一模一样
- StringBuilder是线程不安全的,StringBuffer是线程安全的。
-
StringJoiner
- 用来操作字符串,可以看成一个容器,创建后的内容可变。
- 好处:不仅可以提高字符串的操作效率,在有些场景下用它操作字符串,代码更加简洁。
-
Math
- 提供对数据操作的静态方法。
public static double abs();//绝对值 |
- System
public static void exit(int status);//终止虚拟机,一般不要用 |
- Runtime
- 代表程序所在的运行时间,是一个单例类。
Runtime r = Runtime.getRuntime(); |
- BigDecimal
- 用于解决浮点型运算时,出现结果失真的问题。
public BigDecimal(String val);//构造器 |
- 日期和时间(传统)
- Date
- SimpleDateFormat
- Calendar
//Date |
- 日期和时间(jdk8之后)
- LocalDate、LocalTime、LocalDateTime
- ZoneId、ZoneDateTime
- Period、Duration
//LocalDate、LocalTime、LocalDateTime |
- Arrays
int []arr = {10,20,30,40,50}; |
//Arrays实现类对象的比较:重写Comparable接口,重写compareTo方法 |
- Lambda表达式
- Lambda表达式是JDK8开始新增的一种语法形式,用于简化匿名内部类的代码。
- lambda表达式并不是能简化全部匿名内部类的写法,只能简化函数式接口的匿名内部类
- 函数式接口:有且仅有一个抽象方法的接口。标记:@FunctionalInterface
interface Swimming{ |
- 方法引用
- 静态方法引用:标志(::)
- 特定类型的引用:如果在Lambda表达式中只是调用一个实例方法,并且参数列表中的第一个参数是作为方法的主调,后面的所有参数是作为该实例方法的入参时,可以使用特定类型的方法引用。
- 构造器引用:不常见
public class CompareByData{ |