面向对象–创建一个对象的过程
课外阅读
java: new一个对象的的过程中发生了什么? 加载类并创建和初始化对象;
双亲委托机制:能够确保一个类的全局唯一性
区分类的唯一性:包名+类名
Static的应用
static:静态的,可以修成员变量和成员方法。修饰成员变量,此变量就为一个共享变量,会被这个类的所有对象共享。
静态的变量,通过类名直接调用变量。
特点:
1.随着 类class 的加载而加载;
2.static 所修饰的成员,是优先于对象而存在的;
3.被 类的所有对象所共享;
4.被静态所修饰的成员,是属于类的,建议使用类型直接调用,当然你可以使用对象来调用,但是不推荐。
定义静态的方法
**1.在静态方法中,不能调用非静态方法;**被静态所修饰的对象(静态所修饰的成员)是随着类的加载而加载的,是优先于对象而存在的。先有的访问不到后有的。
2.在静态方法里,调用不到非静态的成员,只能访问静态成员,不能访问非静态成员。
3.在静态方法中,不能存在this关键字。
原因:this 本身代表的是该类的对象,而对象是后来才有的。
非静态方法
非静态方法中,即可以访问非静态成员,也可以访问静态成员;
静态方法:
public static void hehe ( ){
}
非静态方法:
public void haha ( ){
}
**注意:**对于提供main方法作为成员入口的类,在这个类中个,我们一般不去定义成员变量和成员方法。
**问题:**为什么main方法需要用public static 修饰?
方便虚拟机来调用
### 静态变量和成员变量的区别
1.静态变量属于类,也成为类变量;成员变量属于对象,也称之为对象变量,或实例变量。
2.静态变量储存在方法区的静态区,成员变量存储在堆内存。
3.静态变量,随着类的加载而加载,随着类的卸载和卸载。成员变量随着对象的创建而产生,随着对象的消失而消失。
4.静态变量,可以使用对象名调用,也可以使用类名调用,推荐使用类名调用
5.成员变量,只能使用对象名来调用。
Math——java中的一个类
补充例题:(猜数字)
代码块:所谓代码块,就是被大括号{}所括起来的代码
分类:
-
局部代码块、
-
构造代码块、
-
静态代码块、
-
同步代码块(多线程)
局部代码块:定义在方法中的代码块,有利于资源的释放。
psvm( ){
}
构造代码块: 定义在类中方法外的代码块 ,构造代码块先执行
在创建对象时,构造代码块会执行,而且优先于构造方法执行。
public student( ) {
sout(“构造代码块,每次创建对象时都会实行,而且优先于构造方法执行。”)
}
**静态代码块:**定义在类中方法外的代码块,且被静态所修饰,随着类的加载而加载,最早加载,且只执行一次。因为类只加载一次。静态代码块里只能访问被静态所修饰的。我们经常会在静态代码块中做一些初始化的准备工作。
static {
}
面向对象的三大特点——继承
封装(class),继承,多态
Java中的继承:子类可以继承父类的成员(成员变量和成员方法)
如何让类和类之间形成父子继承关系,使用关键字extends
继承的优点:提高代码的复用性和维护性
继承的弊端:让类和类之间产生关系,那就增加了耦合性。
程序的设计原则:高内聚(一个类,独立完成某个功能的能力),低耦合
耦合(类和类中间有一种关系。)
Java中的继承特点
-
Java中支持单继承,一个子类只能有一个父类,但是支持多层继承;
-
Java中子类只能继承父类非私有的成员;
-
子类不能继承父类的构造方法 ,构造方法参与继承。
-
不要为了部分功能区继承
解释:继承就是把多个子类的共性部分向上抽取到父类当中,以实现代码的复用性和维护型
当多个变量重名时:
1.当成员变量和局部变量重名时,我们的变量访问原则遵循就近原则,现在局部范围内找(方法内和形参)。
2.如果找不到,就去该类的成员范围找,找到就使用。
3.如果在该类的成员范围内还是没有找到,那就去该类的父类成员范围找。
Super
-
super 代表父类空间的一个标识,你可以认为是父类的一个对象,可以使用super区访问父类的数据
-
super( ) 访问父类的空参构造。super(int m) 访问父类的有参构造;
-
super.成员变量名 访问父类的成员变量。
-
super.成员方法 访问父类的成员的方法。
-
在每个类的构造方法中的第一行,会有一个super(); 回去调用父类的空参构造,来完成父类数据的初始化;
-
java继承体系中的顶层父类是Object类,所有类都是直接或间接继承自他;
-
如果说父类没有空参构造,怎么办?
1.那就想办法调用父类的有参构造。即,在子类中super(int m) 访问父类的有参构造;
2.如果子类有参数,那就间接的使用 this( )调用本类的有参构造,但这时候就没有super();语句了,二者不可共存与第一行。
This
this 代表本类的一个引用,你可以认为是本类的一个对象;
this ( ) 访问本类的空参构造;
this.成员变量 访问本类的成员变量;
this.成员方法 访问本类的成员方法;
方法重写
当子类出现了和父类一模一样的方法的时候(方法名,方法参数,返回值类型一样)就会出现方法覆盖的现象,即子类的方法会覆盖父类的方法。
### 为什么需要方法重写机制的出现?
子类对父类的方法实现并不是很满意,需要扩展或者覆盖方法,此时就需要方法重写机制。
ctro+o 重写父类的方法
Override 注解:用来检测这个方法是不是重写父类的。
重写时注意事项
1.父类私有的方法不能重写;私有方法不能继承,何谈重写。
2.构造方法不参与重写;
3.子类在重写父类方法时,方法的权限修饰符(访问权限),不能比父类的方法低,要么和父类方法的权限一样,或者比他高。public>protected>缺省>private
4.静态方法不参与重写;
Final 最终的
-
final 最终的,可以修饰变量,方法,类
-
final修饰变量,此变量为一个常量。
-
final修饰方法,此方法不能被重写。
-
final修饰类,此s类不能被继承。
-
final修饰引用类型 final fu = new fu( ); 这个地址值不能被改变。