小知识点

重载:一个类中,同一个方法名,只是参数列表、个数、顺序不同而已;

重写:子类extends父类,重写父类的方法,只是方法体不同。

public static int add(int d,int...a)//这叫可变参数,确定的在前面

值传递:基本数据类型;

引用传递:array、class、interface;

类的组成(field(成员变量)、method、constructor),其中field如果是全局的又默认值,局部变量则没有默认值

栈:存放局部变量,方法执行完毕时,自动释放空间;

堆:需要垃圾回收器回收(gc())看是否还有指针(引用)指向它;

方法区:类的信息(代码)、static、字符串常量etc。

无参constructor:名称必须和类名一致,一个在创建对象时被自动调用的特殊方法,如people p=new people(),这个为啥有(),就是因为有无参constructor,如果有了有参constructor,最好写一个无参constructor,不然可能出麻烦;

有参constructor:public people(String name,int age......)

                                                 this.name=name;

                                                  this.age=age;

就是为了在new的时候能传参数而已people p=new people(“张三”,20)

在定义类时,自己没有提供constructor时,jvm会自动提供一个无参constructor,但是如果自己提供了一个有参constructor的话,无参的不会提供了,所以自己要写一个无参constructor。

static: 作用就是方便调用(不需要new)、在方法区中、在调用该修饰符修饰的方法时,因为不会将对象的引用传递,所以static方法中不可以访问非static,同时,不可以以任何方式引用this和super(因为没有对象概念)

static代码块的作用:为静态变量赋值、初始化

执行顺序:static{ }——>{ }(非static语句块)——>constructor()——>void()

super:父类的引用,可以访问父类的void和field;

this关键字主要有三个应用:

(1)this调用本类中的属性,也就是类中的成员变量;

(2)this调用本类中的其他方法;

(3)this调用本类中的其他构造方法,调用时要放在构造方法的首行。

example:

private final ConcurrentHashMap<Long,Message> message = new ConcurrentHashMap<>();//成员变量

@Override

public Message findMessage(long id) {

return this.message.get(id); }

final:修饰的field-常量、修饰类-不可extend、修饰void-不可重写

 abstract:作用(避免子类设计的随意性,所以子类必须重写所有的abstract void),在父类的时候abstract void 是这样定义的——>abstract void a();,连{}都没有,没有方法体,abstract 类不能被实例化(即new)

 

不允许类多重继承的主要原因:如果A同时继承B和C,而B和C同时有一个D方法,A如何决定该继承那一个呢?

但接口不存在这样的问题,接口全都是抽象方法继承谁都无所谓,所以接口可以继承多个接口。

注意:

1)一个类如果实现了一个接口,则要实现该接口的所有方法。

2)方法的名字、返回类型、参数必须与接口中完全一致。如果方法的返回类型不是void,则方法体必须至少有一条return语句。

3)因为接口的方法默认是public类型的,所以在实现的时候一定要用public来修饰(否则默认为protected类型,缩小了方法的使用范围)。

抽象类可以有具体的方法 和属性,  接口只能有抽象方法和不可变常量;

 

interface:一个类实现了interface,必须实现interface 所有的void,public和abstract写不写都无所谓,因为这些都是在interface中必须的

抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人和女人,他们的抽象类是人类,而猫和狗的抽象类是宠物类。人类可以吃东西,宠物类也可以吃东西,但是两者不能混为一谈,因为有本质的区别。这个“吃东西”是一个动作,你可以把“吃东西”定义成一个接口,然后让两个类去实现它的方法

innerClass:可以访问外部类的成员(包括private修饰的)

还有一个很重要的concept:类描述了一个实体,包括实体的状态,也包括实体可能发出的动作。

  接口定义了一个实体可能发出的动作。但是只是定义了这些动作的原型,没有实现,也没有任何状态信息。

  所以接口有点象一个规范、一个协议,是一个抽象的概念;而类则是实现了这个协议,满足了这个规范的具体实体,是一个具体的概念。

  所以就你的问题:

  1、接口中定义类方法的原型,但是不能说是空方法,因为空方法的意思是有实现体,只不过实现体是空操作。实际上接口没有定义任何实现体。具体的实现体都是在实现接口的类中,接口只是定义了这些方法的调用方式。

  你当然也可以不用接口,直接在类里面写方法,但是如果你的一组方法需要在很多类里实现,那么把它们抽象出来,做成一个接口规范,不是更好么?

  2、一个类描述了一个实体,这个实体可能是一个复杂的对象,它的动作很多,如果把这些动作分类,用接口a定义其中的某一组动作,接口b定义其中的另外一组动作,这样的结构,比较清楚。

  这种方式具备了多继承的优点,避免了多继承的缺陷。实际上在历史上,接口在很大程度上,是为了解决多继承带来的种种问题而设计出来的。

  3、包中那些已定义的接口,怎么知道那里面定义了什么方法。

  接口里定义了方法的输入输出,这些都是协议,具体的实现都在每个类中。对于很多只需要抽象接口的地方,不需要知道具体的类是什么,只要这个类实现了这个接口就可以了。

 

内存泄漏:对象已经死了,无法通过垃圾收集器进行自动回收,通过找出泄露的代码位置和原因,才好确定解决方案

内存溢出:内存中的对象都还必须存活着,这说明Java堆分配空间不足,检查堆设置大小(-Xmx与-Xms),检查代码是否存在对象生命周期太长、持有状态时间过长的情况

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值