java中Default用法,父子类构造方法执行顺序,内存泄露类型

方法名可以和类名一样吗???
可以!!只是不符合规范而已。。。。。如图

public class Temp {
    public static void main(String[] args) {
        Temp();
    }
    public static void Temp(){
        System.out.println("方法名与类名相同");
    }
}

java中default的两种用法???
1,在switch中的默认分支。
2,在接口中修饰方法,default修饰的目的是让接口可以拥有具体的方法,让接口内部包含了一些默认的方法实现。
被default修饰的方法是接口的默认方法。既只要实现该接口的类,都具有这么一个默认方法,默认方法也可以被重写。
我们可以想象这么一个场景,既实现某个接口的类都具有某个同样的功能,如果像Java8以前的版本,那么每个实现类都需要写一段重复的代码去实现那个功能,显得没有必要。这就是存在的意义。
子类继承父类,构造函数的执行顺序???

class Person {
public Person(){
         System.out.println("Person");
         }
     }
class Son extends Person{
public Son(){
       System.out.println("Son");
    }
public static void main(String[] args) {
       Son s=new Son();
       Person p=new Son();//子类对象指向父类引用
       //都是先执行父类构造函数,再执行子类构造函数
     }  
}

在继承关系下,创建子类对象,先执行父类构造方法,再执行子类构造方法。
其中创建子类对象包括向上转型也是这样的执行顺序
static方法能处理非static的属性
不能,
因为static的方法在装载class的时候首先完成,比构造方法还要早,此时非static的属性和方法还没有完成初始化,所以不能调用处理。
内存回收机制说法
程序员不需要创建线程来释放内存。
内存回收程序负责释放无用内存。
不允许程序员直接释放内存。
内存回收不一定在什么时间。
合理的标识符规则
数字 字母 下划线 $符组成,不能以数字开头,不能是关键字。
java.lang.Cloneable是一个接口,在克隆时,被克隆的类必须实现这个接口,否则抛出异常

内存溢出: out of memory,是指程序在申请内存时,没有足够的内存空间供使用。例如你定义了一个Integer,非要存一个Long数据,那就是内存溢出。
内存泄漏: memory leak,内存泄露就是堆内存中不再使用的对象,但是垃圾回收期无法从内存中删除他们的情况,因此他们会被不必要的一直存在。这种情况会耗尽内存资源并降低系统性能,最终以OOM终止。垃圾回收器会定期删除未引用的对象,但它永远不会收集那些仍在引用的对象。
内存泄露的症状:
应用程序长时间连续运行时性能严重下降;
应用程序中的OutOfMemoryError堆错误;
自发且奇怪的应用程序崩溃;
应用程序偶尔会耗尽连接对象。
Java中内存泄露类型
Java中内存泄露类型
1、static字段引起的内存泄露
大量使用static字段会潜在的导致内存泄露,在Java中,静态字段通常拥有与整个应用程序相匹配的生命周期。

解决办法: 最大限度的减少静态变量的使用;单例模式时,依赖于延迟加载对象而不是立即加载方式。

2、未关闭的资源导致内存泄露
每当创建连接或者打开流时,JVM都会为这些资源分配内存。如果没有关闭连接,会导致持续占有内存。在任意情况下,资源留下的开放连接都会消耗内存,如果我们不处理,就会降低性能,甚至OOM。

解决办法: 使用finally块关闭资源;关闭资源的代码,不应该有异常;jdk1.7后,可以使用try-with-resource块。

3、不正确的equals()和hashCode()
在HashMap和HashSet这种集合中,常常用到equal()和hashCode()来比较对象,如果重写不合理,将会成为潜在的内存泄露问题。

解决办法: 用最佳的方式重写equals()和hashCode。

4、引用了外部类的内部类
非静态内部类的初始化,总是需要外部类的实例;默认情况下,每个非静态内部类都包含对其包含内的隐式引用,如果我们在应用程序中使用这个内部类对象,那么即使在我们的包含类对象超出范围后,它也不会被垃圾收集。

解决办法: 如果内部类不需要访问包含的类成员,考虑转换为静态类。

5、finalize()方法造成的内存泄露
重写finalize()方法时,该类的对象不会立即被垃圾收集器收集,如果finalize()方法的代码有问题,那么会潜在的引发OOM;

解决办法: 避免重写finalize()。

6、常量字符串造成的内存泄露
如果我们读取一个很大的String对象,并调用了inter(),那么它将放到字符串池中,位于PermGen中,只要应用程序运行,该字符串就会保留,这就会占用内存,可能造成OOM。

解决办法: 增加PermGen的大小,-XX:MaxPermSize=512m;升级Java版本,JDK1.7后字符串池转移到了堆中。

7、使用ThreadLocal造成内存泄露
使用ThreadLocal时,每个线程只要处于存货状态就可保留对其ThreadLocal变量副本的隐式调用,且将保留其自己的副本。使用不当,就会引起内存泄露。
一旦线程不在存在,ThreadLocals就应该被垃圾收集,而现在线程的创建都是使用线程池,线程池有线程重用的功能,因此线程就不会被垃圾回收器回收。所以使用到ThreadLocals来保留线程池中线程的变量副本时,ThreadLocals没有显示的删除时,就会一直保留在内存中,不会被垃圾回收。

解决办法: 不在使用ThreadLocal时,调用remove()方法,该方法删除了此变量的当前线程值。不要使用ThreadLocal.set(null),它只是查找与当前线程关联的Map并将键值对设置为当前线程为null。
memory leak会最终导致out of memory!!!

java序列化?如何实现?用途??在哪些程序里见过。
1,将一个实例对象的状态信息写入字节流。
2,使一个类可序列化,只需要简单实现Serializable接口即可
3,永久保存到硬盘里。一般存放于文件里。在网络上传送对象的序列。
4,在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值