封装:
隐藏对象的属性与实现细节,仅 对外提供接口
继承:
一个类直接使用另一个类的属 性和方法
继承:(子类对父类地址的引用)
继承:一个类直接使用另一个类的属性和方法
格式: class 子类名 extends 父类名{}
(extends:延伸,扩展)
好处:
a.提高了代码的复用性
b.提供了代码的可维护性
c.让类于类之间产生了联系,同时也是多态的前提
注:
类于类之间产生了联系,其实也是继承的弊端:
开发原则:高内聚、低耦合。
内聚:自己能够独立完成功能的能力
耦合:类于类之间的联系
类的组成:
成员变量:
成员方法:
构造方法:
注:
a.子类中出现了和父类中名字不一样的成员变量,怎 么办?自己玩自己的
b.子类当中出现和父类成员变量或者成员方法名一致 的时候,怎么办?
查找顺序:(就近原则)
a.先在子类的局部范围去查找,有就使用(局部)
b.再去子类的成员位置去查找,有就使用(成员)
c.再去父类的成员位置去查找,有就使用
d.如果还找不到,那就是真的找不到了 报错
访问父类的内容:
有一个东西跟this很相似,this是访问的本对象。 有 个东西如果能够访问其父类,关键字叫做:super
a.调用成员变量:
this.成员变量 调用本类的成员变量
super.成员变量 调用父类的成员变量
b.调用构造方法(创建对象一定要经过构造方法)
this();
super();
c.调用成员方法
this.成员方法()
super.成员方法()
子类继承父类,在内存当中的走向(先创建父再子)
1.加载所以的class进入内存(关联的才加载进 方法区)
2.加载main方法
3.因为main里面有创建对象(如果这个对象有父 类,则先加载父类内存结构)
4.父类数据加载完毕,创建子类对象
5.如果有使用super,那么就通过super关键字去 查找父类地址
继承当中构造方法的关系:
a.子类当中的所有的构造方法都会默认的访问父类的 无参构造
b.因为子类继承了父类,很有可能需要使用到父类的 初始化数据,所以在子类初始化完成之前,必须向初 始化父类
c.子类当中的任何的构造方法,默认第一句都是 super(); 必须在第一句(自己写只能放在第一 句 ,也可以写。super(有参构造))
d.假如父类没有提供无参构造,那么子类应该会出现 什么样的问题?
子类出现异常
如何解决?
a.你给父类加一个无参
b.你可以显示的去调用父类的带参构造 (super("nihao"))
注:
this代表本类对象的引用
super代表父类存储空间的标识引用(可以理解为父类 的引用,可以操作父类的成员方法)(在创建子类对象 时,系统默认产生一个父类对象)
super()和this()都必须写在第一句。如果不是第一 句, 会报错 很有可能对父类数据进行多次初始化, JVM不允许
继承注意事项:
a.Java只支持单根继承,不支持多根继承(只能一次 继承一个父类)
b.Java支持多层继承(可以多次继承一个父类)
c.子类只能继承父类的非私有方法和变量(成员)
d.子类不能够继承父类的构造方法,但是因为需要继 承父类 所以需要先将父类的数据进行初始化,所以 是父类自己执行了构造
e.不要为了部分功能而去使用继承(继承的体现关系 应该是一个"is a"的关系)
f.子类不能继承父类的属性与方法(子类可以通过父 类的公有接口去访问父类的私有成员以及私有方法, 但那是封装的特性,不是真正的继承)
举例:(错误 ,部分功能重叠不要用继承)
class A{
public void show1(){}
public void show2(){}
}
class B{
public void show2(){}
public void show3(){}
}
我们发现了B出现了和A一样的代码功能,所以我们可 能会考虑使用继承关系
class B extends A{
public void show3(){}
}
其实这样不好,因为你这样不但有show2,还多个 show1
而去show1并不是我们想要的
正确:
继承的体现关系应该是一个"is a"的关系
Person
Student
Teacher
水果
香蕉
菠萝
哈密瓜
对类的构造的过程举例:(无论怎样,先加载main)
class X{
Y b = new Y();
X(){
System.out.println("X");
}
}
class Y{
Y(){
System.out.println("Y");
}
}
public class Z extends X{
Y y = new Y();
Z(){
System.out.println("Z");
}
public static void main(String[] args) {
new Z();
}
}
方法重载 与 方法重写:
方法重载:本类当中的方法名一样,参数列表不同,与 返回值无关
方法重写:子类当中出现了和父类方法声明一样的时候
方法重写的应用:
当子类需要使用父类的功能,但是父类的功能又不能 满足需求的时候,你就可以重写父类的方法
如果你仍然想保留父类的部分功能,就在你的新功能 产生之前是使用super关键字先调用父类的方法
代码块:
代码块:在Java当中,被{}括起来的就被称之为代码块
根据其位置的不同,写法的不同,代码块可以分为:
局部代码块:存在于局部变量,用于限定变量的声明周 期(方法内)
构造代码块:在类中的成员位置,每次调用构造方法 前,都会执行构造代码块(方法外,类内)
作用:可以将多个构造方法相同的属性进行归集,同样 可 以对多个数据进行初始化
静态代码块:在类中成员的位置,用{}括起来,只不过 用static进行了修饰(方法外,类内)
注:
1.除了静态代码块在方法区内,其他有{}都在栈内 存 中
2.局部代码块在栈内存,构造代码块也在栈内存,与 成员变量同名也不冲突(成员变量在堆内存里)
3.在方法中使用代码块就不能与局部变量同名,因为 同在栈内存里
4.在Java当中,代码块的执行顺序如何?
静态代码块 --> 构造代码块 -->构造方法 --> 局部 代码块
静态代码块:因为存在静态的共享区所以只有一个地 址,只执行一次
构造代码块:每一次调用都会执行
构造方法:每一次调用都会执行
static:
一般使用在工具类型的方法中(工具类),不依赖于任 何对象的属性就可以完成功能的操作。
static的特点:
1.可以修饰成员变量和成员方法
2.随着类的加载而加载
3.优于对象的存在
4.可以被类的所有对象共享
在现实的开发当中,应该有哪一些数据应该被 共享?
1.班级编号
2.老师
5.可以通过类名直接访问(设置为public)
其实本身同样可以实现对象名进行调用
一般推荐使用类名进行调用(以后凡是看到 某一东西,直接用类名点出来 肯定是被 static修饰了)
注:格式为 public static
如果为私有,不能通过类名访问
static的注意事项:
a.在静态方法当中不能出现this关键字
如何理解:
静态方法是随着类的加载而加载,this关键字是 随着对象的创建而存在
静态是优先于对象的存在
b.静态方法只能方法静态方法和静态的成员变量
静态方法:
成员变量:只能方法静态的成员变量
成员方法:只能访问静态的成员方法
非静态方法:
成员变量:可以是静态的,也可以不是 静态的
成员方法:可以是静态的,也可以不是 静态的
一句话:静态只能访问静态,非静态 爱咋咋地。