一、面向对象
1、对于面向对象思想,强调的是对象(实体)
特点:面向对象就是一种常见的思想,符合人们的思考习惯
面向对象的出现,将复杂问题简单化
面向对象的出现,让曾经过程的执行者变成了对象的指挥者
2、类与对象:用java语言对现实生活中的事物的描述通过类的形式来体现。(对事物的描述往往只关注两方面:属性和行为)
类:事物的描述
对象:该事物的实例,在java中用new来创建
匿名对象:没名字的对象 例:new Car();
3、构造函数: 函数名与类名相同、不用定义返回值类型、没有具体返回值类型
作用:给对象进行初始化,多个构造函数以重载的形式存在
一个类中如果没有构造函数,那么该类中有一个默认的空参数构造函数,如果有创建的构造函数,那么类中默认的构造函数就没有了
4、构造函数与一般函数的大致区别:构造函数,对象创建时就会调用与之对象的构造函数,与对象进行初始化,而一般函数在对象创建后需要函数功能时才调用
二、this关键字
1、每个类的每个非静态方法(没有被static修饰)都会隐含一个this引用名称,它指向调用这个方法的对象(当前对象)。
2、当在方法中使用本类的非static属性时,都会隐含地使用this名称。
3、this可以看作是一个变量,它的值就是当前对象的引用
this关键字的用法一:
当类中某个非静态方法的参数名跟类的某个成员变量名相同时,为了避免参数的作用范围覆盖了成员变量的作用范围,必须明确地使用this关键字来指定成员变量。
this关键字的用法二:
如果某个构造方法的第一条语句具有形式this(…)
那么这个构造方法将调用本类中的其他构造方法
4、this的应用例
public booleean compare(Person){
if(this.age==p.age)
return true;
else{
return false;
}
}
public static void main(String[] srgs){
Person p1=new Person();
Person p2=new Person();
p1.compare(p2);
}
三、static关键字
1、 在类中,用static声明的成员变量为静态成员变量,它是该类的公用变量,对于该类的所有对象来说,static成员变量只有一份。
2、 用static声明的方法为静态方法,该方法独立于类的实例,所以也叫类方法。
静态方法中只能直接调用本类中其他的静态成员(变量和方法)。
静态方法中不能使用this和super关键字。
3、静态成员可以通过类名(不需要实例化)或类的实例去访问。
4、static关键字的特点:static是一个修饰符,用于修饰成员、static修饰的成员被所有对象共享、static优于对象存在,因为static的成员随着类的加载已经存在了、static修饰 的成员多了一种调用方式,可以直接被类名调用如类名.静态成员、static修饰的是共享数据,对象中存储的是特有数据。
5、成员变量与静态变量的区别?
1、成员变量随着对象的创建而存在,随着对象的被收回而释放,静态变量随着类的加载而存在,随着类的消失而消失(两个变量的生命周期不一样)。
2、调用方式不一样:成员变量只能被对象调用、静态变量可以可以被类名调用,也被对象调用(不建议)。
3、别名不同:成员变量也称为实例变量;静态变量也称为类变量。
4、数据存储位置不一样
成员变量数据存储在堆内存的对象中,所以也叫对象特有数据;静态变量数据存储在方法区(的静态区),所以叫对象的共享数据。
6、静态使用的注意事项:
1、静态方法只能访问静态成员(成员变量、方法)(非静态既可以访问静态也可以访问非静态)。
2、静态方法中不可以使用this或super关键字
3、主函数是静态的(主函数调用静态方法和静态变量)。
四、static静态代码块
1、在类中可以使用不包含在任何方法中的静态代码块(static block),当类被JVM载入时,静态代码块被执行,且只被执行一次。
2、静态代码块经常用来初始化类的静态成员变量。
static{
// 静态代码块内容
}
五、封装性
1、封装(Encapsulation)
E对外部不可见,隐藏对象的属性和实现细节。
E封装的好处:隐藏类的实现细节,让使用者只能通过程序员规定的方法来访问数据,可以方便的加入存取控制语句,限制不合理操作
2、封装性体现
º类的封装(属性、方法都存在于某个类中)
º对字段的封装
1字段设置为私有(private)
2添加get /set 方法
º访问修饰符的限制,保证数据的安全
六、*单例设计模式(重点)
1、私有化构造方法
2、在类的内部实例化该类的对象,该类的对象必须是static全局变量
3、编写获取该单例对象的static方法
º“饿汉式”单例模式:当类加载到JVM时,单例对象直接创建;
º“懒汉式”单例模式:当类加载到JVM时,并不直接创建单例对象,用户请求单例对象时(用户需要使用时),才实例化该单例对象;
/*
* “饿汉式”单例模式:当类加载到JVM时,单例对象直接创建
* */
public class HungrySingleInstance {
// 在该类内部实例化对象
private static HungrySingleInstance single=new HungrySingleInstance();
// 私有化构造方法,防止外部实例化该类的对象
private HungrySingleInstance(){
}
// 静态方法,获取单例对象
public static HungrySingleInstance getSingleInstance() {
return single;
}
}
/*
* “懒汉式”单例模式:当类加载到JVM时,并不直接创建单例对象,用户请求单例对象时(用户需要使用时),才实例化该单例对象
* */
public class LazySingleInstance {
// 在该类内部实例化对象
private static LazySingleInstance single;
// 私有化构造方法,防止外部实例化该类的对象
private LazySingleInstance(){
}
// 静态方法,获取单例对象
public static synchronized LazySingleInstance getSingleInstance() {
if(single==null){
System.out.println("第一次访问单例,创建......");
single=new LazySingleInstance();
}
return single;
}
}
4、如何保证对象唯一性?
1、不允许其他程序用new来创建该类对象
2、在该类中创建一个本类实例
3、对外提供一个方法让其他程序可以获取该对象
步骤:私有化该类的构造函数;通过new在本类中创建一个对象;定义一个公有方法,将创建的对象返回。
public class Single {
static Single s = new Single();
private Single(){}
public static Single getInstance(){
return s;
}
}
七、继承性
1、什么是继承?
继承是一个类继承另一个类,这个类拥有父类可以被继承的成员;继承是面向对象特征之一;实现继承的类称为子类也叫派生类,而被继承的类称为父类,也叫超类或基类;类的方法和属性可以被继承。
注意:私有的属性和方法不能被继承
构造方法不能被继承
2、继承的好处:
◆实现代码的重用和扩展
◆模拟现实世界的关系
◆结构更清晰
3、继承图解:
4、继承的传递性:
5、单继承性
◆在java中一个类只能有一个父类,这Java的“单继承性”。
◆java.lang.Object类是所有类的父类
6、怎样使用继承
◆要继承一个类,可以使用extends关键字,意味着扩展父类的功能。
◆类继承的基本语法:
<modifier> class <name> [extends <superclass> ] {
<declaration> *
}
7、类的继承示例
八、super关键字
1、在Java类中使用super来引用父类的成员
Esuper可用于访问父类中定义的属性
Esuper可用于调用父类中定义的成员方法
Esuper(…)可用于在子类构造方法中调用父类的构造方法
2、super关键字调用
º 使用super关键字调用基类的属性
class Father{
public int value=200;
}
class Child extends Father{
public int value;
public void print(){
value=100;
super.value=50;
System.out.println(“value的值”+value);
System.out.println(“super.value的值”+super.value);
}
}
º super调用父类方法
创建子类对象会先调用基类的构造方法,默认调用基类无参构造方法,要调用基类其他带参构造方法,则使用super。
º 使用super调用基类中的构造方法
Class Father{
private int n;
public Father(){
System.out.println(“父类无参构造”);
}
public Father(int n){
this.n=n;
System.out.println(“父类中带参构造”+n);
}
}
class Child extends Father{
private int n;
public Child(){
super(300);
System.out.println(“子类无参构造”);
}
public Child(int n){
this.n=n;
System.out.println(“子类带参构造”+n);
}
}
3、使用super关键字注意事项
当子类和父类都有同名的属性时,在子类中如果要使用父类的属性 super.属性
super只能应用在成员方法和构造方法中,不能应用在静态方法中(和this是一样的)
如果在构造方法中使用必须放在第一行
在构造方法中this()和super()不能同时出现
4、常见错误
class Father{
String name;
public Father(String name){
this.name=name;
}
}
class Child extends Father{
public Child(){
}
public Child(String name){
super(name);
}
}
子类构造方法中没有super(),则调用父类无参构造
而父类中没有无参构造,编译错误。
5、this和super对比
NO. | 比较点 | this | super |
1 | 访问属性 | 首先在子类中查找,如果没有就在 父类中查找 | 直接查找父类 |
2 | 访问方法 | 先在子类在中找,如果没有就去父类中查找 | 直接访问父类中方法 |
3 | 调用构造 | 调用本类中的其他构造方法 | 调用父类的构造方法 |
4 | 特殊 | 指自身的对象 | 没有 |
5 | 作为参数 | 可以作为参数 | 没有 |
九、四种访问权限
对类中的属性和方法的可见度
访问修饰符
private
[default]:包级别访问权限
protected
Public
类的访问修饰符
public:任何包中的类都可以访问该类
默认值:同一个包中的类可以访问该类
成员的访问修饰符
private:只对本身类可见
默认值:对同一包中的类可见
protected:对跨包的子类和同一包中的类可见
public:对一切类可见
十、方法重写(override)
1、当子类继承父类时,可以从父类继承它的属性和方法,如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫做方法的重写(override)
2、重写规则:
重写的注意事项(三要素):
◆ 只能存在于子类和父类之间
◆ 子类的方法名称、输入参数和返回值类型完全一致或子类方法返回值类型是父类方法返回值类型的子类。
◆ 权限不能比父类方法更加严格。
注意:重写的前提是先继承了父类的方法。
3、对比重写和重载
NO。 | 比较点 | 重写 | 重载 |
1 | 单词 | Override | Overload |
2 | 范围 | 继承(子类) | 同一个类里 |
3 | 对方法的要求 | 和父类的方法名一致,参数列表一致,返回类型兼容 | 方法名一致,参数列表不同,返回值类型无要求 |
4 | 对访问权限的要求 | 不能比父类的访问权限更加严格 | 对访问权限没要求 |
4、方法重写注意事项
1)在JDK1.5之后,重写方法的返回值类型可以和父类中的方法返回值类型兼容 (引用类型之间)
2)如果子类中成员变量、静态变量、静态方法 和父类中成员变量、静态变量、静态方法相同,这种情况不是重写,可以认为是隐藏,只有非static成员方法之间才是重写