Java进阶 - 黑马

简介: Java进阶 - 黑马

1. static

1.1. static修饰的变量

在一个类中用static修饰的变量,属于类变量,在内存中只有一份,会被类的全部对象共享,所以可以用类名直接调用,即类名.类变量


用static修饰的变量,属于类变量,会被类的全部对象共享,所以无论怎么修改,调用后都是最后一次修改后的值

1.2. static修饰的方法

工具类

类方法可以直接使用类.方法调用,可以节省内存,而实例调用方法,需要先创建一个对象,而每创建一个对象会消耗内存。

工具类的构造器应该做私有化处理,(在一个类中默认有一个空参构造器)

用static修饰的变量或者方法都是类的,下面为其注意事项。

1.3. 代码块

被static修饰的代码块,是类代码块,在加载类时,就会执行一次,未被修饰的是实例代码块(也可以叫做对象代码块)创建一个对象时,就会被执行一次,用来完成对象的初始化,在构造器前执行。

1.4. 单例设计模式

Java已有单例模式,可参考Runtime

1.4.1. 饿汉式单例模式

懒汉式与饿汉式的区别

懒汉式与饿汉式的区别_懒汉式和饿汉式的区别-CSDN博客

1.4.2. 懒汉式单例模式

2. 继承

Java中的继承是单继承,不支持多继承,但是可以多层继承。

2.1. Object类

Object类是所有类都会继承的类

2.2. 方法重写

2.3. 子类构造器

子类构造器默认都会继承父类的无参构造器,所以父类必须存在一个无参构造器,如果没有,则会报错。

但是如果父类存在一个有参构造器,可以通过super(xxx)去继承父类的有参构造器。


2.4. this(...)

class A(String name,int age){
    this.name = name;
    this.age = age;
    this.college = "sias"; //后面的值是创建对象时,构造器传进来的参数。
}

this()和super()区别:

  1. this()和super()都必须放在构造器中的第一行。
  2. this()是用来调用本类内的其他构造器
  3. super()是用来调用父类的构造器,为对象中包含父类这部分的成员变量赋值。

3. 多态

多态是在继承或者实现一种现象,表现为对象多态和行为多态

3.1. 多态类型转换

多态类型转换分为自动类型转换和强制类型转换

强制类型转换前应该先用instanceof xxx进行判断。

4. final

5. 抽象类

用abstract修饰的类就叫做抽象类,抽象方法不能有方法体


抽象抽象,何为抽象就是不能具体化,所以有方法,但是没有方法体


抽象类的设计,是为了丰富子类,父类只管设计,子类负责实现具体内容,比如都是人,把人设计为抽象类,然后用子类(老师,学生等)去重写实现人这个父类(抽象类)的方法


所以抽象类不能创建对象,只能让子类去继承,子类继承之后,要重写所有的抽象类中的方法。否则这个类也必须声明为抽象类。


在开发中,抽象类不是必须设计的

抽象类的设计,是为了丰富子类,父类只管设计,子类负责实现具体内容,比如都是人,把人设计为抽象类,然后用子类(老师,学生等)去重写实现人这个父类(抽象类)的方法

5.1. 模板方法设计模式

用抽象类设计模板方法世纪模式,这个类里面有两个方法,一个是应该被final修饰的模板方法,一个是应该被子类重写的抽象方法。

模板方法可以使用final关键字修饰,禁止子类修改。

6. 接口

  1. 接口弥补了单继承的不足
  2. 接口不能创建对象,接口只能被实现
  3. 接口不能创建对象,但是可以用匿名类去实现接口,创建一个匿名类,从而创建对象(参考链接:接口可以创建对象、实例化吗?_接口创建对象-CSDN博客)

接口默认的变量(即成员变量)是常量

成员方法是抽象方法,所以没有方法体

接口可以理解为是一种特殊的抽象类,所以不能有构造器和方法体

实现类实现多个接口,必须重写全部抽象方法,否则实现类需要定义成抽象类

