Java中的继承
Java中的继承主要是子类继承父类中的一些成员,包括变量和函数,并且使用它们。不能继承父类中私有权限的成员。
Java中写的所有类都是Object类的子孙类,默认继承了Object类。
下面我给出例子
这是父类的代码
public class test {
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public test(){}
public test(int age, String name) {
this.age = age;
this.name = name;
}
//上面的代码是用于赋值和取值的,可以不用关注
public void p1(){
System.out.println("调用的父类方法p1");
}
private int age=10;
public String name="调用父类变量yhb";
}
这是子类的代码(只是继承了父类,没有其他成员)
public class c extends test {
}
Main调用
public class Main {
public static void main(String[] args)
{
new c().p1();
System.out.println(new c().name);
}
}
结果如下所示
可以看到我没有在子类中写任何的东西却能够使用父类中的东西。
需要注意的是私有权限的成员是不能继承的。
Java中子类重写父类的方法
仅在子类中添加一个方法,这个方法重写父类
public class c extends test {
public void p1(){
System.out.println("调用的是子类中的方法");
}
}
结果如下
我们可以看到这里调用的是子类中的p1()方法而不是父类中的p1(),这是因为java中的函数调用是遵循就近原则的,在子类中存在了我们需要的方法了,他就不会往上找父类的这个方法了。
如果执意要使用父类中的成员,可以这样修改你的代码如下所示(在子类中添加super关键字)
public class c extends test {
public void p1(){
super.p1();
System.out.println("调用的是子类中的方法");
}
}
运行的结果如下所示
可以看到这样就成功调用了父类的p1方法,如果是想访问成员变量用类似的方法就是了。
构造顺序
java中是先有的父类的构造再有的子类的构造,先有父亲再有子女很合理吧~~
举例如下所示
父类
public class test {
test(){
System.out.println("我是父类");
}
}
子类
public class c extends test {
c(){
System.out.println("我是子类");
}
}
主函数
public class Main {
public static void main(String[] args)
{
new c();
}
}
结果如下
在类的方法中要访问父类,类内,方法类的相同的成员的方法如下
结果如下
多态
对象、行为多态
创建的父类的对象可以指向其子类(编译看左边,运行看右边)实例代码如下
在运行时,其结果如下
从这里可以看出,运行的时候调用的方法是子类的方法,而编译的时候检查代码是否有问题则是检查在父类中的代码是否有问题。(这就是我们说的编译看左边,运行看右边)
需要注意的是方法(行为)是具有多态的,但是变量是不具备多态的,即如果我们访问的 是一个变量,那么我们还是访问的是原类的(左边类的变量)。
多态的好处
1.方便扩展(解耦合):比如创建了一个人的类,我们通过这个人类可以拓展出学生和老师类等等。在父类写共用功能,子类实现独有的方法。可以将父类当成形参传,例如Object.
2.想用父类调用子类的独有方法可以用强制转换。 (有个instantof的关键字可以用来判断是否要强转,后面可以去了解一下)
fInal
被final修饰的类不能被继承,被修饰的方法被称为最终方法,不能被重写,
被修饰的变量只能被赋值一次。
public final static String SCHOOL_NAME="cqu";//赋值为一个常量,似乎只能在类内使用
抽象类(abstract)
注意
- 抽象类中不一定有抽象方法,但是有抽象方法就要是抽象类。
- 抽象类可以有正常类有的成员(成员变量、方法、构造器)
- 抽象类不能创建对象,作为一个父类使用
- 继承了抽象类就要重写抽象类中的抽象方法
- 在抽象类中抽象方法不用具体实现
适合拿来写模板,方便多态的实现。比如在抽象类中写这样两个方法
运行的结果如下
这样就使用抽象类完成了这个模板的填写
接口(Interface)
告诉我们要实现哪些方法
注意
- 接口中不能有构造器或者代码块(代码块就是前面提到的{})
- 其成员变量是常量,成员方法是抽象方法
- 接口也不能创建对象,感觉和抽象类有点像
- 对接口的使用要用implement
- 类可以实现很多接口,但是只能继承一个类
- 继承的接口有重名的默认方法时要在类中重写这个方法
- 如果继承的不是默认方法的话,就会出现方法签名冲突
- 接口可以多继承接口
- 这里需要注意继承的接口不能是两个接口中有重名的方法,否则会产生冲突
- 接口中可实现抽象方法和常量,在JDK8后可实现静态方法、默认方法以及私有方法,举例如下
public interface a { default void p(){ System.out.println("默认方法"); } static void p1(){ System.out.println("静态方法"); } private void p2(){ System.out.println("私有方法"); } }
ps:我感觉接口和抽象类极其的相似,他相当于是一个父类,然后我们可以通过这个父类指向某个子类来,实现子类中的功能,假设A是一个接口,B是实现了该接口的类,我们可以这样写来用这个对象
A a=new B();
a.p();
这样来使用方法(有点像之前说的编译看左边,运行看右边的感觉吧)
ps:初学java,有哪里不对的地方,欢迎大家批评指正,谢谢~~