第一章.抽象

1.抽象的介绍
java
1.抽象类怎么形成:
在父类中的方法无法做具体实现,需要延伸到子类中做具体实现
此时该方法定义成抽象方法,抽象方法所在的类一定是抽象类
2.抽象类定义: abstract
public abstract class 类名{}
3.抽象方法定义: abstract
权限修饰符 abstract 返回值类型 方法名(形参);
4.使用:
a.定义子类,继承抽象父类
b.重写抽象方法,做具体实现
c.创建子类对象(抽象类不能new对象),调用重写的方法
5.问题:
继承是为了少写代码,后来我们继承完之后又设计了一个抽象父类
我们还得必须重写里面的抽象方法,好像我们并没有少写代码,那为啥还要用抽象呢?
可以将抽象类的抽取看成是一类事物的"标准",只要是属于这一类的,必须拥有这些功能,怎么拥有呢?重写,至于具体怎么实现,重写之后自己去实现
6.抽象是代码的一种设计思想,可用可不用,我们后面自己开发的时候
基本上碰不上自己定义抽象类,抽象类都是底层的继承体系的顶级父类
java
public abstract class Animal {
public abstract void eat();
public abstract void drink();
}
java
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃屎");
}
@Override
public void drink() {
System.out.println("狗用舌头卷着喝水");
}
}
java
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
@Override
public void drink() {
System.out.println("舔水喝");
}
}
java
public class Test01 {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat();
dog.drink();
System.out.println("===================");
Cat cat = new Cat();
cat.eat();
cat.drink();
}
}
2.抽象的注意事项
java
1.抽象类不能直接new对象,只能创建非抽象子类的对象
2.抽象类中,可以有构造方法,是供子类创建对象时,初始化父类中属性使用的
3.抽象类中可以有成员变量,构造,成员方法
4.抽象类中不一定非得有抽象方法,但是有抽象方法的类一定是抽象类
5.抽象类的子类,必须重写父类中的所有抽象方法,否则,编译无法通过.除非该子类也是抽象类
java
public abstract class Employee {
private String name;
private int age;
public Employee() {
}
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public abstract void work();
}
java
public class Teacher extends Employee{
public Teacher() {
}
public Teacher(String name, int age) {
super(name, age);
}
@Override
public void work() {
System.out.println("涛哥在讲课");
}
}
java
public class Test01 {
public static void main(String[] args) {
Teacher t1 = new Teacher("涛哥", 18);
System.out.println(t1.getName()+"..."+t1.getAge());
t1.work();//重写的
}
}
第三章.接口
1.接口的介绍

