Java面向对象视频教程全集-璇女神主讲【课工场】

循环(do while )

这里的空指针异常是因为我创建了一个新的数组,也规定了这个数组的长度,但是数组里面的每个下标我都没有放进去对象,然后就对着空对象进行直接的属性改变/虽然系统不报错,但是运行的时候就会有错误,以后遇到这种情况必须要先给数组创建对象
方法的命名要遵循驼峰命名规则(首个单词小写,之后每个单词的首字母都大写)
构造方法没有返回值。构造方法名字和类名一样
构造方法类似与给创建的元素进行初始化。
系统默认提供无参(所以我们创建对象的时候可以直接调用无参的构造方法)
但是如果我们自定义了有参的构造方法,系统就不在再默认提供无参构造方法!
Student stu = new Student();
这里 就是调用了无参构造方法
创建带参的构造方法就是给元素的进行初始化
public class Student{
String name;
int age;
}
public class Student(String name,int age){
this.name = name;
this.age = age; / / 这里就引申出了this的用法
}
this是对一个对象的默认引用
可以调用本类的属性 this.age=age;
可以调用本类的普通方法 this.add();
可以调用本类的构造方法 this(name);
(this调用本类的构造方法,必须是写在第一行)
public class Student(String name,int age){
this.name = name;
this.age = age;
}
//调用本类构造方法
public class Student(String name,int age, int score){
this.(name.this ); //语法注意:使用this必须是构造方法的第一个语句
//调用构造方法Student(String name,int age)
this.score=score;
}
方法重载(同名不同参)
同一个类中,方法名相同,参数个数或者类型不同,与返回值和访问修饰符无关
成员变量和局部变量
作用域不同:
属性:成员变量(全局变量)
局部变量:作用域是一个方法或者一个语句块
初始值不同:
JAVA会给成员变量一个初始值
java不会给局部变量一个初始值,局部变量必须初始化赋值以后使用
(同一个类中,成员变量和局部变量同名时,局部变量具有更高的优先级)
带参方法如何定义和使用?
基本数据类型和引用数据类型在参数传递时的区别是什么?
构造方法有何作用?如何定义?
方法重载有何特点?
成员变量和局部变量的区别?
封装与继承
何为封装:把类的某些信息隐藏起来,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。属性私有,方法公开。
两大原则:1.把所有属性藏起来
2.把尽可能多的东西藏起来,对外提供便捷的接口。
如何实现封装:
1.修改属性的可见性:设为private,防止错误的修改
2.创建共有的getter/setter方法(getter是属性的读取/setter是属性的赋值和操作)
3.在getter/setter加入属性控制语句
封装的好处:
1.便于使用者正确使用系统,防止程序修改属性
2.有助于系统之间的松耦合,提高系统独立性
3.提高软件的可重用性
4.降低了构建大型项目的风险
包
1.包名由小写字母组成,不能以圆点开头或结尾
2.包名之前最好加上唯一的前缀,通常使用组织倒置的网络
3.包名后续部分依不同机构内部规范而不同
书写规范:
package只能有一句(必须放在第一句)
import可以有多句
紧接着是类的声明
访问权限控制修饰符:
同包的测试类及可以访问public修饰的类,也可以访问默认修饰符修饰的类
不同包的测试类及只可以访问public修饰的类,不可以访问默认修饰符修饰的类
public:公有访问级别
默认修饰符:包级私有访问级别
类的访问修饰符有两种
类成员的访问修饰符由四种
作用域 当前类 同一package 子孙类 其他
public √ √ √ √
protected √ √ √ ×
friendly默认 √ √ × ×
private √ × × ×
static修饰符可以修饰:
*成员变量
静态变量,可以直接通过类名访问
*成员方法
静态方法,可以直接通过类名访问
*代码块
静态代码块,当Java虚拟机加载类时,就会执行该代码块(只调用一次)
继承
类图中的三角符号代表继承

子类和父类满足 is-a 的关系才能使用继承.继承是实现代码重用的重要手段之一,java中只支持单根继承
子类无法继承父类的private成员
同包的子类父类默认修饰符可以访问,不同包则不可以
子类可以继承父类的protected成员,不管是不是同包
子类继承了包的public,protected修饰的属性和方法(不管是否同包)。继承了默认访问修饰符修饰的属性和方法(必须同包)。
编写父类:
【访问修饰符】class Pet{
//公共的属性和方法
}
编写子类:
【访问修饰符】class Dog extends Pet{
//子类特有的属性和方法
}
实现封装的步骤是什么?
如何床架和引用包?
常用的访问权限控制符有哪些?
static在java中的应用场景以及使用注意事项是什么?
继承有何好处?
如何实现继承?
子类能(不能)继承父类的什么?
方法重写和多态
父类:提供共性方法
方法的重写或者方法的覆盖 (overriding)
子类根据需求对父类继承的方法进行重新编写
重写是,可以用super.的方式来保留父类的方法
构造方法不可以被重写
super介绍(super访问父类成员)
访问父类方法 super.print();
访问父类属性 super.name;
访问父类构造方法 super(); super(name,health,love);
使用super关键句字,super代表父类对象
super只能出现在子类的方法和构造方法中
super使用构造方法时,只能放在第一句
super不可以调用父类的private属性
调用父类的父类就用super就好
super使用场景:
子类调用父类方法
可以使用super调用子类覆盖掉的父类的同名成员

