回顾:
1.构造:
定义:也就是在初始化的时候给成员属性赋值的一种方法;
语法:
public 类名(参数1,参数2){
this.成员变量 1= 参数1
this.成员变量2=参数2
}
2.重载与重写:
重载: 在同一个类里,方法名相同,参数列表或者是参数的类型不同,与返回值无关
重写:继承关系中, 方法名相同 , 参数的个数 或者参数的类型都相同
3.继承
继承的关键字是extends,调用父类的属性方法和构造使用super关键字,调用本类的属性方法和构造使用this关键字。同时继承需要满足is- a的关系。
一、抽象类
抽象类的意思就是抽取公共的属性或者方法
抽象的关键字是abstract
语法:
public abstract 类名{
抽象类内容
}
抽象类和普通类的区别
1.抽象类必须使用abstract关键字来修饰;
2.抽象类不能被实例化;
抽象方法和普通方法的区别
1.抽象方法也是使用abstract关键字来修饰;
2.抽象方法没有方法体,因此所有抽象类的子类都必须重写该抽象类的方法;
二、多态
多态 : 按字面的意思就是“多种状态”。
在面向对象语言中,接口的多种不同的实现方式即为多态。
多态使用的条件:
1.多态必须在继承的前提下
2.多态里一般都会方法重写
多态的语法:
父类的对象 对象名称 = new 子类的对象();
// 父类的对象引用执行之类对象的引用 (向上自动转型)
多态里成员变量的获取:
在多态里, 编译看左边, 赋值看左边
public class Test {
public static void main(String[] args) {
Fu fu=new Zi(); //该运行结果为Fu类的age
System.out.println(fu.age);
}
在多态里方法是如何获取:
在多态里,编译看左边 ,运行看右边
多态的向上转型的语法:
父类 对象名称 = new 子类() 类似于 向上自动类型转换
ps:Pet pet = new Dog()
缺点: 不能调用子类独有的方法
向下进行转换(还原成原来)语法:
子类 子类名称= 子类 (子类向上转型的对象名)
ps:Dog dog =(Dog)pet
如果还原不正确会产生一个错误: 强制类型转换异常 java.lang.ClassCastException
instanceof
判断是否能够还原成功 ,instanceof 在强制类转换之前, 判断是否能够还原成功,假如还原成功,则返回true,假如还原不成功,则返回false。
if(pet instanceof Penguin){
// 再进行向下转型
Penguin penguin =(Penguin) pet;
penguin.eat();
penguin.swimming();
System.out.println("是企鹅");
}else if(pet instanceof Dog){
System.out.println("是狗");
Dog dog = (Dog) pet;
dog.eat();
dog.shut();
}
多态的两种体现形式:
第一种是以父类作为参数, 第二种是以父类作为返回值
三、接口
一些规范 , 定义一些方法.
如何来定义一个接口
1.interface:接口的关键字
接口的语法 :
public interface 接口的名称{
}
2.implements :实现接口的关键字
public class UsbIter implements Iter {
}
注意点:
1.接口里的方法都是抽象方法
2. 接口编译后也是一个class 文件
3. 实现类必须实现接口里所有的方法(重写所有方法)
4. 接口不能够被实例化, 只能实例化实现类(原因:接口实际上是一个抽象类)
开发中最常见的三种赋值方法:
1.通过传递父类参数
2.set方法
3.通过构造方法进行赋值
接口的意义:是为了解决java 中的单继承问题!
因此,在java中能够实现一个实现类实现多个接口(对比一个子类不能继承多个父类),俗话一点,父类是爸爸,接口是干爹。
实现多个接口的语法:
implements 接口1,接口2 ( implements Pager,Link )
在接口里,不能有变量 ,只能有常量,因此会给常量默认加上一个 public static final
接口里的方法: 接口里的方法都是抽象方法, 系统默认会加上 public abstract,不可以有普通方法
接口没有构造方法: 实现类都是干爹, 只存在一个爸爸(Object)
疑问
1.在多态中,方法的编译看左,运行看右是怎么理解的?
2.在接口里面的抽象方法假如是静态的,实现类照样能够实现吗?