Java-类

封装

将属性做一个隐私性的保护, 不要向外公开
1.将所有的成员变量私有化,使用priva修饰
2.给外部提供的公共的 set/get 方法
当一个类完成了封装, 成员变量才能叫属性

继承

子类继承了父类所有可见的属性和方法,这些方法属性在使用前必须初始化,所以需先调用父类的构造器进行初始化,所以所有的子类构造器, 默认第一行都是super(); 要求父类一定要有无参构造器, 如果没有就报错

new 子类对象之前, 会先 new 父类对象
new 子类对象会调用子类对象的构造方法, 第一行默认super()
子类加载之前, 会先加载父类
⼦⽗类中出现了同名的成员变量时,在⼦类中需要访问⽗类中⾮私有成员变量时,需要使⽤ super 关键

⼦类⽅法重写⽗类⽅法,必须要保证权限⼤于等于⽗类权限。
⼦类⽅法重写⽗类⽅法,返回值类型、函数名和参数列表都要⼀模⼀样。

易错点 : 子类继承父类,不管子类new的时候有参还是无参,都会先调用父类的无参构造方法,但是如果有this或者super关键字的时候,会先去执行子类构造方法里的this和super关键字,而不会先调用父类的无参构造方法,因此也可能造成不会调用父类无参构造方法的情况。

类加载 的执行顺序:
静态的代码块 static {}
静态的成员变量 static int age = 1
静态的成员方法 加载到了内存中, 不执行

子类、父类各种方法的执行顺序:
父类的静态方法
子类的静态方法
执行父类的构造代码块
执行父类的构造方法
执行子类的构造代码块
执行子类的构造方法
执行子类的void方法

类什么时候会加载:
第一次使用类的时候
第一次被创建对象
调用静态方法
调用子类的静态方法
第一次创建子类对象
调用静态成员变量 / 子类的静态成员变量
主动加载 Class.forName(“类的名字 java.lang.String”)

多态

前提:1.继承或者实现(二选一)2.方法的重写

向上造型 : Animal a = new Dog(); a是Animal类型的引用, 本质上是一个Dog类型的对象,前面决定了a能调用哪些方法, 以及a的属性还是父类animal的属性。后面决定了最终使用的是哪个方法。 前面叫做编译时类型, 后面叫做运行时类型

当使⽤多态⽅式调⽤⽅法时,⾸先检查⽗类中是否有该⽅法,如果没有,则编译错误。也就是说,不能调⽤⼦类拥有,⽽⽗类没有的⽅法。所以,想要调⽤⼦类特有的⽅法,必须做向下转型。

ClassCastException: 类型转换异常
产生的原因, 在强制类型转换时, 类型错误, 例如:
Animal a = new Dog(); Cat c = (Cat) a;
避免这个错误: a instanceof Cat
a 是不是 Cat 类型的对象, 是 true, 不是 false

抽象类

定义:把没有⽅法主体的⽅法称为抽象⽅法,包含抽象⽅法的类就是抽象类
注意:
1.抽象类不能创建对象,只能创建其⾮抽象⼦类的对象
2.抽象类中,可以有构造⽅法,是供⼦类创建对象时,初始化⽗类成员使⽤的

理解:⼦类的构造⽅法中,有默认的super(),需要访问⽗类构造⽅法。

3.抽象类中,不⼀定包含抽象⽅法,但是有抽象⽅法的类必定是抽象类。
4.抽象类的⼦类,必须重写抽象⽗类中所有的抽象⽅法,除⾮该⼦类也是抽象类

内部类

定义:将⼀个类A定义在另⼀个类B⾥⾯,⾥⾯的那个类A就称为内部类,B则称为外部类
访问特点:

  • 内部类可以直接访问外部类的成员,包括私有成员。
  • 外部类要访问内部类的成员,必须要建⽴内部类的对象。

格式:外部类名.内部类名 对象名 = new 外部类型().new 内部类型()

匿名内部类:是⼀个 带具体实现的⽗类或者⽗接⼝的匿名的⼦类对象
匿名内部类必须继承⼀个⽗类或者实现⼀个⽗接⼝
格式:

