11.4-11.10学习情况总结

1:模板设计方法模式的写法:

定义一个抽象类

在里面定义2个方法:

一个是模板方法:把相同代码放进去

一个是抽象方法:具体实现交给子类完成

2:建议使用final关键字修饰模板方法,因为:

模板方法是给对象直接使用的,不能被子类重写

一旦子类重写了模板方法,模板方法就失效了

接口

1:Java提供了一个关键字interface,用这个关键字我们可以定义一个特殊的结构:接口

public interface 接口名{

//成员变量(常量)

//成员方法(抽象方法)

}

注意:接口不能创建对象;接口是用来被类实现(implements)的,实现接口类的类被称为实现类

修饰符 class 实现类 implements接口1,接口2,接口3...{

}

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

2:接口的好处:

弥补了类单继承的不足,一个类同时可以实现多个接口。

让程序可以面向接口编程,这样程序员就可以灵活方便的切换各种业务实现

从JDK8开始,接口新增了三种形式的方法:

默认方法(实例方法):使用default修饰,默认会被加上public 修饰,且只能使用接口的实现类对象调用

私有方法:必须用private修饰

类方法:(静态方法):使用static修饰,默认会被加上public 修饰,且只能用接口名来调用

3:接口的多继承:一个接口可以同时继承多个接口

public interface C extends B,A{

}

作用:便于类去实现

 4:

内部类:

1:是类中的五大成分之一(成员变量,方法,构造器,内部类,代码块),如果一个类定义在另一个类的内部,这个类就是内部类。

场景:当一个类的内部,包括一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类

public class Car{

         public class Engine{

         }

}

2:内部类的四种形式:

成员内部类,静态内部类,局部内部类,匿名内部类

3:成员内部类:就是类中的一个普通成员,类似前面学过的普通的成员变量,成员方法。

外部类名.内部类名 对象名=new 外部类(...)new内部类(...);

public class Outer{

         public class Inner{

         }

}

成员内部类的实例方法中,访问其他成员有啥特点

可以直接访问外部类的实例成员,静态成员

可以拿到当前外部类对象,格式是:外部类名.this

4:静态内部类:有static 修饰的内部类,属于外部类自己持用。

public class Outer{

         public  static class Inner{

         }

}

创建对象的格式:

外部类名.内部类名 对象名=new 外部类.内部类(...);

Outer.Inner in=new Outer.Inner();

 静态内部类中访问外部类成员的特点:可以直接访问外部类的静态成员,不可以直接访问外部类的实例成员

5:局部内部类:局部内部类是定义在方法中,代码块中,构造器等执行体中

public class Test{

    public static void main(String[] args){

    }

   public static void go(){

           class A {

           }

           abstract class B{

           }

           interface C{

           }

 }

}

6:匿名内部类就是一种特殊的局部内部类;所谓匿名:指的是程序员不需要为这个类声明名字。

new 类或接口(参数值...){

     类体(一般是方法重写);

}

特点:匿名内部类本质就是一个子类,并会立即创建出一个子类对象。

作用:用于更方便的创建一个子类对象。

匿名内部类在开发中的使用场景:通常作为一个参数传输给方法

 枚举:是一种特殊类

格式:

修饰符 enum 枚举类名{

名称1,名称2,...;

其他成员...

}

注意:枚举类中的第一行,只能写一些合法的标识符(名称),多个名称用逗号隔开。

           这些名称,本质是常量,每个常量都会记住枚举类的一个对象。

8:

9:枚举的常见应用场景:用来表示一组信息,然后作为参数进行传输。

选择定义一个一个的常量来表示一组信息,并作为参数传输

                                           参数值不受约束。

选择定义枚举表示一组信息,并作为参数传输

                                            代码可读性好,参数值得到了约束,对使用者友好,建议使用。

 泛型:

1:定义类,接口,方法时,同时声明了一个或者多个类型变量(如:<E>),称为泛型类,泛型接口,泛型方法,他们统称为泛型。2:泛型类:

public class ArrlyList<E>{

}

修饰符 class <类型变量,类型变量...>{

}

