类
1 继承
继承语法:class 子类 extends 父类
Java中了类不能进行多重继承
eg:子类对象的实例化
public class SubInstantProcess {
public static void main(String [] args)
{
Student s = new Student();
}
}
class Person
{
String name;
int age;
public Person()
{
System.out.println("******父类构造方法:1、public Person()");
}
}
class Student extends Person
{
String school;
public Student()
{
System.out.println("*****子类构造方法:2、public Student()");
}
}
运行结果
结论:
子类对象在实例化时会默认先去调用父类中的无参构造方法,之后再调用本类中的相应构造方法。
在子类Student构造方法的首行相当于默认隐含了一个“super()”语句
class Student extends Person
{
String school;
public Student()
{
super();//隐含了这条语句
System.out.println("*****子类构造方法:2、public Student()");
}
}
** 注意点**
- super()——调用父类方法
- super.name——父类中的属性
- super.talk()——父类中的方法
- 通过private限制子类访问父类中方法、属性
- 重写:重写方法、属性
2 多态
方法的多态性:即是通过传递不同的参数来令同一方法接口实现不同的功能
对象多态性:向上转型和向下转型
- 向上转型:父类对象通过子类对象去实例化,向上转型是不需要进行强制类型转换的;父类储存必须是子类类型
- 向下转型:父类的对象可以转换为子类对象,必须要进行强制的类型转换
继承与多态区别:
父类对象依据被赋值的每个子类对象的类型;
继承是子类使用父类的方法,而多态则是父类使用子类的方法。
多态是父类使用被子类覆盖的同名方法,如果子类的方法是全新的,父类不存在同名的方法,则父类也不能使用子类自己独有的“个性化”方法。
static关键词可以避免多态的产生
接口
1 抽象类
**语法:**abstract class 类名称{}
规则:
⑴ 抽象类和抽象方法都必须用abstract关键字来修饰;
⑵ 抽象类不能直接实例化,也就是不能直接用new关键字去产生对象;
⑶ 抽象类定义时抽象方法只需声明,而不需实现;
⑷ 含有抽象方法的类必须被声明为抽象类,抽象类的子类必须 重写所有的抽象方法后才能被实例化,否则这个子类还是个抽象类。
注意点
⑴ 抽象类中可以有构造方法。
在抽象类中也可以拥有构造方法,但是这些构造方法必须在子类中被调用,并且子类实例化对象的时候依然满足类继承的关系,先默认调用父类的构造方法,而后再调用子类的构造方法,毕竟抽象类之中还是存在属性的
⑵ 抽象类不能够使用final定义。使用final定义的类不能有子类,而抽象类使用的时候必须有子类,这是一个矛盾的问题,所以抽象类上不能出现final定义。
⑶ 在外部抽象类上无法使用static声明,但是内部抽象类却可以使用static定义,使用static定义的内部抽象类就表示一个外部类。
⑷ 抽象类不能用关键字new实例化。
编程时可以将类中的公共方法放在抽象类中进行调用。
2 接口
语法: interface 接口名称{}
原则:
(1)接口必须有子类,子类依靠implements关键字可以同时实现多个接口;
(2)接口的子类(如果不是抽象类)则必须覆写接口之中的全部抽象方法;
(3)接口可以利用对象多态性,利用子类实现对象的实例化。
(4)接口与一般类一样,本身也具有数据成员与方法,但数据成员一定要赋初值,且此值不能再更改,方法也必须是“抽象方法”或default方法。也正因为方法除default方法外必须是抽象方法,而没有一般的方法,所以接口定义格式中,抽象方法声明的关键字abstract是可以省略的。
eg:子类继承多个接口的应用
public class InterfaceDemo {
public static void main(String[] args)
{
X x = new X();//实例化子类对象
// A a = x;
// B b = x;
// a.print();
// b.get();
x.print();
x.get();
}
}
interface A{
public static final String INFO = "Hello World.";//全局变量
// public abstract
void print();
}
interface B
{
void get();
}
class X implements A,B //继承多个接口
{
public void print()
{
System.out.println(INFO);
}
public void get()
{
System.out.println("你好");
}
}
运行结果:
将注释去掉运行还是一样的
一个类实现两个或多个接口,但多个接口中的方法不能同名;
接口是标准,所谓的标准,指的是各方共同遵守的一个守则。只要操作标准统一了,所有的参与者才可以按照统一的规则操作。
接口的作用——工厂设计模式(Factory)
抽象类和接口对比
抽象类和接口共同点:
⑴ 都是抽象类型;
⑵ 都可以有实现方法(以前接口不行);
⑶ 都可以不需要实现类或者继承者去实现所有方法。(以前不行,现在接口中默认方法不需要实现者实现)
抽象类和接口不同点:
⑴ 抽象类不可以多重继承,接口可以(无论是多重类型继承还是多重行为继承);
⑵ 抽象类和接口所反映出的设计理念不同。其实抽象类表示的是"is-a"关系,接口表示的是"like-a"关系;
⑶ 接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值;抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。