继承条件下构造方法的调用规则:
*子类构造方法没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法:系统默认调用父类的无参构造方法
*子类构造方法通过super显式调用父类的有参构造方法:执行父类相应的构造方法,而不执行父类的无参构造方法
*子类构造方法通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则
方法重写规则:
*方法名相同
*参数类型相同
*返回值类型相同或者是其子类
*访问权限不可以严于父类
*父类的静态方法不能被子类覆盖为非静态方法,谷类的非静态方法不能被子类覆盖为静态方法
*子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(静态方法无法使用super)
*不能抛出比父类方法更多的异常
静态方法可以直接通过类名去调用。

方法重载是同一类中同名不同参
方法重写是父子类中同名同参
Object类
是所有类的直接或者间接父类

Object类的equals()方法
比较两个对象是否为同一个对象,是则返回true
操作符:==
简单数据类型,直接比较值:如1==2
在Object类的equals方法与==没有区别
比较两者(引用类型)是否为同一对象:==或equals都可以判断
重写Object类的方法
重写equals方法原因是:当有特殊需求的时候,比如在实际生活应用当中,认为属性相同就是同一对象时,就需要重写equals方法
重写方法的快捷操作:Alt+Shift+s调出界面


可以重写的父类方法

instanceof运算符:用来判断某个对象是否为某种类型--- 对象名 instanceof 类型名

这里的student s = (student)obj;强制转换是因为如果不强制转换点不出来.num 和 .name



instanceof 用于判断一个引用类型所引用的对象是否是一个类的实例
java.lang.String 重写了equals()方法,把equals()方法的判断变成了判断其值。也重写了toString()方法

//重写toString():对象信息不要反悔类似内存地址的信息,而是返回学生姓名给我。
@Override
public String toString() {
return this.name;
}
多态(动态绑定)
为什么使用多态?
掌握什么是多态?
多态:同一个引用类型,使用不同的实例而执行不同的操作。
父类类型指向子类对象:
Pet dog = new Dog();

继承和方法重写是实现多态的基础
多态:同一个引用类型,使用不同的实例而执行不同的操作
继承和方法重写是实现多态的基础
应用:父类引用指向子类对象
抽象类和抽象方法

抽象类不能被实例化,实例化没有任何实际意义。不可以直接new抽象类,但是可以new子类
例如不可以:Pet p = new Pet();
但是可以: Pet p = new Dog();
有抽象方法的类一定是抽象类
抽象类中不一定要有抽象方法
一个抽象类里面的抽象方法必须被子类实现,除非子类也是抽象类。
向上转型和向下转型
如何实现向上转型
如何实现向下转型
熟练掌握instanceof的使用
向上转型:父类的引用指向子类对象,自动进行类型转换
<父类型> <引用变量名> = new <子类型>();
Pet pet = new Dog();
此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法。
此时通过父类引用变量无法调用那个子类特有的方法。
使用向上转型以后无法调用子类的独有方法时,可使用向下转型
向下转型:如果没有转换为真实的子类类型,此时会引发ClassCastException
java提供了instanceof运算符来进行类型的判断,可以避免向下转型时的异常


多态的两种使用方式:
*使用父类作为方法的形参:是java中实现和使用多态的主要方式
*使用父类作为方法的返回值,也是java实现和使用多态的主要方式

多态:根据具体的动物子类,调用其重写后的shout。






方法重写的规则是什么?
super的作用是什么?
继承下构造方法是如何执行的?
Object类有奶爸写方法常被子类重写?
如何实现多态?
多态有哪两种常用的应用方式?
抽象类和接口:
抽象类和普通类的区别:
抽象类不可以被实例化。但是可以创建 一个引用变量,其类型是一个抽象类,指向非抽象的子类实例
抽象类里可以有非抽象的构造方法,创建子类时

构造方法就是创建对象以后进行初始化
子类创建对象时,先调用父类的构造方法,在调用子类的构造方法



抽象方法vs普通方法
*有无方法体
接口
概念性的接口:指系统对外提供的所有服务
interface定义的实实在在的接口
[访问修饰符] interface 接口名称 [extends 其他的接口名]{
//声明变量
//声明方法
}

接口不可以有构造方法。抽象类虽然不可以实例化,但是可以有构造方法,因为构造方法可以让子类实现父类构造方法的复用。
接口可以被当作类型使用:
实现类必须实现接口中的全部抽象方法,除非实现类也是一个抽象类。如果子类中有方法(接口中的抽象方法)没有实现,那么这个方法在子类中也定义为抽象类,子类变成抽象类。


虽然接口不是父类。但这种写法也是对的:父类引用指向子类对象

方法的分类:普通方法 抽象方法(abstract) 静态方法(static) 默认方法(default)
默认方法可以被继承,通过实例调用





先继承再实现
为什么jdk8以后新增接口特性??


is a 使用继承关系
has a 使用接口
抽象类和接口 异同:
*相同点:
代表系统的抽象层
都不能被实例化
都能包含抽象方法(用于描述系统提供的服务,不必提供具体实现)
*不同点:
在抽象类中可以为部分普通方法提供默认实现。JDK8之前接口中只能包含抽象方法,JDK8之后接口就可以包含默认方法了
一个类只能继承一个直接的父类,但可以实现多个接口
使用原则:

接口的好处:
提高了程序的可维护性和可拓展性
提高了程序的规范性
提高了程序的安全性

接口代表着一种 能力 约定 标准


何时声明全局静态常量:公用的,含义确定的,值也不变的
面向对象设计原则:
多用接口,少用继承()
针对接口编程
针对拓展开放,针对改变关闭