一、封装
1.封装的概述
(1)封装是面向对象的三大特征之一(封装、继承、多态)
(2)面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接擦操作的
2.封装的原则
将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问成员变量private,提供对应的getXxx()方法/setXxx()方法(获取成员变量的值和设置成员变量的值)
3.封装的好处
(1)通过方法来控制成员变量的操作,提高了代码的安全性
(2)把代码用方法进行封装,提高了代码的复用性
4.构造方法
(1)作用:创建对象
(2)功能:完成对象的初始化
(3)格式:修饰符 类名(参数){ } //修饰符一般用public
(4)构造方法的主意事项:
①构造方法的创建
如果没有定义构造方法,系统将给出一个默认的无参数构造方法;
如果定义了构造方法,系统将不再提供默认的构造方法;
②构造方法的重载
如果自定义了带参数构造方法,还要使用无参数构造方法,就必须在写一个无参数构造方法
③推荐使用方式
无论是否使用,都手工书写无参数构造方法
(5)标准类制作
①成员变量
使用private修饰
②构造方法
提供一个无参构造方法
提供一个带多个参数的构造方法
③成员方法
提供每一个成员变量对应的setXxx()/getXxx()
提供一个显示对象信息的show()
④创建对象并为其成员变量赋值的两种方式
无参数构造方法的创建对象后使用setXxx()赋值
使用带参构造方法直接创建带有属性值的对象
(一)API
1.API概述:应用程序编程接口(指的就是jdk中提供的各种功能的Java类)
2.快捷键:ctrl+ait+v
(二)String
1.String的概述:代表字符串;
2.字符串特点:
(1)字符串不可变,它们的值在创建后不能更改
(2)虽然String的值不可改变,但是它们可以被共享
(3)字符串效果相当于字符串数组(char[]),但是底层原理是字节数组(byte[])
3.String常见构造方法
方法名 | 说明 |
---|---|
public String() | 创建一个空白字符串对象,不含有任何内容 |
public String(char[] chs) | 根据字符数组的内容,来创建字符串对象 |
public String(byte[] bys) | 根据字节数组的内容,来创建字符串对象 |
String s = “abc”; | 直接赋值的方式创建字符串对象,内容就是abc |
4.String对象的特点:
5.字符串的比较
(1)使用==作比较
①基本类型:比较的是数据值是否相同
②引用类型:比较的是地址是否相同
(2)字符串是对象,它比较内容是否相同,是通过一个方法来实现的,这个方法叫:equals() 返回的是一个布尔值
①public boolean equals(Object anObject):将此字符串与指定对象进行比较。由于我们比较的是字符串对象,所以参数直接传递一个字符串
6.遍历字符串
(1)需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串
(2)思路:
①键盘录入字符串,用Scanner实现
②遍历字符串,首先能够获取到字符串中的每一个字符
public char charAt( int idex );返回指定索引处的char值,字符串的索引也是从0开始的
③遍历字符串,其次要能够获取到字符串的长度
public int length():返回此字符串的长度
数组的长度:数组名,.length
字符串的长度:字符串对象.length()
④遍历字符串的通用格式
for (int i= 0;i<s.length();i++){
s.charAt(i);//就是指定索引处的字符值
}
7.统计字符次数
(1)需求:键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)
(2)思路:
① 键盘录入一个字符串,用 Scanner 实现
②要统计三种类型的字符个数,需定义三个统计变量,初始值都为0
③遍历字符串,得到每一个字符
④判断该字符属于哪种类型,然后对应类型的统计变量+1
假如ch是一个字符,我要判断它属于大写字母,小写字母,还是数字,直接判断该字符是否在对应的范围即可
大写字母:ch>='A' && ch<='Z'
小写字母: ch>='a' && ch<='z'
数字: ch>='0' && ch<='9'
⑤输出三种类型的字符个数
//遍历字符串,得到每一个字符
for(int i=0; i<line.length(); i++) {
char ch = line.charAt(i);
//判断该字符属于哪种类型,然后对应类型的统计变量+1
if(ch>='A' && ch<='Z') {
bigCount++;
} else if(ch>='a' && ch<='z') {
smallCount++;
} else if(ch>='0' && ch<='9') {
numberCount++;
}
}
方法名 | 说明 |
---|---|
public boolean equals(Object anObject) | 比较字符串的内容,严格区分大小写(用户名和密码) |
public char charAt(int index) | 返回指定索引处的 char 值 |
public int length() | 返回此字符串的长度 |
(三)StringBuilder
1.概述:StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是 StringBuilder 对象中的内容是可变的
2.StringBuilder与String的区别
-
String类:内容是不可变的
-
StringBuilder类:内容是可变的
3.StringBuilder构造方法
-
方法名 说明 public StringBuilder() 创建一个空白可变字符串对象,不含有任何内容 public StringBuilder(String str) 根据字符串的内容,来创建可变字符串对象
4.StringBuilder的添加和反转方法
-
方法名 说明 public StringBuilder append(任意类型) 添加数据,并返回对象本身 public StringBuilder reverse() 返回相反的字符序列
//public StringBuilder append(任意类型):添加数据,并返回对象本身
sb.append("hello").append("world").append("java").append(100);
//public StringBuilder reverse():返回相反的字符序列
sb.reverse();
5.StringBuilder与String的相互转换
-
StringBuilder转换为String
public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String
-
String转换为StringBuilder
public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder
StringBuilder sb = new StringBuilder();
sb.append("hello");
//public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String
String s = sb.toString();
//String 转换为 StringBuilder
String s = "hello";
//public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder
StringBuilder sb = new StringBuilder(s);
6.数组字符串拼接
首先创建一个StringBuilder 的sb对象;
用sb.append接收for循环获得的数组中的元素
最后把结果转换为String类型输出;
Stiring s=sb.toString();
sout(s);
nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。
next()会自动消去有效字符前的空格,只返回输入的字符,不能得到带空格的字符串。
7.键盘录入字符串的反转
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String line = sc.nextLine();
// StringBuilder sb = new StringBuilder(s);
// sb.reverse();
// String ss = sb.toString();
// return ss;
return new StringBuilder(s).reverse().toString();
二、继承
(一)概要
1.继承的概述: 继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法
2.继承格式:public class 子类名 extend 父类名{}
(1)范例:public class Zi extend Fu {}
(2)Fu:是父类,也称为基类、超类
(3)Zi:是子类,也称为派生类
3.继承中子类的特点:
(1)子类可以有父类的内容
(2)子类还可以有自己特有的内容
4.继承的好处:
(1)提高了代码的复用性(多个类中相同的成员可以放到同一个类中)
(2)提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
继承可以让类与类之间产生关系,子父类关系,产生子父类后,子类则可以使用父类中的成员
5.继承的弊端
(1)继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类也不得不跟着改变,消弱了子类的独立性
6.什么时候使用继承
(1)继承体现的关系: is a(什么是什么的一种)
(2)假设法:我有两个类A和B,如果他们满足A是B的一种,或者是B是A的一种,就说明它们存在继承关系,这个时候就可以考虑使用继承来体现,否则就不能滥用继承
(3)例:苹果和水果;(苹果是水果的一种,就可以把水果设为父类,苹果设为子类)
动物和猫(动物为父类,猫为子类);猫和狗就不能使用继承
(二)继承中成员访问特点
1.继承中变量的访问特点
①首先在子类的局部范围查找(使用的方法中 ,形参)
②在子类的成员变量中查找(子类定义的全局变量,实参)
③父类成员范围中找(父类的成员变量)
④如果父类成员变量中不存在就会报错(不考虑父类的父类)
2.super
(1)super关键字的用法和this的用法相似
①this:代表本类中的引用(修饰本类中的成员变量引用)
②super:代表父类存储空间的标识(可以理解为父类对象的引用)(修饰父类中成员变量的引用)
(2)成员变量:
①this.成员变量 - 访问本类成员变量
② super.成员变量-访问父类成员变量
(3)成员方法:
①this.成员方法-访问本类成员方法
②super.成员方法-访问父类成员方法
(4)构造方法:
①this(...)-访问本类构造方法
②super(...)-访问父类构造方法
3.继承中构造方法的特点
(1)注意:子类中所有的构造方法默认都会访问父类中无参的构造方法
子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化,原因在于,每一个子类构造方法的第一条语句默认都是:super()
(2)如果想使用父类中带参构造方法就必须使用:super(参数)显示去调用父类的带参构造方法
super()优先访问父类
4.继承中成员方法的访问特点
(1)通过子类对象访问一个方法
①子类成员范围找
②父类成员范围找
③如果都没有就报错(不考虑父亲的父亲…)
5.super内存图
6.方法的重写
(1)方法重写:子类出现了和父类中一模一样的方法声明(方法名一样,参数列表也必须一样)
(2)方法重写的应用场景:当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容(重写后使用父类中的方法用super.方法名(参数名)使用父类中同名的方法 )
(3)Override注解:用来检测当前的方法,是否是重写的方法,起到【校验】的作用
@Override注解是一个注解;可以帮助我们检查重写方法的方法声明的正确性。
(4)重写的注意事项:
①父类中私有的不能被重写(private声明的)
② 子类方法访问权限不能更低(public > 默认 > 私有)
7.继承的注意事项:
①Java中类只支持单继承,不支持多继承
错误范例:class A extends B, C { }
②Java中类支持多层继承
(三)修饰符
1.包:包就是文件夹,用来管理类文件的
2.包的定义格式:package 包名; (多级包用.分开)
3.导包:类与测试类不在同一个包中,先要进行导包:import 包名.类名; (在测试类中导入需要的类)
4.权限修饰符:
5.状态修饰符:final(最终态),static(静态)
(1)fianl关键字的作用:final代表最终的意思,可以修饰成员方法,成员变量,类
(2)fianl修饰类:该类不能被继承(不能有子类,但是可以有父类)
(3)final修饰方法:该方法不能被重写
(4)final修饰变量:表明该变量是一个常量,不能再次赋值
(5)fianl修饰基本数据类型变量:final 修饰指的是基本类型的数据值不能发生改变
(6)final修饰引用数据类型变量:final 修饰指的是引用类型的地址值不能发生改变,但是地址里面的内容是可以发生改变的
public static void main(String[] args){
final Student s = new Student(23);
s = new Student(24); // 错误
s.setAge(24); // 正确
}
6.static修饰:static关键字是静态的意思,可以修饰【成员方法】,【成员变量】
(1)static修饰的特点:
① 被类的所有对象共享,这也是我们判断是否使用静态关键字的条件
②可以通过类名调用当然,也可以通过对象名调用【推荐使用类名调用】
(2)非静态的成员方法
①能访问静态的成员变量
②能访问非静态的成员变量
③能访问静态的成员方法
④能访问非静态的成员方法
(3)静态的成员方法
①能访问静态的成员变量
②能访问静态的成员方法
-
静态成员方法只能访问静态成员
三、多态
1.多态概述:同一个对象,在不同时刻表现出来的不同形态;
2.多态的前提和体现:
(1)有继承/或实现关系
(2)有方法重写
(3)有父类引用指向子类对象
动物 animal=new 猫();
3.多态中成员访问的特点:
(1)成员变量:编译看左边,执行也看左边
(2)成员方法:编译看左边,执行看右边
原因:方法有重写,变量没有重写
4.多态的好处与弊端
(1)好处:提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作
(2)弊端:不能使用子类的特有成员
5.多态中的转型
(1)向上转型:从子到父,父类引用指向子类对象
(2)向下转型:从父到子,父类引用转为子类对象
6.多态内存图解: