java随笔

  • 重写(override)和重载(overload)的区别:重写是子类继承父类并对父类里的方法进行重写,不可以改变参数及返回值,只可以改变内容;重载是同一个类中方法的重写,可以改变参数以及返回值。
  • 抽象方法所在的类必须是抽象类。不能直接创建抽象类对象;必须用一个子类来继承抽象父类;子类必须覆盖重写父类当中的所有抽象方法,去掉抽象方法中的abstract关键字,然后补上方法体大括号;创建子类对象进行使用。
  • 类中静态方法中不可以访问非静态字段,静态属性的创建早于非静态属性,静态属性及方法存在于方法区中的静态区中。
  • 继承是多态的前提。
  • 接口就是一种公共的规范标准,是多个类的公共规范;接口是一种引用数据类型,最重要的内容就是其中的:抽象方法。
  • java7接口可包含的内容:
    1、常量
    2、抽象方法
  • java8接口新增内容:
    3、默认方法
    4、静态方法
  • java9接口新增内容:
    5、私有方法
  • 任何版本的java中接口都可以定义抽象方法,格式:public abstract 返回值类型 方法名称(参数),public和abstract可选择性忽略。
  • 接口不能直接使用,必须有一个“实现类”来实现该接口,格式:public class 实现类名称 implements 接口名称;接口的实现类必须覆盖重写(实现)接口中的所有抽象方法,去掉abstract关键字,加上方法体大括号;创建实现类的对象,进行使用。
  • 如果实现类并没有覆盖重写接口中所有抽象方法,那么这个实现类自己就必须是抽象类。
  • java8开始,接口中允许定义默认方法,格式:public default 返回值类型 方法名称(参数列表){方法体}。
  • 接口当中也可以定义“成员变量”,但必须使用public static final三个关键字进行修饰,从效果上看,这其实就是接口的常量,格式:public static final 数据类型 常量名称 = 数据值 ,可以省略public static final。
  • 接口不能有静态代码块和构造方法。
  • 如果实现类所实现的多个接口当中,存在重复的抽象方法,只需复写一次即可。
  • 如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类必须是一个抽象类。
  • 如果实现类实现的多个接口当中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写。
  • 一个类如果直接父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类当中的方法。
  • 多个接口当中的抽象方法可以重复,如果抽象方法重复子接口必须复写,而且带着default关键字。
  • 多态性:父类引用指向子类对象,格式:父类名称 对象名 = new 子类名称() 或 接口名称 对象名 = new 实现类名称()。
  • 在多态的代码当中,成员方法的访问规则是:看new的是谁,就优先用谁,没有则向上找,口诀:编译看左边,运行看右边。
  • 成员变量:编译看左边,运行还看左边。
  • 成员方法:编译看左边,运行看右边。
  • 对象的向上转型,其实就是多态写法:父类名称 对象名 = new 子类名称()。
  • 对象的向下转型,其实是一个还原的动作,格式:子类名称 对象名 = (子类名称)父类对象。
  • final关键字四种用法:
    1、可以用来修饰一个类
    2、可以用来修饰一个方法
    3、还可以用来修饰一个局部变量
    4、还可以用来修饰一个成员变量
  • 不能使用final类来作为父类,其中所有的成员方法都无法进行覆盖重写。
  • 当final关键字用来修饰一个方法的时候,这个方法就是最终方法,也就是不能被覆盖重写,格式:修饰符 final 返回值类型 方法名称(参数列表) {方法体};final修饰局部变量后该变量就不能进行更改;成员变量用final修饰后同样不可变,由于成员变量有默认值,所以用了final之后必须手动赋值,不会再给默认值了,对于final的成员变量,要么直接赋值,要不通过构造方法赋值。
  • java中有四种权限修饰符:public > protected > (default) > private。
  • 如果接口的实现类(或者父类的子类)只需要使用唯一的一次,那么这种情况下就可以省略掉该类的定义,而改为使用匿名内部类,匿名内部类的定义格式:接口名称 对象名 = new 接口名称(){覆盖重写所有抽象方法}。
  • Iterator迭代器是一个接口,我们无法直接使用,需要使用Iterator接口的实现类对象,获取实现类的方式比较特殊,Collection接口中有一个方法,叫iterator(),这个方法返回的就是迭代器的实现类对象,Iterator iterator()返回此collection的元素上进行迭代的迭代器。
  • 泛型是一种未知的数据类型,当我们不知道用什么数据类型的时候,可以使用泛型,泛型也可以看做是一种变量,用来接收数据类型。
  • 定义含有泛型的方法:泛型定义在修饰符和返回值类型之间,格式:修饰符 <泛型> 返回值类型 方法名(参数列表(使用泛型)){方法体;}。
  • 泛型的通配符:?代表任意的数据类型,使用方式:不能创建对象使用,只能作为方法的参数使用。
  • 泛型的上限限定:? extends E,代表使用的泛型只能是E类型的子类/本身;泛型的下限限定:? super E,代表使用的泛型只能是E类型的父类/本身。
  • 可变参数:是JDK1.5之后出现的新特性。使用前提:当方法的参数列表数据类型已经确定,但参数的个数不确定,就可以使用可变参数;使用格式:定义方法时使用,修饰符 返回值类型 方法名(数据类型… 变量名){};可变参数的原理:可变参数底层就是一个数组,根据传递参数的个数不同,会创建不同长度的数组来存储这些参数,传递的参数可以使0个,1个,2个或多个。
  • 一个方法的参数列表,只能有一个可变参数,如果方法的参数有多个,那么可变参数必须写在参数列表的末尾。
  • java,lang.Throwable类是java语言中所有错误或异常的超类,直接子类有两个:Exception和Error。Exception表示编译器异常,进行编译(写代码)java程序出现的问题,例如其子类RuntimeException表示运行期异常,java程序运行过程中出现的问题,异常就相当于程序得了一个小毛病,把异常处理掉程序就可以执行了;Error表示错误,就相当于程序得了一个无法治愈的毛病,必须修改源代码,程序才可以继续执行。
  • java程序属于抢占式调度,哪个线程的优先级高,哪个线程优先执行;同一个优先级,随机选选择一个执行。
  • 如果一个类继承Thread,则不适合资源共享,如果实现了Runable接口的话,则很容易实现资源共享。
  • 同步代码块:synchronized关键字可以用于方法中的某个区块中,表示只对这个区块的资源实施互斥访问,格式:synchronized(同步锁){需要同步操作的代码块}。
  • java.util.concurrent.locks.Lock机制提供了比synchronized代码块和synchronized方法更广泛的锁定操作,同步代码块/同步方法具有的功能Lock都有,除此之外更强大,更体现面向对象。
  • 线程池:JDK1.5之后提供的,java.util.concurrent.Executors:线程池的工厂类,用来生产线程池。Executors类中的静态方法:static ExecutorService newFixedThreadPool(int nThreads)创建一个可重用固定线程数的线程池。
  • 线程池使用步骤:
  •  	1、newFixedThreadPool生产一个指定线程数量的线程池。
    
  •  	2、创建一个类,实现Runnable接口,重写run方法,设置线程任务。
    
  •  	3、调用ExecutorService中的方法submit,传递线程任务(实现类),开启线程,执行run方法。
    
  •  	4、调用ExecutorService中的shutdown销毁线程池(不建议执行)。
    
  • Lambda表达式标准格式:(参数类型 参数名称) -> { 代码语句 }。
  • 一切文件数据(文本、图片、视频等)在存储的时候,都是以二进制数字的形式保存,都是一个一个的字节,那么传输时一样如此。所以字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。
  • Properties类表示了一个持久的属性集,继承于Hashtable。Properties可保存在流中或从流中加载。
  • Properties集合是唯一和IO流结合的集合。可以使用Properties中的store,把集合中的临时数据,持久化写入到硬盘中储存,可以使用load把硬盘中保存的文件(键值对)读取到集合中使用。
  • Properties集合是一个双列集合,key和value默认都是字符串。
  • 类想要实现序列化必须继承Serializable接口。
  • 被static修饰的关键字不可以被序列化。
  • 序列化与反序列化的过程:编译器(javac.exe)会把Person.java文件编译成Person.class文件,Person类实现了Serializable接口,就会根据类的定义给Person.class文件,添加一个序列号:serialVersionUID=-64726;反序列化时,会使用Person.class文件中的序列号和Person.txt文件中的序列化号比较,如果一样,则反序列化成功,如果不一样,则抛出序列化冲突异常:InvalidClassExecption。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值