1.1 什么是封装
封装,即隐藏对象的属性和实现细节,仅对外公开接口(方法/函数),控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中属性数据和函数都是类的成员。
封装的目的:是增强安全性和简化编程,通过外部接口,以特定的访问权限来使用类的成员。
封装的作用:保护属性的有效性
1.2 java中的封装
广义来说:一切公共代码的抽取都可以叫封装。一般体现在公共方法的封装。工具类。
狭义来说:隐藏对象的属性和实现细节。
- 将属性私有化 ,使用private关键字修饰。
- 为使用private关键字修饰的属性添加 getter和setter方法。通过get和set方法来操作属性。
- 在setter方法中,添加数据的逻辑校验。
public class Student {
//属性封装:1.属性私有化 2.添加getter setter方法 3.在setter方法中进行数据校验
//属性私有化 ,使用private关键字修饰
private String name;
private int age;
//生成getter setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//生成getter setter
public int getAge() {
return age;
}
public void setAge(int age) {
if(age>0 && age
this.age = age;
}else{
System.out.println("年龄超出范围");
}
}
}
public class Test {
public static void main(String[] args) {
Student s=new Student();
s.setName("张三");
s.setAge(-20);
}
}
2.1 什么是继承
继承是面向对象软件技术当中的一个概念,与多态、封装共称为面向对象的三个基本特征。继承可以使得子类具有父类的非私有属性和方法或者可以重新定义、追加属性和方法等。
继承(英语:inheritance)。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
如果某类B“继承”另某类A,就把这个B称为“A的子类或派生类(subclass)”,而把类A称为“B的父类”也可以称为“A是B的超类或基类(superclass)”。
2.2 为什么需要继承
提升代码的可重用性
- 子类通过继承可以得到父类有的内容
能够扩展功能
- 通过继承,子类可以扩展父类已有的功能
方便维护
- 多个子类都继承了父类的某个功能,当功能需要修改时,只要修改父类的这个功能即可
使用面向对象思想编程的时候,需要考虑的两个方面:
1.功能实现了没有?
2.后期维护方便吗?
2.3 继承的语法格式以及条件
子类继承父类:extends 1.继承父类非私有的属性 2.继承父类的非私有的方法 3.子类重写父类方法 a.方法名,参数与父类一致 b.返回值小于等于父类返回值的范围 c.方法访问修饰符大于等于父类方法的访问修饰符 d.子类重写方法异常声明必须是父类的异常或子级异常
java语言是单继承的,java类只能由一个父类。
继承的语句格式:
[权限修饰符] class 子类名 extends 父类名{}
// 定义父类
public class Father {
// 父亲有500w元
int money = 5000000;
public void liveHouse(){
System.out.println("住80年代老房子");
}
}
// 定义子类
public class Son extends Father{
super.house();//super:指代父类对象 System.out.println("住大房子");
}
public class Test {
public static void main(String[] args) {
Son son = new Son();
System.out.println("儿子有:"+son.money+"元");
son.liveHouse();
}
}
运行结果:
儿子有:5000000元
住80年代老房子
住大房子
2.4 方法重写 @Override注解
什么是方法重写
在Java和其他一些高级面向对象的编程语言中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
方法重写和方法重载的区别:
重载(overload):发生在同一个类中 , 方法名相同,参数列表不同,不考虑返回值。
重写(overrides):发生在父子类中,子类继承父类的方法,方法名相同,参数也相同,但是实现方法体不同。
- 重写的注意事项
- 必须保证父子类中重写的方法,方法名相同,参数列表相同。
- 子类方法的返回值必须小于或等于父类方法的返回值范围。
- 子类方法的权限必须要大于等于父类方法的权限(不包括 private)
- 子类重写方法异常声明必须是父类的异常或子级异常
- 私有的不能被继承
toString()方法
- 任何类都是Object类的直接子类或者间接子类,在Object类中有一个toString()方法。当输出一个对象时,先调用当前类的toString()方法,如果当前类没有toString() ,就去找当前类的父类,看是否有toString()方法,如果过父类也没有,就去找Object类中的toString()方法并运行。
数据模型类
- 以后写类都要有:成员属性私有化,成员方法,构造方法,get/set方法 ,toString()Plain Text
// Father.java
// 父亲类
public class Father {
// 父亲有500w元
int money = 5000000;
public void liveHouse(){
System.out.println("住80年代老房子");
}
}
// Son.java
// 儿子类
public class Son extends Father{
// 重写父类方法
@Override
public void liveHouse() {
System.out.println("住海景洋房");
}
}
// Test.java
// 测试类
public class Test {
public static void main(String[] args) {
Son son = new Son();
System.out.println("儿子有:"+son.money+"元");
son.liveHouse();
}
}
运行结果:Plain Text
儿子有:5000000元
住海景洋房
2.5 super关键字,this关键字
作用:如果子类既想使用自己的方法,又想使用父类的成员变量和成员方法,需要通过super关键字。
super 关键字的用法:
- 在子类的成员方法中访问父类的成员变量和成员方法。
- 在子类的构造方法中访问父类的构造方法。
2.6 继承中构造方法的特点(父子类)
特点 :
- 构造方法不能被继承(构造方法是一个类独有的方法)
- 创建子类对象一定是先调用父类构造,再调用子类构造。(并且只有子类构造才能调用父类构造)。
- 子类构造可以通过super关键字调用父类有参构造 无参super() 有参super(参数列表) 。
- super父类构造调用,必须是子类构造中的第一行语句。(并且一个子类构造,只能调用一次super())。必须先有父再有子。
继承的特点: java中类与类之间是单继承的。但是可以多级继承。一个父类可以有多个子类
2.7 Object类
Object是所有类的父类,任何类都默认继承Object
理论上Object类是所有类的父类,即直接或间接的继承java.lang.Object类。由于所有的类都继承在Object类,因此省略了extends Object关键字。
该类中主要有以下方法: toString(),getClass(),equals(),clone(),finalize(), 其中toString(),getClass(),equals()是其中最重要的方法。
注意:
Object类中的getClass(),notify(),notifyAll(),wait()等方法被定义为final类型,因此不能重写。
equals()方法 在比较字符串时 比较的是俩个字符串的值。但是实际上equals方法比较的是地址值。
为什么String就可以用equals()比较值呢?
因为String类中重写了equals()方法,所以可以比较值。
实例:
学生和老师有一些共同属性。有相同的方法。通过继承人类实现代码复用Plain Text
package com.test4;
public class People {
String name;
String sex;
public People(String name,String sex){
this.name=name;
this.sex=sex;
}
public void show(){
System.out.println(this.name+" "+this.sex);
}
}
package com.test4;
public class Student extends People{
public Student(String name,String sex){
super(name,sex);
}
}
package com.test4;
public class Teacher extends People{
String edu;
String pos;
public Teacher(String name,String sex,String edu,String pos){
super(name,sex);
this.edu=edu;
this.pos=pos;
}
public void show(){
super.show();
System.out.println(this.edu+" "+this.pos);
}
}
package com.test4;
public class Test {
public static void main(String[] args) {
Student s=new Student("张三","男");
s.show();
Teacher t=new Teacher("王老师","女","博士","教授");
t.show();
}
}
小结
- 继承关键字:extends
- 单继承,一个类只能有一个直接父类
- 子类可以继承父类:public protected 同包默认的属性和方法,不能继承private私有方法
- 子类可以书写自己的属性和方法
- 子类可以重写父类的方法
- 在子类中可以通过super调用父类的方法和属性。super.方法名/属性名
无父无子:
a. 父类构造不能继承,但是必须调用
b. new子类的时候,子类构造的第一行必须调用父类的构造方法
c.如果子类不写super(),系统默认调用父类无参构造
d.可以通过super(参数)调用有参,并且必须第一行,并且只能有一个super()。
如果通过子类调用方法,优先调用自己的方法。子类重写方法之后调用自己的方法,如果子类没有重写方法则使用父类的方法。
- 先子类---》再父类---》再父类--》。。。。--》Object
- 所有类都直接或者间接的继承了Object类。Object是所有类的基类,超类。
继承的作用:
A. 减少代码冗余
B. 书写一个父类,子类可以对父类进行扩展
C. 子类可以对父类重新定义
第三节 final关键字
final 代表最终的,不可改变的。
字符串为什么是不可变的?因为String类是用final关键字修饰的。
三种用法:
- 可以用来修饰类
final修饰的类不能被继承,也就意味着这个类其中的方法不能被重写。
- 可以用来修饰方法
final关键字修饰的方法不能被覆盖重写。表示一个最终的方法。
- 可以用来修饰变量
final修饰成员变量---》常量 命名必须全大写 一般多个单词使用下划线连接D_AGE,CAT_AGE
基本数据类型:使用final修饰的基本数据类型值不能变,并且只能被赋值一次。
引用数据类型:使用final修饰的引用类型,引用的地址值不能改变,但是对象的属性值可以改变。
- 对于成员变量来说,使用final 修饰照样是不可变的,但是因为成员变量有默认值,所以必须手动赋值。
- 对final修饰的成员变量来说,可以直接赋值,也可以通过构造方法赋值,但是必须二选一。
- 如果要通过构造方法赋值,并且类中有多个构造方法,必须保证每一个构造方法都要对final修饰的成员变量赋值。
第四节:基本类型包装类
4.1 概念
基本数据类型使用非常方便,但是我们没有对应的方法去操作它们,可以通过一个类把基本数据类型包装起来,在类中定义一些方法,这个类就叫包装类。我们可以使用包装类中定义的方法去操作基本数据。
基本数据类型和对应的包装类:
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
4.2 自动装箱与自动拆箱
- 装箱
基本数据类型转换成包装类
- 拆箱
包装类转换成基本数据类型
4.3 基本数据类型与字符串之间的转换
- 基本类型(数字)----》字符串(String)
- 可以使用数字直接+空字符串
- 例如: String a = 5 + "";
- 使用Integer包装类的方法 toString(int i);
- 例如: String a = Integer.toString(100);
- 使用String类的方法valueOf(int i)
- 例如:String a = String.valueOf(100);
- 字符串----》基本数据类型(数字)
注意:只有数字类型的字符串,才可以转换成数字
使用包装类的方法xxx.parseXXX("5"); NumberFormatException 数字格式异常