new ⽗类名或者接⼝名() {
 // ⽅法重写
 @Override
 public void method() {
 // 执⾏语句
 }
}

Static关键字

属于类, 不属于对象
非静态成员, 属于对象[和对象绑定]

静态⽅法:静态的方法, 不需要对象就可以调用, 不能直接使用非静态成员变量。静态⽅法中,不能使⽤this关键字。

静态变量:静态的成员变量, 属于类, 所有对象共享的变量

static 修饰的内容:

  • 是随着类的加载⽽加载的,且只加载⼀次。
  • 存储于⼀块固定的内存区域(静态区),所以,可以直接被类名调⽤。
  • 它优先于对象存在,所以,可以被所有对象共享

静态代码块:定义在成员位置,使⽤static修饰的代码块{ }。 随着类的加载⽽执⾏且执⾏⼀次,优先于main⽅法和构造⽅法的执⾏

public class Game {
 public static int number;
 static {
 // 给类变量赋值
 number = 2;
 }
}

fina关键字

final:不可改变。可以⽤于修饰类、⽅法和变量。
修饰类:不能被继承。
修饰⽅法:不能被重写。
修饰变量:不能被重新赋值。在使用之前必须有初始值, 称为常量, 命名应该全部大写

final对象本身的引用(地址)不能改变, 里面的内容(值)是可以改变的

Scanner,String,Random

Scanner

Scanner sc = new Scanner(System.in);
String str =  sc.nextLine();  将此扫描仪推进到当前行并返回跳过的输入。 

String

Modifier and TypeMethod and Description
char[]toCharArray() :将此字符串转换为新的字符数组。
charcharAt(int index) : 返回 char指定索引处的值。
intindexOf(int ch) :返回指定字符第一次出现的字符串内的索引。
intindexOf(int ch, int fromIndex) :返回指定字符第一次出现的字符串内的索引,以指定的索引开始搜索。
intindexOf(String s) : 返回指定子字符串第一次出现的字符串内的索引。
intindexOf(String s, int fromIndex)
Stringsubstring(int beginIndex) :返回一个字符串,该字符串是此字符串的子字符串
Stringsubstring(int beginIndex, int endIndex)
StringindexOf(String s, int fromIndex) : 返回一个字符串,该字符串是此字符串的子字符串。
StringtoLowerCase() :将所有在此字符 String使用默认语言环境的规则,以小写。
StringtoUpperCase() :将所有在此字符 String使用默认语言环境的规则大写。
booleanequalsIgnoreCase(String anotherString) :将此 String与其他 String比较,忽略案例注意事项。
Stringtrim() :返回一个字符串,其值为此字符串,并删除任何前导和尾随空格。
booleanstartsWith(String prefix) :测试此字符串是否以指定的前缀开始。
booleanendsWith(String suffix) :测试此字符串是否以指定的后缀结束。

Random

Random r = new Random();
int i = r.nextInt(); 在括号里指定范围内随机生成一个整数

Object类

1.wait * 3 和线程有关, 是可以导致线程等待的

2.notify notifyAll 和线程有关, 是唤醒正在等待的线程的

3.finalize 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
Java自带垃圾回收机制 GC 周期性定时清理垃圾
如果短期内制造了大量的垃圾, 则需要手动清理 需要调用 System.gc()
Cat cat = new Cat();
cat = null;
在对象被当做垃圾清理之前, 会调用 finalize 方法
备注: JDK9 后失效

4.clone 克隆 复制 native
前提: 类要实现 Cloneable 接口, 重写 clone 方法
目的: 返回一个 内容相同, 但地址不同的新对象
x.clone() != x -> 深克隆
x.clone() == x -> 浅克隆

