一、封装
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.charAt(i);//就是指定索引处的字符值 } 7.统计字符次数 (1)需求:键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符) (2)思路: ① 键盘录入一个字符串,用 Scanner 实现 ②要统计三种类型的字符个数,需定义三个统计变量,初始值都为0 假如ch是一个字符,我要判断它属于大写字母,小写字母,还是数字,直接判断该字符是否在对应的范围即可 ⑤输出三种类型的字符个数 (三)StringBuilder 1.概述:StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是 StringBuilder 对象中的内容是可变的 2.StringBuilder与String的区别 String类:内容是不可变的 StringBuilder类:内容是可变的 3.StringBuilder构造方法 4.StringBuilder的添加和反转方法 //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(); //public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String //String 转换为 StringBuilder //public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder 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("请输入一个字符串:"); // StringBuilder sb = new StringBuilder(s); 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.继承的好处: (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){ 6.static修饰:static关键字是静态的意思,可以修饰【成员方法】,【成员变量】 (1)static修饰的特点: ① 被类的所有对象共享,这也是我们判断是否使用静态关键字的条件 ②可以通过类名调用当然,也可以通过对象名调用【推荐使用类名调用】 (2)非静态的成员方法 ①能访问静态的成员变量 ②能访问非静态的成员变量 ③能访问静态的成员方法 ④能访问非静态的成员方法 (3)静态的成员方法 ①能访问静态的成员变量 ②能访问静态的成员方法 静态成员方法只能访问静态成员 三、多态 1.多态概述:同一个对象,在不同时刻表现出来的不同形态; 2.多态的前提和体现: (1)有继承/或实现关系 (2)有方法重写 (3)有父类引用指向子类对象 动物 animal=new 猫(); 3.多态中成员访问的特点: (1)成员变量:编译看左边,执行也看左边 (2)成员方法:编译看左边,执行看右边 原因:方法有重写,变量没有重写 4.多态的好处与弊端 (1)好处:提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作 (2)弊端:不能使用子类的特有成员 5.多态中的转型 (1)向上转型:从子到父,父类引用指向子类对象 (2)向下转型:从父到子,父类引用转为子类对象 6.多态内存图解:
③遍历字符串,得到每一个字符
④判断该字符属于哪种类型,然后对应类型的统计变量+1
大写字母:ch>='A' && ch<='Z'
小写字母: ch>='a' && ch<='z'
数字: ch>='0' && ch<='9' //遍历字符串,得到每一个字符
for(int i=0; i
方法名
说明
public boolean equals(Object anObject)
比较字符串的内容,严格区分大小写(用户名和密码)
public char charAt(int index)
返回指定索引处的 char 值
public int length()
返回此字符串的长度
方法名
说明
public StringBuilder()
创建一个空白可变字符串对象,不含有任何内容
public StringBuilder(String str)
根据字符串的内容,来创建可变字符串对象
方法名
说明
public StringBuilder append(任意类型)
添加数据,并返回对象本身
public StringBuilder reverse()
返回相反的字符序列
sb.append("hello");
String s = sb.toString();
String s = "hello";
StringBuilder sb = new StringBuilder(s);
String line = sc.nextLine();
// sb.reverse();
// String ss = sb.toString();
// return ss;
(1)提高了代码的复用性(多个类中相同的成员可以放到同一个类中)
final Student s = new Student(23);
s = new Student(24); // 错误
s.setAge(24); // 正确
}