Java笔记二:面向对象(OOP)

Java笔记二: 面向对象(OOP)


  1. ①.类名和文件名没有任何关系,前提是class类前面不要加public ,如果加上public代表这个类是主类。
    ②.如果在定义类的时候public class Test{}这个类就是主类。一个Java文件中只能有一个主类。而且这个文件名字必须要和主类名字一致。(当然也有内部类)

  2. 类里面的属性
    属性就是这个类公有特征,用变量的定义方式来表示,可以没有初始值,JVM给属性默认值

  3. 对象创建的内存结构
    ①栈:用于存储基本数据类型的值或者局部变量,先进后出,存取的容量小,存取的速度快。
    ②堆:用于存储引用数据类型,存取容量大,存取速度慢。
    ③数据共享区:用于存储引用数据类型,存储一些共享数据(方法)
    ④对象存储在堆中,引用存储在栈中,堆中的每一个对象的数据是隔离的
    ⑤每一个类class加载到数据共享区中,jvm会解析这个类的内容

  4. 属性的特点:
    ①作用范围:根据权限修饰符来定
    ②存储位置:堆内存或者数据共享区
    ③默认值:有
    ④生命周期:由jvm通过垃圾回收机制来自动回收

5局部变量
①.局部变量是定义在方法中或语句块中
②.作用范围:只限于所定义的大括号以及子括号中
③.默认值:无,局部变量必须赋值。
④生命周期:所属的大括号结束就消失

  1. 封装(就是把类的属性封起来,不能直接获取,可以间接访问! )
    目的:提高数据安全性,通过封装,可以实现对属性的访问权限控制,同时增加了程序的可维护性。
    步骤:
    ①.创建一个类
    ②.将属性私有化,使用private关键字完成私有化,这种属性只有本类能访问。
    ③.我们一般对每一个私有属性提供公共public的set和get这种方法供外界来访问我们的私有属性。

  2. this关键字
    ①.this关键字有两种用法,一种用在对象方法内 ,第二种用在构造器
    ②this只能在对象方法内使用。(重要)
    ③对于类的对象来说,属性是每个对象都有一份是隔离的。但是方法是多个对象共享,
    不同的对象调用这个方法的时候用this来区分不同对象的数据。

  3. 构造器
    ①用于创建对象的方法
    语法: 权限修饰符 类名 (数据类型 参数名,……){

}
构造器本身是一个方法:
没有返回值,也没有void.
构造器的方法名必须和类名一致
在方法中定义初始化的参数列表。

②构造器之间的调用
同一个类中构造器可以相互调用
需要通过this(…)来调用。

注意this(…)必须放在构造器的第一行。

  1. 静态关键字static
    ①属性上
    A加上static 的属性是类属性,静态属性。
    类属性的访问可以通过 类名.类属性, 还可以通过对象来访问。
    B类属性的当前的class文件加载进入jvm类属性就被初始化。
    C类属性可以被每一个对象共享
    ②方法上
    A static 修饰在方法上就是类方法
    B类方法的当前的class文件加载进入jvm类方法就被初始化,jvm执行完毕Student.class文件出了jvm,类方法也就消失了。
    C对象方法和类方法都是被对象共享,类方法初始化很早,jvm加载这个类的时候,类方法就初始化了,对象方法也是早早就进入jvm了,但是不一定被启用了,只有先创建对象,才有可能使用这个方法
    D类方法不能访问对象属性和对象方法(类方法只能访问类属性和类方法)