3:泛型接口:

修饰符 interface 接口名 <类型变量,类型变量...>{

}

public interface A<E>{

}

4:泛型方法:

修饰符 <类型变量,类型变量...>返回值类型 方法名(形参列表){

}

public static <T> void test <T t>{

}

5:通配符:就是“?”,可以在“使用泛型”的时候代表一切类型;E T K Y是在定义泛型的时候使用

6:泛型的上下限:

泛型上限:?extends Car:?能接收的必须是Car或者其子类。

泛型下限:? super Car:?能接收的必须是Car或者其父类。

7: 

API:(应用程序编程接口)

 java已经帮我们写好了一些程序,如类,方法等,我们直接可以拿来用

1:

2:Object类的作用

 Object类是Java中所有类的祖宗。因此,Java中所有类的对象都可以使用Object类中提供的一些方法。

3:

4:Object类中to String方法的作用是返回对象的字符串形式,存在的意义是让子类重写,以便返回子类对象的内容

 Object类中equals方法的作用是默认是比较两个对象的地址是否相等。

5:Object类提供的对象克隆方法:

protected Object clone()     对象克隆

当某个对象调用这个方法时,这个方法会复制一个一模一样的新对象返回。

6:

7:Objects类是一个工具类,提供了很多操作对象的静态方法给我们使用

 8:包装类:就是把基本类型的数据包装成对象

9:包装类的其他 常见操作

可以把基本数据类型的数据转换成字符串类型。

public static String toString(double d)

public String toString()

可以把字符串类型的数据转换成数值本身对应的数据类型。

public static  int parseInt(String s)

public  static Integer valueOf(String s)

10:StringBuilder代表可变字符串对象,相当于是一个容器,它里面装的字符串是可以改变的,就是用来操作字符串的。

为啥操作字符串建议使用 StringBuilderString,而不用原来学过的String?

好处:StringBuilder比String更适合做字符串的修改操作,效率会更高,代码也会更简洁。

11: 对于字符串的相关操作,如频繁的拼接,修改等,建议使用StringBuilder,效率更高

注意:如果存在字符串较少,或者不需要操作,以及定义字符串变量,还是建议用String 。

12:StringBuffer与StringBuilde

StringBuffer的用法与StringBuilde是一模一样的,

但StringBuilde是线程不安全的,StringBuffer是线程安全的

 13:StringJoiner

JDK8开始才用的,跟StringBuilde 一样,也是用来操作字符串的,也可以看成是一个容器,创建之后里面的内容是可变的

好处:不仅能提高字符串的操作效率,并且在有些场景下使用它操作字符串,代码会简洁。

常用API(二)

1:Math代表数学,是一个工具类,里面提供的都是对数据进行操作的一些静态方法。 

2:System:代表程序所在的系统,也是一个工具类。

3:Runtime:代表程序所在的运行环境,是一个单例类

4:

5:Data代表的是日期和时间 

 6:SimpleDateFormat:代表简单日期个格式化,可以用来把日期对象,时间毫秒值格式化成我们想要的格式

 SimpleDateFormat解析字符串时间成为日期对象

7:Calendar 代表的是系统此刻对应的日历,通过它可以单独获取,修改时间中的年,月,日,时,分,秒等。 

 Calendar时可变对象,一旦修改后其对象本身表示的时间将产生变化。

 

8:

 9:Instant时间线上的某个时刻/时间戳

通过获取Instant的对象可以拿到此刻的时间,改时间由两部分组成:如从1970-01-01 00:00:00开始走到此刻的总秒数+不够一秒的纳秒数

 作用:可以用来记录代码的执行时间,或用于记录用户操作某个事件的时间点。

传统的Date类,只能精确到毫秒,并且是可变对象;

新增的Instant类,可以精确到纳秒,并且是不可变对象,推荐用Instant代替Date。

10:DateTimeFoematter

11:Period:可以用于计算两个LocalDate对象相差的年数,月数,天数。

12:Duration可以用于计算两个对象相差的天数,小时数,分数,秒数,纳秒数;支持LocalTime,LocalDateTime,Instant等时间。

