访问权限

Java中有三个访问权限修饰符:private、protected以及public,如果不加访问修饰符,表示包级可见。

可以对类或类中的成员(字段以及方法)加上访问修饰符。

  • 类可见表示其他类可以用这个类创建实例对象。
  • 成员可见表示其他类可以用这个类的实例对象访问到该对象;

protected用于修饰成员,表示在继承体系中成员对于子类可见,但是这个访问修饰符对于类没有意义。

设计良好的模块会隐藏所有的实现细节,把它的API与它的实现清晰地隔离开来。模块之间只能通过他们的API进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念被成为信息隐藏或封装。因此访问权限应当尽可能地使每个类或者成员不被外界访问。

如果子类地方法重写了父类地方法,那么子类中该方法地访问级别不允许低于夫类的访问级别。这是为了确保可以使用父类实例的地方都可以使用子类实例,也就是确保满足里氏替换原则。

字段绝不能是公有的,因为这么做的话就失去了对这个字段修改行为的控制,客户端可以对其随意修改。例如下面的例子,AccessExample拥有id共有字段,如果在某个时刻,我们想要使用int去存储id字段,那么就需要去修改所有的客户端代码。

public class AccessExample{
public String id;
}

可以使用公有的getter和setter方法来替换公有字段,这样的话就可以控制对字段的修改行为。

public class AccessExample{
private int id;
public String getId(){
return id + "";
}
public void setId(String id){
this.id = Integer.valueOf(id);
}
}

但是也有例外,如果是包级私有的类或者私有的嵌套类,那么直接暴露成员不会有特别大的影响。

public class AccessWithInnerClassExample{
private class InnerClass{
int x;
}
private AccessWithInnerClassExample(){
innerClass = new InnerClass();
}
public int getValue(){
return innerClass.x;
}
}

抽象类与接口类

1.抽象类

抽象类和抽象方法都使用abstrac关键字进行声明。抽象类一般会包含抽象方法,抽象方法一定位于抽象类中。

抽象类和普通类最大的区别是,抽象列不能被实例化,需要继承抽象类才能实例化其子类。

public abstract classs AbstractClassExample{
protected int x;
private int y;
public abstract void func1();
public void func2(){
System.out.println("func2");
}
}
public class AbstractExtendClassExample extends AbstractClassExample{
@Override
public void func1(){
System.out.println("funct1");
}
}

2.接口

接口是抽象类的延伸,在Java 8之前,他可以看成是一个完全抽象的类,也就是说它不能有任何的方法实现。

从Java 8开始,接口也可以拥有默认的方法实现,这是因为不支持默认方法的接口的维护成本太高了。在Java 8之前,如果一个接口想要添加新的方法,那么要修改所有实现该接口的类。

接口的成员(字段 + 方法)默认都是public的,并且不允许定义为private或者protected。

接口的字段默认都是static和final的。

public interface InterfaceExample{
void func1();
default void func2(){
System.out.println("func2");
}
int x = 123;
}
public class InterfaceImplementExample implements InterfaceExample {
@Overrid
public void func1(){
System.out.println("func1");
}
}

3.比较

  • 从设计层面上看,抽象类提供了一种IS-A关系,那么就必须满足里氏替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种LIKE-A关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有IS-A关系。
  • 从使用上看,一个类可以实现多个接口,但是不能继承多个抽象类。
  • 接口的字段只能是static和final类型的,而抽象类的字段没有这种限制。
  • 接口的成员只能是public的,而抽象类的成员可以有多种访问权限。

4.使用选择

使用接口:

  • 需要让不想关的类都实现一个方法,例如不相关的类都可以实现Compareable接口中的compareTo()方法;
  • 需要使用多重继承。

    使用抽象类:
  • 需要在几个相关的类中共享代码。
  • 需要能控制继承来的成员的访问权限,而不是都为public
  • 需要继承非静态和非常量字段。

    在很多情况下,接口优先于抽象类,因为接口没有抽象类严格的类层次结构要求,可以灵活地为一个类添加行为。并且从Java 8开始,接口也可以有默认地方法实现,使得修改接口的成本也变的很低。

super

  • 访问父类的构造函数:可以使用super()函数访问父类的构造函数,从而委托父类完成一些初始化的工作。
  • 访问父类的成员:如果子类重写了父类的中某个方法的实现,可以通过使用super关键字来引用父类的方法实现。

重写和重载

  • 重写(override)存在于继承体系中,指子类实现了一个父类在方法声明上完全相同的一个方法。子类的返回值类型要等于或者小于父类的返回值;
  • 重载(overload)存在于同一个类中,指一个方法已经存在的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。应该注意的是,返回值不同,其他都是相同不算是重载。

最新文章

  1. yaf框架学习笔记
  2. Matlab中给figure添加图例(legend),标题(title)和颜色(color)
  3. C#不同窗体间通信,数据传递
  4. 关于appstore多语言版本,不可不看!
  5. [转]Oracle Stored Procedures Hello World Examples
  6. ie浏览器css中的行为expression详解
  7. 查询(Query)和标识(Identify)
  8. 快速搭建本地HTTP服务器
  9. Spring ES
  10. Fragment+FragmentActivity出现The specified child already has a parent. You must call removeView() on the child's parent first.
  11. PHP魔术方法实例
  12. 潭州课堂25班:Ph201805201 爬虫基础 第二课 fidder (课堂笔记)
  13. android 平台签名
  14. 给电脑换源 npm 国内镜像 cnpm
  15. Codeforces Div3 #501 A-E(2) F以后补
  16. PTA 7-6 列出连通集(深搜+广搜)
  17. Go常量与运算符
  18. 从头来之【iOS及历史版本特性介绍】
  19. leetcode690
  20. mysql UNION all 实现不对称数据统计

热门文章

  1. I/O输入流基础之FileInputStream
  2. Saslauthd服务实现SMTP发信认证
  3. Vue.js实现登录功能
  4. XSS攻击之窃取Cookie
  5. Basic Linux Privilege Escalation
  6. android 记一次解决键盘遮挡问题
  7. Spinner之下拉多选,监听ID后显示不同Frgment页面
  8. MyBatis学习---整合SpringMVC
  9. Zabbix3.4-RHEL 7.4 X64 YUM联网安装
  10. 基于CAS在.NET中实现SSO单点登录