至今记得若干年前,去面试排了半天的队,到个人时候,面试官问个人第一个问题,java三大特性是什么~我支支吾吾的没有答全~0.0java
什么是封装?面试
举个例子:有一个房子,房子里面有厨房,卫生间,卧室,客厅等房间,每个房间都有各自的用途,而客人要来我家吃饭也好,闲聊也好,那么他只能从我家的门(对外暴露的接口)进来,那这个房子就表明一个“封装”。函数
封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和操做(或服务)结合为一个独立的总体,并尽量隐藏对象的内部实现细节。this
封装时的权限控制符区别以下:对象
具体到java代码以下:继承
/*接口
* 封装演示资源
*/get
public class House权限控制
{
// 私有化属性
private String cookroom;
private String bathroom;
private String bedroom;
private String parlor;
public String getCookroom() {
return cookroom;
}
public void setCookroom(String cookroom) {
this.cookroom = cookroom;
}
public String getBathroom() {
return bathroom;
}
public void setBathroom(String bathroom) {
this.bathroom = bathroom;
}
public String getBedroom() {
return bedroom;
}
public void setBedroom(String bedroom) {
this.bedroom = bedroom;
}
public String getParlor() {
return parlor;
}
public void setParlor(String parlor) {
this.parlor = parlor;
}
}
因此,在这里咱们能够看到这个House 类就是一个封装的体现。
什么是继承?
俗话说,龙生龙,凤生凤,老鼠的儿子会打洞,这就是继承的一种表现。就像咱们每一个人会继承父母的相貌等基因,甚至财富,人脉等资源。
一样在java代码中类与类,接口与接口之间都存在继承,要想继承另外一个类,那么 extends 是必不可少的。
惟一要注意的是,java所倡导的继承是单继承,就像咱们每个人,只会有一个亲生父亲(固然马云爸爸,要认我作儿子的话,我也是没法拒绝的0.0),因此java类只能经过关键字extends 继承另一个类,或者一个接口经过 关键字extends继承另一个接口。
而类与接口之间,只能是类实现接口,经过关键字 implements 完成类实现接口。
具体java代码以下:
1 public class MyHouse extends House{2 //个人房子啥都没有~3 4 }
从上面代码看到,新建MyHouse类啥都没有,我只是继承了House,可是请看下图,我能够经过new一个MyHouse对象去调用House的方法属性,这就是继承的魅力
最后还要强调的一点就是继承和 final 关键字的关系:
final 能够修饰类,表明当前被修饰类不能被继承;
能够修饰变量,就变成了类的常量,这个变量一旦被初始化便不可改变;
能够修饰方法,表明子类不能复写或者说不能改变被修饰的方法中的代码,可是能够直接拿来使用;
注:万物皆对象,其实咱们每新建一个类,都是已经默认继承了Object类了,咱们新建一个类以后,能够看到有一些默认的方法,以下图中我圈中的部分,都是来自于Object类的。
什么是多态?
java中的多态具体分为2大类:覆写(又叫重写)和重载
覆写
覆写的存在的前提条件就是首先要有继承,好比前面咱们写的Myhouse继承House,我在House类中新增一个方法名为myName,以前的代码不作变化,新增代码以下:
1 public String myName()2 {3 return"House";4 }
这个时候我经过Myhouse对象调用myName方法,经过输出到控制台能够看到,输出的结果为house,由于咱们继承了父类
下面咱们在子类中覆写这个方法,代码以下
public class MyHouse extends House{
public static void main(String[] args) {
MyHouse mm = new MyHouse();
System.out.println(mm.myName());
}
public String myName()
{
return "myHouse";
}
}
这个时候再运行程序,获得的结果就是 myHouse,而再也不是House。
因此呢,覆写就是当子类定义了和父类在方法名称、返回值类型、参数类型及个数彻底相同的方法的时候,称为方法的覆写。
在进行方法覆写的时候有一点须要注意:被子类所覆写的方法不能拥有比父类更严格的访问控制权限。
若是此时父类之中的方法是default权限,那么子类覆写的时候只能是default或public权限,而若是父类的方法是public,那么子类之中方法的访问权限只能是public。
当一个子类覆写了一个父类方法的时候,子类要想调用父类的被覆写过的方法,要在方法前要加上 super 关键字
重载
重载,简单说,就是函数或者方法有相同的名称,可是参数列表不相同的情形,这样的同名不一样参数的函数或者方法之间,互相称之为重载函数或者方法。
关于重载是否是多态这部分,其实有不少人还进行过争论,有人认为他不是面向对象,只是面向方法,违背了最基本要求。
我我的理解,重载是否是多态 关键是你给多态的定义是什么 若是多态的定义是同一事物具备的不一样反应 那重载也算多态 也就是所谓的广义多态 。
具体的代码表现以下,同名的myName方法有4个,在调用的时候咱们只须要传入不一样的参数便可调用相应的方法:
public class MyHouse extends House{
public static void main(String[] args) {
MyHouse mm = new MyHouse();
System.out.println(mm.myName());
}
public String myName()
{
return "myHouse";
}
public String myName(String args)
{
return "myHouse" + args;
}
public String myName(String args,String args1)
{
return "myHouse" + args;
}
public String myName(int i)
{
return "myHouse" + i;
}
}