13:Arrays:用来 操作数组的一个工具类。

 14:如果数组中储存的是对象,如何 排序?

方法一:让该对象的类实现 Comparable(比较规则)接口,然后重写comparaTo方法,自己来制定比较规则。

方法二:使用下面这个sort方法,创建comparator比较器接口的匿名内部类对象,然后自己来制定比较规则。public static<T>void sort(T[] arr ,Comparator<?superT>c)对数组进行排序(支持自定义排序规则)。

15:子定义排序规则时,需要遵循的官方规则如下:

JDK8的新特性:

Lambda表达式 

1:作用:用于简化 匿名内部类的代码写法。

格式:

(被重写方法的形参列表)->{

被重写方法的方法体代码。

}

Lambda表达式 并不是简化全部匿名内部类的写法,只能简化函数式接口的匿名内部类

函数式接口:有且仅有一个抽象方法的接口。

注意:将来我们见到的大部分函数式接口,上面都会可能有一个@FunctionalInterface的注解,有该注解的接口就必定是函数式接口。

2:

3:方法引用:

静态方法的引用:

类名::静态方法

使用场景:

如果某个Lambda表达式 里只是调用一个静态方法,并且前后参数的形式一致,就可以使用静态方法引用 。

实例方法的引用:

对象名::实例方法

使用场景:

如果某个Lambda表达式 里只是调用一个实例方法,并且前后参数的形式一致,就可以使用实例方法引用 。

特定类型的方法引用:

类型::静态方法

使用场景:

如果某个Lambda表达式 里只是调用一个实例方法,并且前后参数列表中的第一个参数列表是作为方法的主调,后面的所有参数都是作为该实例方法的入参的, 则此时就可以使用特定类型的 方法引用 。

构造器引用:

类名:: new

使用场景:

如果某个Lambda表达式 里只是在场景对象 ,并且前后参数的形式一致,就可以使用 构造器引用 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. spyder 5.4.1 requires pyqt5<5.16, which is not installed. spyder 5.4.1 requires pyqtwebengine<5.16, which is not installed. Successfully installed aiofiles-23.1.0 altair-4.2.2 blinker-1.6.2 cachetools-5.3.1 chardet-5.1.0 cmake-3.26.3 cpm_kernels-1.0.11 fastapi-0.95.2 ffmpy-0.3.0 gitdb-4.0.10 gitpython-3.1.31 gradio-3.32.0 gradio-client-0.2.5 h11-0.14.0 httpcore-0.17.2 httpx-0.24.1 latex2mathml-3.76.0 linkify-it-py-2.0.2 lit-16.0.5 markdown-it-py-2.2.0 mdit-py-plugins-0.3.3 mdtex2html-1.2.0 mdurl-0.1.2 nvidia-cublas-cu11-11.10.3.66 nvidia-cuda-cupti-cu11-11.7.101 nvidia-cuda-nvrtc-cu11-11.7.99 nvidia-cuda-runtime-cu11-11.7.99 nvidia-cudnn-cu11-8.5.0.96 nvidia-cufft-cu11-10.9.0.58 nvidia-curand-cu11-10.2.10.91 nvidia-cusolver-cu11-11.4.0.1 nvidia-cusparse-cu11-11.7.4.91 nvidia-nccl-cu11-2.14.3 nvidia-nvtx-cu11-11.7.91 orjson-3.8.14 protobuf-3.20.3 pydantic-1.10.8 pydeck-0.8.1b0 pydub-0.25.1 pygments-2.15.1 pympler-1.0.1 python-multipart-0.0.6 rich-13.4.1 semantic-version-2.10.0 sentencepiece-0.1.99 smmap-5.0.0 starlette-0.27.0 streamlit-1.22.0 streamlit-chat-0.0.2.2 torch-2.0.1 transformers-4.27.1 triton-2.0.0 tzlocal-5.0.1 uc-micro-py-1.0.2 uvicorn-0.22.0 validators-0.20.0 websockets-11.0.3 WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv 解释下
06-02

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值