类方法最常见的应用场景就是工具类的定义
③静态代码块
语法:class A{
//静态代码块
Static{
}
}
A.静态代码块主要是用于初始化资源
B静态代码块在main之前执行。
C静态代码块可以使用范围类属性(必须先定义)和类方法。

  1. 继承
    ① 特点
    a. 子类使用extends关键字继承父类的共同属性以外,子类还可以有自己特有的属性方法
    b. 子类只能获得父类中的非private的属性,如果想要继承就得提供公共的set和get的方法,私有的方法子类是无法继承下来的。
    c. Java中只能做单继承
    ② Super关键字的使用
    a. 子类实例化的过程中父类的构造器先被调用,然后再调用子类的构造器
    b. 如果父类带有有参数的构造器,并且没有显示的定义父类的默认构造器,默认构造器被覆盖,导致子类的构造器无法通过super()来做调用,就会编译报错,需要显示的定义父类的默认构造器。
    c. 如果子类的构造器中调用了父类中的有参数的构造器,默认super的调用就不会有了,不能在子类的构造器中调用两个super()
    d. Super()的调用必须要放在方法的第一行
    e. Super可以表示父类的引用,我们可以使用super和this来区分父类和子类中同名的属性

  2. 接口
    什么是接口:当一个抽象类,如果抽象类中的所有方法都是抽象的,那么我们就可以把它定义为一个接口,接口是行为的抽象,类是属性和行为的抽象。
    语法:
    Interface 接口名{
    方法的定义;
    }
    ① 接口中的方法定义不需要Abstract来修饰,默认就是抽象的
    ② 接口是不可以实例化的,需要有类实现接口实现接口的语法
    Class 类名 implements 接口名,接口名{
    //实现每一个接口的方法
    }
    ③ 接口中的方法不能和private,static和final共存。
    ④ 在接口中可以定义“属性”,可以通过接口的实现类的实例来访问(不推荐),推荐使用接口名.常量,这是一个常量默认是public static final。
    ⑤ 注意:常量的定义命名的规范要使用大写,单词之间要用“—”分隔
    ⑥ 接口可以继承接口(多继承)

  3. 接口在1.8中的新特性
    ① 在接口中定义静态方法
    ② 在接口中定义默认方法实现,在接口可以加default变成默认方法例如:
    Interface Person{
    Public default void learn(){
    System.out.println(“此方法可以实现也可以不实现!”);
    }
    }

  4. 接口和抽象类的区别
    ① 接口是行为的抽象可以有静态方法,抽象方法和默认方法,抽象类中可以有所有方法。
    ② 接口和抽象类都不能实例化,接口需要类来实现后实例化实现类,抽象类需要类来继承然后实例化子类。
    ③ 抽象类只能单继承,接口可以多继承接口(jdk1,7),接口还可以多实现
    ④ 接口中的属性是public static final类型的,抽象类中的属性跟普通类中的属性没有区别。
    ⑤ 接口中的方法默认就是抽象的不需要加abstract,抽象类中的抽象方法需要加abstract关键字

  5. 父子类之间的转换
    ① 子类转换成父类
    a. 如果子类对父类的方法有重写,并且子类的实例赋值给父类的引用,通过这个引用来调用这个重写的方法的时候,调用的是子类的(如果是属性就是父类的)
    b. 父类指向子类的实例的引用不能调用子类的特有的方法和属性。

② 父类转换成子类
a. 父类不自动转换为子类
b. 父类转换成子类的前提是父类的真身是这个子类,转回子类后,即可访问子类的方法和属性。
c. 如果这个父类的真身是子类B,就不能强制转换子类A

  1. 多态
    T instanceof JavaTeacher 判断父类的实际真身是哪个子类的实例。

  2. Scanner扫描器
    扫描器就是让我们运行程序的时候可以从控制台输入数据。
    Scanner的使用必须要引入这个类。
    我们使用的构造器
    Scanner(InputStream source) 构造一个新的Scanner,它生成的值从指定的输入流扫描的。
    常用方法:
    · ①nextInt() 将输入的信息的下一个标记扫描为int
    · ②nextLine()此扫描器执行当前行,并返回跳过输入的信息。
    ·

  3. 权限修饰符
    访问权限的修饰符一共有四种:private,默认,protected,public
    在这里插入图片描述

① 权限修饰符在类上:
如果类有public是可以随便的访问,如果默认的话同包能访问,跨包不能访问。
② 权限修饰符在方法和属性上
Java笔记二:面向对象(OOP)_第1张图片

我们通常情况:类我们一般设置成public的,属性一般都是private,方法一般都是public
也有少数使用(protected private)

  1. Object
    Object是所以类的根类,所有的类都是直接或者间接的去继承Object类。
    类Object是类层次结构的根类,每个类都使用Object 作为超类,所有对象都实现这个类的方法。
    ① toString方法
    返回该对象的字符串表示,通常,toString 方法会返回一个“以文本方式表示”此对象的字符串,结果应该是一个简明但容易读懂的信息表达式,建议所有子类都重写此方法。
    如果我们打印一个对象的时候,实际上是打印这个对象调用toString的返回值
    getClass().getName(): 获得调用toString的方法的类的类名
    Integer.toHexString(hashCode()):获得这个对象的hash值的16进制

② hashCode方法
hashCode也是Object中的一个方法
由Object类定义的hashCode方法确实会针对不同的对象返回不同的整数。
每一个对象都有一个唯一的hashCode值

③ finalize
用于垃圾回收,我们不用手动的去调用,由jvm来调用。
当垃圾回收器确定不存在对该对象的更多的引用时,由对象的垃圾回收器的调用此方法

④ equals
==:
a. 基本数据类型:比较的是值
b. 引用数据类型:比较的是地址
Object的equals实现
Public boolean equals(Object obj){
Return (this == obj);
}

你可能感兴趣的:(Java,java,封装)