今天学习的内容蛮多的,多写代码,多多学习。
继承
继承概述
在Java中,继承是给了子类访问父类的一个权限,也可以说是子类继承了父类非私有的内容。继承用extends后面加上父类就可以了,下面举了简单的例子去看一下
class demo01
{
public static void main(String[] args){
B b = new B();
b.print();
}
}
class A
{
int a = 12;
}
class B extends A
{
public void print(){
System.out.println(a);
}
}
会发现B中没有a这个变量,但是可以进行输出,这就是继承
继承之构造方法
在继承中,构造方法不会被继承,没有继承的,为什么子类还是会走父类的构造呢,构造方法的第一句,有一个隐藏的super();。你不写,系统也会自动加上。
class Demo2
{
public static void main(String[] args)
{
B c = new B();
}
}
class A
{
int c;
public A(){
System.out.println("我是A");
}
public A(int a){
System.out.println("我是A的有参构造");
}
}
class B extends A
{
public B(){
super(100);
System.out.println("我是B");
}
}
继承之成员方法
父类的私有变量是没有办法去继承的,但是非私有的变量可以继承
class Demo02
{
public static void main(String[] args){
B b = new B();
}
}
class A
{
private int a = 4;
}
class B extends A
{
public void pritn(){
System.out.println(a);
}
}
继承之成员方法
其实构造方法就是一种成员方法,咱们可以看出来可以使用父类的成员方法,前提是这个方法是非私有的
方法的重写
方法的重写要求有继承关系,然后一个在父类,一个在子类中。并且方法的声明一模一样,只有方法体的不一样,在这种情况之下,就会执行子类的方法
class Demo02
{
public static void main(String[] args){
B b = new B();
b.print();
}
}
class A
{
public void print(){
System.out.println("a");
}
}
class B extends A
{
public void print(){
System.out.println("b");
}
}
会发现输出的是b
重点:子类的一定要大于或者等于父类
多态
多态概述
多态就是一个类多个状态,也可以说是赋予了父类访问子类的权限,多态的使用格式:父类的类型 变量名 = new 子类的类型();
而且子类中有的方法,父类中也得有,否则会报错
多态成员方法
多态的成员方法咱们来使用代码来进行说明
class Demo6
{
public static void main(String[] args)
{
A a = new B();
a.m();
}
}
class A //父类
{
public void m(){
System.out.println("A");
}
}
class B extends A //子类
{
public void m(){
System.out.println("B");
}
}
会发现执行的是子类的方法
多态成员变量
多态的成员变量也是看代码的执行把
class Demo7
{
public static void main(String[] args)
{
A a = new B();
System.out.println(a.a);
a.m();
}
}
class A //父类
{
int a = 100;
public void m(){
System.out.println("A"+a);
}
}
class B extends A //子类
{
int a = 200;
public void m(){
System.out.println("B"+this.a);
}
}
会发现输出的结果是父类的。这就表示了成员变量应该是父类的
总结
多态的使用条件(缺一不可)
- 有继承关系
- 要有方法重写
- 父类引用指向子类对象
多态的运行结果
- 变量编译看左边,执行看左边
- 方法编译看左边,执行看右边
抽象类
上面写父类的时候就发现了一个问题,父类中是要写方法,但是父类的方法根本用不到,或者说不发进行调用。所以咱们可以把父类写成抽象类。
抽象类要把类前面加上abstract,并且抽象方法也要加abstract。下面举一个例子
abstract class A{
public abstract static void m();
}
这就是定义的抽象类,抽象类中可以有普通的方法。但是有抽象方法的类一定是抽象类。而且抽象类不能实例化,必须要用多态的方式来进行实例化
接口
接口是一种特殊的类,定义格式是:interface 接口名{}
一个类只能继承一个父类,但是可以引用多个接口,引用接口使用implements关键字
接口的成员
- 构造:没有构造器(不能实例化)
- 变量:不能。只能由常量
- 方法:只能是抽象方法