文章目录
一、关于访问修饰符
1.1关于访问修饰符从小到大的顺序依次
private(私有,当前类的内部可见) <defaul(f啥也不写就是包权限,当前包的内部可见,不包含子包,同级目录下可见)< proteced(继承,不同包的有继承关系的类之间可见)< public(当前项目可见)
1.2关于包
1.3包存在的意义是什么
使用包的主要目的是保证类的唯一性.
例如, 你在代码中写了一个 Test 类. 然后你的同事也可能写一个 Test 类. 如果出现两个同名的类, 就会冲突, 导致代码不能编译通过
下面的Test类和上面的Test类是两个完全不同的类
1.4如何导入包中的某个类
但是" . "有时候会存在歧义*
比如util和sql都有date类,编译器不知道该匹配那一个类
遇到这种情况该如何解决?
1.5静态导入(了解即可)
例如:当导入System这个类之后,可以直接out.println(123)
1.6几种常见的系统包
二、继承
2.1定义
很多时候写代码会出现代码冗余的情况该如何解决?
这三个类都具备一个相同的 eat 方法, 而且行为是完全一样的.
这三个类都具备一个相同的 name 属性, 而且意义是完全一样的.
从逻辑上讲, Cat 和 Bird 都是一种 Animal (is - a 语义).
此时我们就可以让 Cat 和 Bird 分别继承 Animal 类, 来达到代码重用的效果
代码如下(示例):
关于代码冗余解决方案:
此时, Animal 这样被继承的类, 我们称为 父类 , 基类 或 超类, 对于像 Cat 和 Bird 这样的类, 我们称为 子类, 派生类
和现实中的儿子继承父亲的财产类似, 子类也会继承父类的字段和方法, 以达到代码重用的效果
2.2继承规则
a.要能使用继承,前提必须满足类之间的is a关系b.—个子类只能使用extends探承—个父类。(单继承)
b.Java中不允许多重继承。extends后面只能跟一个父类,允许多层继承,没法当儿子,可以当孙子。
此时如果Taidi继承了animal相当于也是Dog类的子类
c.子类会继承父类的所有属性和方法,显示继承(public属性和方法可以直接使用)
d.使用 extends 指定父类.
e.子类会继承父类的所有 public 的字段和方法.对于父类的 private 的字段和方法, 子类中是无法访问的.
f.子类的实例中, 也包含着父类的实例. 可以使用 super 关键字得到父类实例的引用
2.3隐式继承(private属性和方法)
子类其实也继承了这个属性和方法,但是无法直接在子类中使用。代码示例如下:
使用get和set的方法解决此类问题。
补充:静态的属性和方法是归于某个类所有,当一个类继承了另一个类,肯定所有静态属性和方法就继承。到底能否直接使用,还是要看权限是不是public权限
三.关于protected访问权限(重点,易错点)
切记:同包下的没有关系的类之间以及不同包的有继承关系的类之间可见的!!!!!(死记!!!!!)
先将animal类中name属性设置为protected属性(下面所有问题基于上图分析)
3.1不在一个包中且不是一个子类无法访问
3.2继承子类可以使用protected属性
但是如果出现以下的情况不可以使用!
person和animal两个类在分别不同的包中,test类和person类在一个包中。虽然person类继承了animal的属性,但是当前是在test这个类中调用。protected指的是不同包的具有继承关系的类的内部可见的。
解决上述问题的办法:将test类移动到父类一个包中,因为name属性是protected,相同的包下,没有继承关系的类可以使用protected。但是子包下是不可以使用的,只可以在同级目录。
3.3练习(重点)
代码示例如下
如果在子类中使用父类引用创建父类对象使用name就不可以,因为已经出了父类。(属于语法,记住即可)
3.4final关键字(重点)
曾经我们学习过 final 关键字, 修饰一个变量或者字段的时候, 表示 常量 (不能修改).
final int a = 10;
a = 20; // 编译出错
final 关键字也能修饰类, 此时表示被修饰的类就不能被继承.
final public class Animal {
...
}
public class Bird extends Animal {
...
}
// 编译出错
Error:(3, 27) java: 无法从最终com.bit.Animal进行继承
我们平时是用的 String 字符串类, 就是用 final 修饰的, 不能被继承
四.super关键字
4.1this关键字用法
4.2 super关键字用法
要产生一个子类对象,就会先产生一个父类对象。比如在主类方法中new一个子类对象时
15年校招笔试题关于继承+构造方法+代码块调用问题
请问输出顺序是什么?
package animal;
public class B {
public B() {
System.out.println("1.B的构造方法---------------");
}
{
System.out.println("2.B的构造块-----------------");
}
static {
System.out