2.接口的定义以及使用
java
1.接口:一种标准,一种规范
2.定义接口:
public interface 接口名{}
3.实现:定义实现类实现接口
public class 实现类类名 implements 接口名{}
4.使用:
a.创建实现类实现接口
b.重写抽象方法
c.创建实现类对象(接口不能new对象的),调用重写的方法
5.成员:
a.jdk8之前:
抽象方法:固定public abstract开头,不写也有
成员变量:固定public static final开头,不写也有
b.jdk8开始:
默认方法:public default 返回值类型 方法名(形参){
方法体
return 结果
}
静态方法:和之前的带static的方法一样
c.jdk9:
私有方法,将public 改成private
java
public interface USB {
public abstract void open();
public abstract void close();
}
java
public class Mouse implements USB{
@Override
public void open() {
System.out.println("鼠标打开了");
}
@Override
public void close() {
System.out.println("鼠标关闭了");
}
}
java
public class KeyBoard implements USB{
@Override
public void open() {
System.out.println("键盘打开");
}
@Override
public void close() {
System.out.println("键盘关闭");
}
}
java
public class Test01 {
public static void main(String[] args) {
Mouse mouse = new Mouse();
mouse.open();
mouse.close();
KeyBoard keyBoard = new KeyBoard();
keyBoard.open();
keyBoard.close();
}
}
3.接口中的成员
3.1抽象方法
java
1.格式:
public abstract 返回值类型 方法名(形参);
2.特点:
不写public abstract 默认也有
3.使用:
通过实现类的重写去使用
java
public interface USB {
public abstract void open();
String close(String name);
}
java
public class Mouse implements USB{
@Override
public void open() {
System.out.println("鼠标打开了");
}
@Override
public String close(String name) {
return name+"关闭了";
}
}
java
public class Test01 {
public static void main(String[] args) {
Mouse mouse = new Mouse();
mouse.open();
String result = mouse.close("鼠标");
System.out.println(result);
}
}
3.2默认方法
java
1.格式:
public default 返回值类型 方法名(形参){
方法体
return 结果
}
2.使用:
a.定义实现类实现接口
b.在实现类中可重写可不重写
c.创建实现类对象,调用默认方法
java
public interface USB {
/**
* 默认方法
*/
public default void methodDef(){
System.out.println("默认方法");
}
}
java
public class Mouse implements USB{
/* @Override
public void methodDef(){
System.out.println("重写的默认方法");
}*/
}
java
public class Test01 {
public static void main(String[] args) {
Mouse mouse = new Mouse();
mouse.methodDef();
}
}
3.3静态方法
java
1.格式:
public static 返回值类型 方法名(形参){
方法体
return 结果
}
2.使用:
接口名直接调用
java
public interface USB {
/**
* 静态方法
*/
public static void methodSta(){
System.out.println("静态方法");
}
}
java
public class Test01 {
public static void main(String[] args) {
USB.methodSta();
}
}
默认方法和静态方法的使用有啥意义:
将来我们开发都是面向接口编程-->都是先定义一个接口,这个接口相当于是"功能的大集合",接口中定义的都是我们要实现的功能,然后在具体的实现类中实现,但是如果我们要临时加一个小功能,这个小功能不需要几行代码,此时我们就没必要在接口中定义抽象方法了,再去实现类中实现了,所以我们就可以在接口中直接定义默认方法或者静态方法,在接口中直接实现了就完事了!
3.4.成员变量
java
1.格式:
public static final 数据类型 变量名 = 值
2.特点:
不写public static final 默认也有
3.注意:
a.接口中的成员变量需要直接手动赋值
b.被public static final修饰的变量,变量名需要全大写(习惯)
java
public interface USB {
public static final int NUM1 = 100;
int NUM2 = 200;
}
java
public class Test01 {
public static void main(String[] args) {
System.out.println(USB.NUM1);
System.out.println(USB.NUM2);
}
}
3.5.私有方法
java
1.格式:
将接口中的静态方法和普通方法的pubilc改成private
java
public interface USB {
private static void methodPri(){
System.out.println("私有的静态方法");
}
public static void methodSta(){
methodPri();
}
}
java
public class Test01 {
public static void main(String[] args) {
USB.methodSta();
}
}
特殊语法: 接口名.super.方法名()
public class 实现类 implements 接口A,接口B{
public void method(){
接口名.super.方法名()
}
}
public interface 接口A{
default void method(){
}
}
public interface 接口B{
default void method(){
}
}
4.接口的特点
java
1.接口可以多继承
pubilc interface A extends 接口B,接口C{}
2.接口可以多实现
public class A implements 接口B,接口C{}
3.一个子类可以继承一个父类的同时实现一个或者多个接口
public class Zi extends Fu implements 接口B,接口C{}
当一个类实现多个接口时,如果接口中的抽象方法有重名且参数一样的,只需要重写一次
javapublic interface InterfaceA { void methodAbs(); }
javapublic interface InterfaceB { void methodAbs(); }
javapublic class InterfaceImpl implements InterfaceA, InterfaceB { @Override public void methodAbs() { } }当一个类实现多个接口时,如果默认方法有重名的,参数一样,默认方法必须要重写一次
javapublic interface InterfaceA { public default void method(){ System.out.println("接口A的默认方法"); } }
javapublic interface InterfaceB { public default void method(){ System.out.println("接口B的默认方法"); } }
javapublic class InterfaceImpl implements InterfaceA, InterfaceB{ @Override public void method() { //特殊语法-> 接口名.super.方法名 InterfaceA.super.method(); } }
5.接口和抽象类的区别
java
相同点:
a.都位于继承的顶端,用于被其他类实现或者继承
b.都不能new
c.都包含抽象方法,其子类都必须重写这些抽象方法
不同点:
a.抽象类:一般作为父类使用,可以有成员变量,构造,成员方法,抽象方法等
b.接口:成员单一,一般抽取接口,抽取的都是方法,是功能的大集合
c.类不能多继承,接口可以
第四章.final关键字
java
1.概述:代表的是最终的,最后的
2.使用:
修饰一个类
修饰一个方法
修饰一个成员变量
修饰一个局部变量
修饰一个对象
3.怎么学final:
知道以上成员被final修饰之后的特点
1.修饰类
java
1.格式:
public final class 类名{}
2.特点:
被final修饰的类,不能被继承
java
public /*final*/ class Animal {
}
java
public class Dog extends Animal{
}
2.修饰方法
java
1.格式:
修饰符 final 返回值类型 方法名(形参){
方法体
return 结果
}
2.特点:
a.被final修饰的方法不能被重写
3.注意:
final和abstract不能连起来使用
java
public /*final*/ class Animal {
public /*final*/ void eat(){
System.out.println("吃吃吃");
}
//public abstract final void drink();
}
java
public class Dog extends Animal{
public void eat(){
System.out.println("狗啃骨头");
}
}
3.修饰成员变量
java
1.格式:
final 数据类型 变量名 = 值
2.特点:
被final修饰的变量,不能二次赋值
java
public class Person {
final String name = "张三";
/*public Person(String name){
this.name = name;
}*/
}
4.修饰局部变量
java
1.格式:
final 数据类型 变量名 = 值
2.特点:
被final修饰的变量,不能二次赋值
java
public class Test01 {
public static void main(String[] args) {
final int i = 10;
//i = 20;
System.out.println(i);
}
}
5.修饰对象
java
1.格式:
final 类名 对象名 = new 类名()
2.特点:
被final修饰的对象地址值不能改变,但是对象的属性值可以改变
java
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
java
public class Test02 {
public static void main(String[] args) {
final Student s1 = new Student("张三", 10);
System.out.println(s1);
//s1 = new Student("李四", 20);
s1.setName("王五");
System.out.println(s1.getName()+"..."+s1.getAge());
}
}

第五章.权限修饰符
java
1.概述:在java中,有四种权限修饰符
public:公共的访问权限,被public修饰的成员在哪里都能使用
protected:受保护的
默认:成员变量和方法前面的权限修饰符啥也不用,不写
private:私有的,只能在本类中使用
| public | protected | 默认 | private | |
|---|---|---|---|---|
| 同类 | yes | yes | yes | yes |
| 同包不同类 | yes | yes | yes | no |
| 不同包子父类 | yes | yes | no | no |
| 不同包非子父类 | yes | no | no | no |
java
如果不考虑特殊情况,我们应该这么使用权限修饰符
1.成员变量 -> 建议用private,封装思想
2.构造方法 -> 建议用public,便于new对象
3.方法 -> 建议用public,便于调用
第六章.多态
java
1.面向对象三大特征: 封装 继承 多态
1.多态的介绍
java
1.前提:
a.必须有子父类继承关系或者接口实现关系
b.必须有方法的重写(没有方法的重写,多态没有任何意义)
c.new对象需要:父类引用指向子类对象 -> Fu fu = new Zi()
2.怎么学多态:不要从字面上来学
a.学多态的前提
b.怎么写代码就是多态了
c.用多态有啥好处
2.多态的基本使用
java
public abstract class Animal {
public abstract void eat();
}
java
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃屎");
}
//子类特有功能
public void lookHome(){
System.out.println("狗看家");
}
}
java
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
//特有方法
public void catchMouse(){
System.out.println("猫抓老鼠");
}
}
java
public class Test01 {
public static void main(String[] args) {
//原始方式
Dog dog = new Dog();
dog.eat();
dog.lookHome();
System.out.println("===================");
Cat cat = new Cat();
cat.eat();
cat.catchMouse();
System.out.println("===================");
//多态方式
Animal animal = new Dog();//好比是double b = 10
animal.eat();
//animal.lookHome();//多态前提下,不能直接调用子类特有功能
Animal animal1 = new Cat();
animal1.eat();
}
}
JAVApublic interface USB { public abstract void open(); public abstract void close(); }
JAVApublic class Mouse implements USB{ @Override public void open() { System.out.println("鼠标打开"); } @Override public void close() { System.out.println("鼠标关闭"); } //特有功能 public void click(){ System.out.println("鼠标点击"); } }
javapublic class Keyboard implements USB{ @Override public void open() { System.out.println("键盘打开"); } @Override public void close() { System.out.println("键盘关闭"); } //特有方法 public void input(){ System.out.println("键盘输入"); } }
javapublic class Test02 { public static void main(String[] args) { USB usb = new Mouse(); usb.open(); usb.close(); //usb.click();//多态前提下不能直接调用子类特有功能 System.out.println("==================="); USB usb1 = new Keyboard(); usb1.open(); usb1.close(); } }
3.多态的条件下成员的访问特点
3.1成员变量
java
public class Fu {
public int num = 10;
}
java
public class Zi extends Fu{
public int num = 100;
}
java
public class Test01 {
public static void main(String[] args) {
Fu fu = new Zi();
System.out.println(fu.num);
}
}
java
看等号左边是谁,先调用谁中的成员变量
3.2成员方法
java
public class Fu {
public int num = 10;
public void show(){
System.out.println("Fu...");
}
}
java
public class Zi extends Fu{
public int num = 100;
public void show(){
System.out.println("Zi...");
}
}
java
public class Test01 {
public static void main(String[] args) {
Fu fu = new Zi();
System.out.println(fu.num);
fu.show();
}
}
java
看new的是谁,先调用谁中的方法,子类没有找父类