1:继承
1:继承用关键字extends,子类继承父类所有的方法和变量并可以直接调用
2:如果子类有重名方法(重写)和变量,那如果调用,优先使用子类自己的
3:对于变量父类成员变量,子类成员变量,子类局部变量,可以用this.变量和super.变量进行区分
4:方法的重写,方法名称一样,参数也一样(返回值类型和父亲一样)
//子类方法的返回值范围必须要小于等于父类的返回值范围
为了方便区分,用@Override标注一下
重载:方法名称一样,参数的个数或者类型或者不同类型的顺序不一样。
5:子类构造方法的第一行,如果不写,系统默认有一个super(),调用父类的无参构造
6:如果父类有多个构造,子类可以通过super调用其中任何一个
7:super必须在子类构造的第一句,仅有一个
8:同理:子类的构造方法调自己的另一个构造,用this()
如果子类的一个构造方法,调自己的另一个构造方法的话,那么此构造方法不再赠送super()
示例代码:
public class Fu {
public String name="fu";
public int age=45;
public void outName()
{
System.out.println("爸爸的名字:"+name);
}
public void outAge()
{
System.out.println("爸爸的年龄:"+age);
}
}
public class Zi extends Fu {
zi(){
super();
}
public int age = 15;
public void outAge() {
System.out.println("儿子的:" + age);
}
}
2:抽象类
1:抽象方法:abstarct修饰,无方法体
2:抽象类:也是abstract修饰,抽象类不可以直接new对象,有抽象方法的类一定是抽象类
但是抽象类不一定有抽象方法
3:子类如果继承抽象类,实现了父类所有的抽象方法,就成了普通类
如果没有全都实现,子类还是一个抽象类
4:抽象类一样可以有构造方法,并且如果子类继承的话,super中也会执行
3:接口
接口不能直接使用,必须有一个实现类来实现其所有的抽象方法,如果不全部实现,则实现类为抽象类。
注意,接口没有静态代码块和构造方法
* 1:接口中的抽象方法,修饰符必须是固定的 public abstract
* 2:由于是固定的public abstarct 可任意一个或者多个省略
* 3:接口中可以包含的内容:
* java7:变量(常量),抽象方法
说是变量,其实默认用public static final修饰,修饰符可省略,功能也就是个常量
* java8:比7多了默认方法和静态方法
* 默认方法可以被实现类直接调用或者是覆盖重写,解决了抽象类升级的问题
* 静态方法只能接口名称调用,不能实现类调用(跟类的静态方法有区别,因为单继承,多接口)
* java9:比8多了私有方法
* 普通私有:解决多个默认方法之间重复代码问题
* 静态私有:解决多个静态方法之间重复代码问题
*4:实现多个接口:
如果多个接口中抽象方法重名,只实现一个就行
如果多个接口中默认方法重名,则必须覆盖重写解决冲突
* 5:继承父类同同时实现接口:继承优先级高于接口实现
如果父类和接口的默认方法重名,则优先使用父类的
示例代码(接口定义):
public interface myInterface {
public abstract void test1();
public void test2();
void test3();
//静态方法
public static void statest1(){
System.out.println("接口的静态方法");
}
//变量
public static final int i=10;
//默认方法 1
public default void detest1()
{
System.out.println("接口的默认方法1");
}
//默认方法 2
public default void detest2()
{
System.out.println("接口的默认方法2");
}
//私有方法,供默认方法调用,外部不能用,java9及以上才行,本计是8,
//暂时不能用
// private void pritest1(){
// System.out.println("接口的私有方法");
// }
}
示例代码(实现接口):
public class myClassimplinter implements myInterface {
@Override
public void detest2(){
System.out.println("实现类的覆盖默认方法");
}
@Override
public void test1() {
System.out.println("test1");
}
@Override
public void test2() {
System.out.println("test2");
}
@Override
public void test3() {
System.out.println("test3");
}
}