修饰符效果
关系 : 从 近 到 远
修饰词 | 本类 | 同一个包的类(同包能用吗) | 继承类(子类能用吗) | 其他类(导包能用吗) |
---|---|---|---|---|
private | √ | × | × | × |
无(默认) | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
(下面介绍的是比上面修饰符依次多出的范围)
本类访问: run()
同一个包的类: new A().run() 或者 静态: A.run() (相当于不理会导包/继承操作,只认自己的包友)
继承类: run() (导包后继承 相当于拥有那部分代码了 extends 之后相当于本类的了)
其他类:无限用 不需要关系
导包后 new A().run() 或者 静态: A.run()
不导包: 导包相当于缩写
new com.langsin.aa.Son().run();
implements是导包+继承(拥有代码 并重写) 所以需要public
public 导包能用的意义: 我就想用它一个函数 你全继承过来 太大了 所以直接导包用一个最好
导包与继承的区别:
继承可以把父类的方法重写,改为想要的代码,而导包表示引入原本已经写好的程序,但是不能更改包内的内容;
如果这个方法不需要你这个类的对象.那么写成静态的
比如我Collects 里的排序方法
可以给int double排序 并不依赖你的Collects对象 则不需要. 而 getCollectById这种 就需要Collects对象了 那么不能静态.
接口,抽象类都不可以实例化
只要有abstract 函数 一定是接口/抽象类
继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。
new CLASS(); 就是调用构造函数
如果父类构造函数有参,那么子类必须在构造的时候调用父类构造
子类调用父类构造函数的写法: super();
四、默认构造函数 当一个类中没有定义构造函数时,系统会给该类中加一个默认的空参数的构造函数,方便该类初始化。只是该空构造函数是隐藏不见的。
当在该类中自定义了构造函数,默认构造函数就没有了。
如果仍要构造函数,需要在类中手动添加。
1.接口是没有静态代码块或者构造方法的。
当一个类中包含一个或多个抽象函数时,则当前类必须申明成抽象类
(如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类就必须是一个抽象类。)
抽象类不能被实例化
只是对接口进行了进一步描述
可以有属性, 可以有函数
抽象类可以有普通函数和变量,而接口中只能存在public abstract 方法;
继承
重写
父类引用指向子类对象:Parent p = new Child();
用法: a instanceof A
作用: 多态之后可以通过强转会子类后{ Cat c = (Cat) a} ,c.run() 调用子类 所有函数(不仅仅是重写父类的函数,重写父类的函数可以直接多态a.run)
虚函数的存在是为了多态。
Java 中其实没有虚函数的概念,它的普通函数就相当于 C++ 的虚函数,动态绑定是Java的默认行为。
原文:https://www.cnblogs.com/sky-book/p/14765057.html