jdk8开始新增的接口特性

7. 枚举类 enum


枚举类每一个常量对应一个对象

枚举类的构造器是私有的,因此枚举类对外不能创建对象

枚举都是最终类,不可以被继承

枚举类常见应用场景:

用来表示一组信息,然后作为参数进行传输

8. 内部类

Java类的五大成员(成员变量、构造器、代码块、内部类、方法)

内部类是定义在某个类内部的类

8.1. 成员内部类

成员内部类的创建需要先创建外部类的对象再创建内部类对象

8.2. 静态内部类

8.3. 局部内部类

8.4. 匿名内部类(重点)

匿名内部类编译成一个子类,然后会立即创建一个子类对象

  1. 匿名类使用场景1:作为参数直接传递给方法

  1. 匿名类就是为了简化代码。配合lambda表达式使用更好!

9. 泛型

泛型有泛型类、泛型接口、泛型方法。

泛型只支持引用数据类型,不支持基本数据类型

ArrayList<int> list = new ArrayList<>(); //xc错误的不支持基本数据类型
 
//但是可以通过基本数据类型对应的包装类解决
ArrayList<Integer> list1 = new ArrayList<>(); 

10. 集合

集合是一种容器,用来存放数据的,类似于数组,但集合的大小可变

注意有序无序重复不可重复

10.1. 单列集合 Collection

10.1.1. colletion的遍历方式
  1. 迭代器

Collection<String> c = new ArratList<>(); //创建集合对象 此处体现了多态性
System.out.println(c); //可以直接打印集合中的所有元素
 //需要先创建迭代器对象
Iterator<String> it = c.iterator();
// it.next(); //逐个遍  历 可以直接打印
// it.next();  //这种持续遍历会报元素越界错误异常 应该采用循环遍历的方法
 
while(it.hasNext()){
    String ele = it.next();
    System.out.println(ele);
}

  1. 增强for

可以用来遍历数组或者集合

Collection<String> c = new ArratList<>();
 
for(String a : c ){
    sout(a);
}
  1. lambda表达式

10.1.2. List集合

8888第八集

11. 包装类

包装类可以把基本数据类型包装成为一个个对象

解决了集合中指定泛型不能使基本数据类型的问题。

包装类具有自动装箱和自动拆箱的功能

Integer i = 12; //
ArrayList<Integer> list = new ArrayList<>();  
list.add(i);//自动装箱 将基本数据类型转换为对象
int res = list.get(0);


12. StringBuilder

对于字符串操作较少使用String即可,过多选择StringBuilder

13. Lambda

用于简化匿名内部类的代码

Lambda表达式并不是能简化全部匿名内部类,只能简化函数式接口(只能有一个方法)的匿名内部类

13.1. lambda表达式简化规则

13.2. xxx引用 ::

是对lambda表达式的进一步简化

静态方法引用

实例方法引用

特定方法引用

构造器引用

14. 多线程

不管是那种线程的创建方式都需要将start方法放在子线程前面,不让还是单线程。

14.1. 多线程创建方式1:继承Thread类

14.2. 多线程创建方式2:实现Runnable接口

此方式需要定义一个任务类,实现Runnable接口

并且这种方式需要new Thread线程,将任务类对象放入new Thread方法中

14.3. 多线程创建方式3:实现Callable接口

此创建方式可以返回结果,而前面两种不能返回结果,因为run()方法都是void。

15. 动态代理


