面向对象的三大特征
封装
什么是封装
- 封装是如何设计对象的属性的方法和属性
封装的原则
- 对象代表什么,就得封装对应的数据,并提供数据相应的行为
如何理解封装思想:找对象,调方法
private关键字
- 是一种修饰符
- 可以修饰成员变量和成员方法
- 被private修饰的成员只有在本类中才能被访问
- 在其他类中使用被private修饰的成员变量,如果要被其他类使用需要提供对应用public修饰的setter和getter方法
当方法变量和局部变量重名时,会触发就近原则,此时要使用成员变量需要使用this修饰
构造方法
-
构造方法也叫构造器,构造函数
-
作用
- 在创建对象时给成员变量进行初始化赋值
-
特点
- 方法名与类名相同,大小写也一致
- 没有返回值类型,连void都没有
- 没有具体的返回值
-
执行时机
- 创建对象的时候由虚拟机调用,不能手动调用
- 如果我们自己没有写构造方法,虚拟机会自动创建一个无参构造方法
- 每创建一次对象就会调用一次构造方法
标准类的制作
-
成员变量
- 使用private修饰
-
构造方法
- 提供一个无参构造方法
- 提供一个有参构造方法
-
成员方法
- 提供每一个成员变量对应的setXxx()方法和getXxx()方法
- 提供一个显示对象信息的show()方法
API
- Application Programing Interface:应用程序编程接口
- Java API就是JDK中提供各种功能的java类
String类
-
String类表示字符串,Java程序中所有的用双引号的字符串,都是String类的对象
-
字符串的特点
- 字符串不可变,他们的值一旦创建就不能被更改
- String的值不可变,但是可以共享
- 字符串效果上市相当于字符数粗(char[])但底层原理是字节数组
-
字符串的比较
-
使用==比较
- 基本数据类型比较数据的值是否相同
- 引用数据类型是比较地址值是否相同
-
使用equals()比较
- 比较其内容是否相同
-
-
常用方法
- charAt()用于输出字符串中的某一个字符
- length()方法 获取字符串长度
- indexOf()方法 传递某个字符,返回在字符串中的某一个一个位置
- subString(int start)方法 默认是取到字符串末尾
- equals()方法 判断字符串内容是否相同,区分大小写
- contains()方法 判断该字符串是否包含传递过来的字符串。
- startsWith()方法 判断字符串是否以传进来的字符串开头。
- endsWith()方法 判断字符串是否以传进来的字符串结尾。
- isEmpty()方法 判断字符串是否为空。
- .toCharArray()方法 将String类型的字符串转化为char字符数组
- valueOf(char[] data)方法 将传递的字符数组,组合成字符串。
- toLowerCase()方法 把字符串转成小写toUpperCase()方法 把字符串转成大写
- comcat()方法 字符串拼接
StringBuilder
-
StringBuilder是一个可变的字符串类,可以把他看成是一个容器,可变是指StringBuilder对象中的内容是可变的
-
常用方法
-
追加
- append()
-
反转
- reverse()
-
String和StringBuilder的相互转换
- 通过toString()可以把StringBuilder转换成String
- 通过构造方法可以把String转换成StringBuilder
ArrayList
-
特点
- 提供一个存储空间可变的存储模型,存储的数据容量可以发生改变
-
ArrayList
- 可调整大小的数组实现
- E是一种特殊的数据类型,泛型
继承
概述
- 集成式面向对象的三大特征之一,可以使得子类具有父类的属性和方法
继承中子类的特点
- 子类可以有父类的内容
- 子类也可以有自己的内容
继承的好处
- 提高了代码的复用性
- 提高了代码的可维护性
弊端
- 继承使得类与类之间产生了关系,类的耦合性增加了,当父类发生变化,子类的实现也不得不发生变化,削弱了子类的独立性
继承中变量的访问
-
当前方法,当前类,当前类的父类
-
this和super
-
this访问当前类的成员变量
- 代表本类对象的引用
-
super访问当前类父类的成员变量
- 代表父类存储空间的标识
-
继承中构造方法的访问特点
-
子类中所有的构造方法都默认会访问父类的无参构造方法
-
原因如下:
- 子类会继承父类中的数据,可能还会使用父类中的数据,所以子类初始化钱,一定要先完成父类数据的初始化
- 每个子类构造方法的第一条语句默认的语句都是super();
-
继承中成员方法的访问特点
-
通过子类对象访问一个方法
- 子类范围内寻找
- 父类范围内寻找
- 都没有找到就报错
-
方法的重写
- 子类中出现了和父类一模一样的方法声明
-
应用场景
- 当子类需要弗父类功能,而功能主体子类有自己特定的内容时,可以重写父类中的方法
-
@override重写的注解,检查重写的重要性
- 父类中的私有内容子类无法继承
- 子类重写父类方法时,其访问权限不能比父类低
-
继承的注意事项
- 一个类不能继承多个类(支持单继承,不支持多继承)
例题
public class Circle {
double radius;
public Circle(){
this.radius=1;
}
public void setRadius(double radius){
this.radius=radius;
}
public double getRadius() {
return radius;
}
double findArea(double radius){
return Math.PI*radius*radius;
}
}
public class Cylinder extends Circle{
double length;
public Cylinder(){
this.length=1;
}
public void setLength(double length) {
this.length = length;
}
public double getLength(){
return length;
}
double findVolume(double length){
return findArea(super.radius)*length;
}
}
public class Test {
public static void main(String[] args) {
Cylinder v=new Cylinder();
//v.setRadius(2);
//v.setLength(2);
System.out.println("半径为:"+v.getRadius());
System.out.println("底面积为:"+v.findArea(v.radius));
System.out.println("圆柱的高为:"+v.getLength());
System.out.println("圆柱的体积为:"+v.findVolume(v.getLength()));
}
}
多态
什么是多态
-
对象的多种形态
- 把子类对象赋值给父类类型的变量
- 多态可以根据传递的对象不同,调用不同的show()方法
多态的前提
- 有继承/实现关系
- 有父类引用对象指向子类对象
- 有方法重写
多态的好处
- 使用父类类型作为参数,可以接受所有的子类对象
- 体现多态的扩展性和便利
多态调用成员的特点
-
变量调用
- 编译看左边,运行也看左边
-
方法调用
- 编译看左边,运行看右边
多态的弊端
- 不能调用子类特有的方法
instanceof
强制类型转换能解决什么问题
- 可以转换成真正的子类类型,从而调用子类固有的的功能
- 转换类型与真是对象不一致会报错
- 转换时用instanceof进行判断