5.getClass 获得对象的类型, 字节码类型
xx.java -> 编译 -> xx.class -> 加载 -> JVM运行
一个类什么时候加载: 类被使用时
1.new 这个类的对象
2.使用这个类的 静态成员 (变量, 方法)
3.使用这个类的子类
加载几次: 只加载一次
加载的过程: 加载静态成员(先后顺序按代码顺序来)
1.如果是静态代码块, 直接执行
2.如果是静态变量, 要初始化
3.如果是静态方法, 只需要加载即可(不会调用)
类加载完成, 会在内存中形成一个对象, Class 类型的
因为类只加载一次, 所以这个类的Class对象 只有一个
对象.getClass() 是获得这个对象所属类 的 Class 对象

         注意: 获得这个类的字节码对象的途径, 不止一种; 但是最终获得的对象都是同一个

6.toString 返回值是String类型, 返回该对象的字符串表示
Object中默认的toString:
return getClass().getName() + “@” + Integer.toHexString(this.hashCode());
a_object.Cat@5cad8086
带包名的完整类名, 称之为全限定类名, 就是完整类名
当打印对象, 其实就是在调用对象的toString方法
默认的 toString 只能看到对象地址, 不能看到内容, 所以通常会在子类中修改这个toString方法(重写)
作用: 通常是为了在测试时, 打印对象内容

7.hashCode 默认返回的是对象在内存中的地址值 int 哈希码值
默认情况下, 每个对象的哈希码值都不相同

8.equals 指示其他某个对象是否与此对象 this “相等”
Object中默认的equals: (默认比较的是地址)
public boolean equals(Object obj) {
return (this == obj);
}
cat.equals(cat2)
实际需求中, 我们会认为两个对象内容(属性)完全相同时, 就是"同一个"对象(相等的对象)
equals作用: 就是如何比较两个对象是否"相等"

Date

Date(): 以当前系统时间, 创建一个时间对象 UTC
Date(long): 以表示从基准时间(即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数

API: 1. long getTime(): 获得时间对象对应的毫秒值
     2. void setTime(long): 使用指定毫秒值来设置时间
     3. boolean after(Date date): 问是否在指定日期之后
     4. boolean before(Date date): 问是否在指定日期之前
public static void main(String[] args) throws ParseException {
        Date date = new Date();
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String str = df.format(date);//2022-07-19 19:47:29
        Date dat = df.parse(str);//Tue Jul 19 19:48:36 CST 2022
        
        String format(Date):Date时间以字符串形式表示
        Date parse(String):  将字符串的时间转换成时间Date对象
    }

Calendar

静态方法 Calendar getInstance() 获得实例
int get(int) 获得时间分量
void set(int 字段, int 跳转的值) 设置时间分量: 等同于时间的跳转
void add(int 字段, int 修改的值 + - ) 修改时间分量: 等同于计算,推算
Date getTime() 返回一个 Date表示此物体 Calendar的时间值

包装类

包装类: 将基本数据类型做了包装, 从而让基本数据类型也变成对象
装箱:从基本类型转换为对应的包装类对象。
拆箱:从包装类对象转换为对应的基本类型。
Integer的特殊性:
1.提供了工具方法, 可以将数字转换成2进制/16进制字符串
2.当范围在 -128~127 内的时候, Integer对象是存储在 Integer的常量池中的
超过这个范围, 就是 new 了一个新的对象

基本类型转换为String:
int parseInt(String s) :将字符串参数转换为对应的int基本类型。

接口

意义在于被实现 implements, 本质上就是功能的拓展…

⾮抽象⼦类实现接⼝:
1.必须重写接⼝中所有抽象⽅法。
2.继承了接⼝的默认⽅法,即可以直接调⽤,也可以重写

传统接口中: JDK 7 及之前版本
1.所有的方法, 默认都是 public abstract
2.所有的变量, 默认都是 public static final
3.只能有抽象方法

JDK8, JDK9:
// 默认方法(JDK8), 有具体实现, 可以不在实现类中重写
public default void m5() { m7(); }
// 静态方法(JDK8), 有具体实现, 不能被重写
public static void m6() { }
// 私有方法(JDK9), 给接口内部其他方法使用的
private void m7() { }

权限

https://img-blog.csdnimg.cn/e6e6f15d12ff4133bbbd24be4a644b5c.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值