目录
相关文章
|
7天前
|
Java 数据挖掘 开发者
Java网络编程进阶:Socket通信的高级特性与应用
【6月更文挑战第21天】Java Socket通信是分布式应用的基础,涉及高级特性如多路复用(Selector)和零拷贝,提升效率与响应速度。结合NIO和AIO,适用于高并发场景如游戏服务器和实时数据分析。示例展示了基于NIO的多路复用服务器实现。随着技术发展,WebSockets、HTTP/2、QUIC等新协议正变革网络通信,掌握Socket高级特性为应对未来挑战准备。
|
5天前
|
缓存 安全 小程序
从基础到进阶:掌握Java中的Servlet和JSP开发
【6月更文挑战第23天】Java Web开发中的Servlet和JSP是关键技术,用于构建动态网站。Servlet是服务器端小程序,处理HTTP请求,生命周期包括初始化、服务和销毁。基础Servlet示例展示了如何响应GET请求并返回HTML。随着复杂性增加,JSP以嵌入式Java代码简化页面创建,最佳实践提倡将业务逻辑(Servlet)与视图(JSP)分离,遵循MVC模式。安全性和性能优化,如输入验证、HTTPS、会话管理和缓存,是成功应用的关键。本文提供了一个全面的学习指南,适合各级开发者提升技能。
|
9天前
|
Java 开发者 UED
【实战攻略】Java异常处理进阶:throw关键字,打造坚不可摧的错误防御体系!
【6月更文挑战第19天】在Java中,`throw`关键字用于主动抛出异常,特别是在检测到错误条件如非法参数时。通过`throw`,开发者能控制何时中断程序并提供清晰的错误信息。例如,在验证订单金额时,如果金额小于等于零,可以抛出`IllegalArgumentException`。此外,`throw`还可用于构建异常链,保留错误上下文,便于问题追溯。掌握`throw`使用,是构建健壮异常处理和提升用户体验的关键。
|
7天前
|
机器学习/深度学习 Java Serverless
Java开发者的神经网络进阶指南:深入探讨交叉熵损失函数
今天来讲一下损失函数——交叉熵函数,什么是损失函数呢?大体就是真实与预测之间的差异,这个交叉熵(Cross Entropy)是Shannon信息论中一个重要概念,主要用于度量两个概率分布间的差异性信息。在信息论中,交叉熵是表示两个概率分布 p,q 的差异,其中 p 表示真实分布,q 表示预测分布,那么 H(p,q)就称为交叉熵:
|
14天前
|
存储 Java
Java 新手进阶:从变量到常量,一步步走向编程巅峰!
【6月更文挑战第14天】Java新手应掌握变量与常量,它们是编程基础。通过示例展示变量(如矩形的长度和宽度)用于存储可变数据,常量(如重力加速度)用于表示固定值。理解不同类型的变量,如字符串、整型和浮点型,并用`final`关键字定义常量。在银行账户管理程序案例中,变量跟踪账户信息,常量表示年利率。熟悉这些概念将提升编程技能。
|
1天前
|
Java 编译器
Java 从入门到进阶之路(八)
Java 从入门到进阶之路(八)
|
1天前
|
人工智能 算法 Java
Java进阶代码的具体写法
Java进阶代码的具体写法
|
2天前
|
Java 程序员 数据格式
老程序员分享:java进阶(36)
老程序员分享:java进阶(36)
|
2天前
|
自然语言处理 Java
Java IO流进阶教程:掌握字节流和字符流的高级用法!
【6月更文挑战第26天】Java IO流助你高效交换数据,包括字节流(InputStream/OutputStream)和字符流(Reader/Writer)的高级技巧。缓冲流(Buffered*)提升读写性能,对象流(Object*Stream)支持对象序列化。字符流的BufferedReader/BufferedWriter优化文本处理,注意字符集如UTF-8用于编码转换。掌握这些,优化IO操作,提升代码质量。
|
3天前
|
SQL 缓存 Java
Java持久化新篇章:Hibernate与JPA的进阶探索
【6月更文挑战第25天】在Java持久化技术中,Hibernate和JPA日益发展,本文以电商系统为例,展示它们的新特性和进阶应用。JPA通过注解如@Entity实现对象-关系映射,EntityManager处理CRUD操作。Hibernate则扩展了JPA,提供二级缓存、自定义HQL/SQL查询及批量操作,如批量更新商品价格,显示了其在性能优化和复杂需求上的灵活性。两者在现代Java开发中不可或缺。