一、 封装:
-
概念:将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来对隐藏的信息进行操作和访问。
- 现实生活中封装概念的引入:
- 1.包装 :快递 :打包
- 2.台式机电脑:机箱[ 主板 显卡 内存 电源 硬盘。。。]
- 现实生活中封装概念的引入:
-
优点:
-
良好的封装能够减少耦合。
-
类内部的结构可以自由修改。
-
可以对成员变量进行更精确的控制。
-
隐藏信息,实现细节。
-
1. 语法:
public class 类名{
private 字段;//私有化
private boolean sex;
public void setSex(boolean sex){
this.sex = sex;
}
public boolean isSex(){
return this.sex;
}
public void setXxx(数据类型 变量名){
this.字段 = 变量名;
}
public boolean getXxx(){
return this.字段;
}
类名(){}
}
2. 步骤:标准javabean
- 1.私有化字段 ==》Private修饰类中的字段
- 2.给字段提供setter(赋值方法) getter(取值方法)方法
如果有boolean字段,就将getXxx()替换成 isXxx(); - 3.提供无参构造
- 4.public 修饰类
3. 对象的赋值和取值
- 赋值:
- 1.对象名.字段名 = 值; 不推荐,因为一般我们写的类都是用Private修饰字段
- 2.有参构造(…);(只能够创建对象的时候赋初始值;)推荐
- 3.set(…);推荐
- 取值:
- 1.对象名.字段名;不推荐,因为一般我们写的类都是用Private修饰字段
- 2.get();推荐
4. this: 指代当前对象,就是该对象的地址
- 即谁创建就是指代谁,哪个对象调用有this的方法就是指代哪个对象
-
1 解决局部变量和成员变量的二义性 ----》get set 方法中的应用[在get/set可以写this]
-
2.本类中构造方法之间的相互调用,但是必须是构造方法内的第一句 => 不会创建新的对象
根据具体的需求写几个构造器
-
class Student{
int age;
String name;
Student(){}//无参构造
Student(String name){
this();//表示调用当前对象自己的构造 作用:1.代码复用 2. 避免调用父类构造器
this.name = name;
//this(name,17);this调用构造方法的时候只能在另一个构造方法的第一句
}
Student(String name,int age){
//this(name);//表示调用当前对象自己的构造 作用:1.代码复用
this.name = name;
this.age = age;
}
}
- 3.作为返回值返回 : this持有对象地址,表示该类的一个对象即是一个数据
- 4.作为参数传递
二. 继承
- 概念:继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
- 好处 : 提高了代码的复用性
1. 语法:
设计类的时候
子类名 extends 父类
class A{
}
class B extends A{
}
前提:不能有final修饰的父类
2. 能继承的元素
- 1.非私有的字段和普通方法
3. 不能继承:
- 私有的字段和普通方法
- 构造方法
4. Java中类的继承特点:
- 1.Java中类的继承只能够是单继承
- 2.可以支持多重继承
示例:
class A{}
class B extends A{}
class C extends B{}
class D extends C{}
C 是D的直接父类;
A B 都是D的间接父类
- 3.每一个类都有一个直接父类,如果没有看到显示的继承代码,
那么就隐式继承就Object(顶级父类)
5. Object
-
类 Object 是类层次结构的根类,每个类都使用 Object 作为超类。(和接口没有关系)
-
所有对象(包括数组)都实现这个类的方法 : 所有的对象都可以调用到Object中的方法;
-
1.toString();返回当前对象的字符串形式
如果打印对象不满足需求就要重写toSting()方法 -
2.equals(Object obj);
判断当前对象和obj是否"相等",默认是==比较,所以一般情况下,以后都要重写该方法 -
3.hashCode();
返回当前对象的hash值int类型 -
4.Class getClass();
返回当前对象的运行时类,比如:如果是Student类型的对象,调用该方法,返回的就是Student类型 -
hash值相等,equals比较是否相等?
- equal比较相等,hash值比较是否相等?在实际开发中,只要是equals比较相等,hash值也相等
6.继承关键字
- 继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。
- extends关键字
- 在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。
- implements关键字
- 使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
- super 与 this 关键字
- super关键字:
- 我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。super 表示父类对象;
- super(); 调用父类无参数的构造方法;
- 必须是子类的构造方法中的第一句
- this关键字:指向自己的引用。
- super关键字:
- final
- final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:
构造器
-
子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
-
如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
6. == 和 equals区别(重点)
== 和 equals 都是比较是否相等,请问它们到底有什么区别呢?
相等 : a 传统的理解一般都是数字值是否相等;
b 在程序中任何东西都是数据,都会比较是否相等
- 1.==
- 基本数据类型: 比较的就是值是否相等;
- 引用数据类型: 比较的是对象的地址是否一样;(排除特殊 String)
- 2.equals (最初定义在根类Object中的)只能用于引用类型
- 基本数据类型 : 不能够使用! 基本数据类型不是对象,不能够调用Object中的方法
- 引用数据类型 : 在Object的源码中定义的就是== 进行比较比较
- 如果我们没有去覆写过equals方法而是直接调用到了Object中的此方法,那么结果和== 比较应用数据类型一样的;
- 在实际开发中,我们一般比较对象都是通过对象的属性值进行比较(一般比较对象的地址没有多大用处),所以我们会经常覆写Object中的此方法,把自己的规则写在方法里面;