2022-07-26 第二组 刘禹彤 学习笔记
打卡第16天
今天继续学习面向对象
###学习内容:
1.面向对象特征:抽象
- Java中除了类,还有抽象类和接口
- 抽象方法,没有大括号----没有方法体
- 抽象方法存在的意义是什么?
根本意义:约定
- 抽象方法到底约定了什么,规定了什么,定了那些规则?
1.约定了返回值,访问权限,参数列表,需要在重写的时候去定义方法体
2.约定大于配置,配置大于编码
- 抽象方法必须在一个抽象类里
1.当我们定义了一个抽象类这个抽象类中可以有哪些结构
属性,成员方法,构造器,抽象方法,常量
2.抽象类中可以没有抽象方法
3.抽象类是不能被实例化的----抽象类不能创建对象
4.抽象类的构造器存在的意义:为了约定子类的构造器必须和父类相匹配
5.一个类如果继承了一个抽象类,就必须重写这个抽象类的抽象方法
- abstract能修饰什么?
类,方法
- 抽象方法能不能用private修饰:不能,开发中,抽象方法基本上都是public
抽象方法能不能用final修饰?不能,用final修饰的方法不允许重写,抽象方法必须让子类重写d
抽象类能不能用final修饰?不能,用final修饰的类不能被继承,抽象方类必须让子类继承
总结:1.抽象方法必须是public或者protected(因为如果是private,不能被子类继承,子类便无法实现该方法)
默认情况是可以的(默认情况其实就是public)
2.抽象类不能被直接实例化,需要依靠子类采用向上转型方式处理
3.抽象类必须有子类,使用extends继承,一个类只能继承一个抽象类
4.子类(如果不是抽象类),则必须重写抽象类中的所有抽象方法
如果子类没有实现父类的抽象方法,必须将子类也定义成abstract
2.接口
- 比抽象类更高级的抽象, 抽象类也是比类更高级的抽象
- 声明:使用interface关键字,public interface Ch02
(JDK1.7之前)接口中只能定义抽象方法,不能有属性,不能有方法
(静态常量)
(JDK8及以后)接口中只能定义抽象方法,不能有属性,可以有默认方法和静态方法
静态常量
(JDK7---JDK8):默认方法,静态方法
- 接口中结构的特点:接口中的抽象方法默认是public abstract,推荐省略
接口中的常量默认是public static final,推荐省略
- 接口中的结构必须是public
- 接口可以被实现,实现类
比如说A类implements 接口,那我们就说A是这个接口的实现类
如果一个类实现了一个接口,他就需要重写接口中的所有抽象方法
实现接口是可以多实现的,继承只能单继承
开发中,如果一件事情可以通过继承和实现接口来解决问题,接口解决
面试题: 1.继承抽象类和实现接口的异同 同:都需要重写所有的抽象方法 异:实现接口是可以多实现的,继承只能单继承
2.在java中是否只有单继承? 不是 在java中是存在多继承的,发生在接口之间 java类与类之间只有单继承
- 接口存在的意义:约定
面向接口编程
面向切面编程
面向对象编程
3.栈和队列
栈和队列是两种操作受限的线性表
这种受限表现在:
栈的插入和删除只允许在表的尾端进行(在栈中叫做”栈顶“,满足FILO
First In Last Out
队列只允许在表尾插入元素,在表头删除元素:FIFO First In First Out
- 栈和队列的相同点:
1.都是线性结构
2.插入操作都是在表尾进行
3.都可以通过顺序结构和链式结构实现
- 栈和队列的不同点:
1.队列:先进先出 栈:先进后出
###学习心得:
今天学习了面向对象最后一个特征:抽象,还学习了接口,栈,队列,上课基本可以跟上,不过做案例有点吃力
###掌握程度:一般
###练习:
public abstract class Animal { private String name; private Integer age; public Animal() { } public Animal(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } //抽象方法,没有大括号----没有方法体 //抽象方法存在的意义是什么? //根本意义:约定 //抽象方法到底约定了什么,规定了什么,定了那些规则? //约定了返回值,访问权限,参数列表,需要在重写的时候去定义方法体 //约定大于配置,配置大于编码 public abstract void eat(); public abstract void show(); }
package a; public abstract class Animal_Son extends Animal{ }
package a; public class Person extends Animal{ public void eat(){ System.out.println("人在吃饭。。"); } public void drank(){ System.out.println("人在喝水"); } @Override public void show() { System.out.println("haha"); } }
public class Ch01 { public static void main(String[] args) { // Animal animal = new Animal();不行 Animal animal = new Person(); } }
###运行结果: