面向对象:
对象:任何一个客观存在的事务都是对象
例如:一个人(每个人都是一个独立的个体 —— 一个对象 )
类:
(1)是对象的模板(对象根据类创建)
(2)类是客观存在的事物存在于人思维中的反映
例如:Thinkpad 笔记本
Thinkpad设计图 —— 类:只是一个思维中抽象的设计方式
通过设计图
Thinkpad笔记本的真实的个体 —— 每一个体都是对象:真实存在的
Java的面向对象(面向对象编程 OOP :Object(对象) Oriented Programming):是一种思想方式
类:抽象的设计——不具备内存空间的
对象:具体的,真实存在 —— 在内存上存在一块特定的储存空间
—— 实例化类:根据类在内存上创建一个特定的储存空间的过程
内存分区问题:
- 栈内存:不需要程序员主动申请内存空的,声明即存在,例如基本类型变量
- 堆内存:需要程序员主动的去申请内存空间,表现 new ,并且会在没被使用的时候 ,jvm垃圾回收器会自动回收销毁
- 静态储存区: static修饰的会存在与静态储存区
例如: Scanner sc =new Scanner(System.in);
栈内存 堆内存
面向对象编程 oop:
面向过程编程:只在乎程序的执行流程(方法之间的调用顺序); 代表C语言
例如:xxx书店系统,只要有方法并按照特定流程调用程序就可以运行
面向对象编程:在乎的个体的,对事物共性的提取; 代表 java
类的构成(提取的共性):由成员属性和成员方法构成
成员属性:就是声明/定义的变量
成员方法:就是一个方法(基于该类创建的对象会做什么)
例如:定义一个人类:
public class People {
//成员属性—— 参数
String name;//姓名
String sex;//性别
String idCard;//身份证号
//…
//成员方法:—— 动作
public void sK(){
}
public void c(){
}
public void h(){
}
}
练习:
定义一个狗类:
成员属性 名字,品种,年龄,重量,是否会摇尾巴, 是否拆家 —— 属性变量类型合适
成员方法:跑,叫,打滚
创建对象(实例化类):通过关键字 new 调用类中的构造方法实现实例化类——创建对象
构造方法:构造方法用于实例化类创建对象
修饰符 + 类名(参数列表){
方法体
}
例如:
public Dog(){
}
注意:
- 每一个类中都存在一个默认的无参构造方法
- 构造方法没有返回值
- 如果自定义了构造方法,类不再默认提供无参构造方法
(如果存在自定义的有参构造方法,如果需要无参创建 则需要补充一个无参构造)
- 构造方法只有创建对象时候调用
构造方法用处:
1.创建对象必须调用构造方法
+
2.构造方法可以带参数的——有参构造方法
||
可以通过有参构造方法实现创建对象的同时给对象的属性赋值
构造方法 实现对像的赋值需要使用关键字 : this —指代当前创建对象
this的用法:
- this.成员属性 : 当前对象的属性
- this.成员方法(); 当前对象方法
使用对象的属性/方法 通过 对象名.属性/方法的方式
例如:
Dog dog = new Dog("dog1");
//.:对象.属性/方法 : 使用某个对象的方法/属性
System.out.println(dog.dogName);
类的初始化 与 类的实例化:
类的初始化:jvm加载类的过程叫做类的初始化
类的实例化:jvm根据类在内存上创建一个储存空间的过程叫做实例化
对象的创建 =类的初始化+类的实例化
注意:
- 类只会初始化一次,当jvm虚拟机调用(使用)该类的时候初始化<调用init方法实现初始化>
- 类的实例化,当jvm虚拟机根据类创建内存空间的就会执行,如果没有找到该类则先初始化,并给对象的属性初始默认值(除去boolean基本变量 0 ,boolean 为false,引用类型/对象 null 未定义)
反射机制:在运行状态中,对于任意一个类,都能获取这个类的属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取信息以及动态调用对象的方法的功能叫做java的反射机制
——通过反射,该类对于我们来说完全是透明的
写法:
类 名字 通过类名加载类 类的全限定名字=包名+类名
Class c =Class.forName(”org.xm7.javaday4.test.oop.Dog”);
——类的初始化
类 名字 = (强转) 实例化对象
Dog d = (Dog) c.newInstance();——实例化类
注意:newInstance使用无参构造方法
对象的引用:
对象是创建于堆内存上的一个内存空间
例如:
【栈内存】Dog g = new Dog();【堆】—— 对象
通过打印得到:org.xm7.javaday4.test.oop.Dog@15db9742
—内存地址
栈内存上的声明实际存储的是堆内存的一个地址
每次实例化出来的对象才是唯一, 赋值给声明的只是一个路径,路径不变,对象不变
代码块与内部类
内部类:—— 类内部的类:类里面套着一个类
源文件结构:
公开类只有一个并且与源文件名字相同
一个源文件中可以存在多个类,根据结构可以分为平行类 与 内部类与外部类
平行类:同级的多个类叫做平行类
例如:
public class NBL {
}
//平行类
class c2{
}
内部类与外部类:存在上下级的关系的类叫做内部类
例如:
//外部类
public class NBL {
//内部类
class c1{
}
}
内部类又分为【扩展】:
成员内部类:就是与成员属性和成员方法平级的类叫做类的成员内部类,
注意:
1) .可以直接使用外部类的任意属性与属性方法,外部类想使用内部类的属性方法,需要实例化内部类对象
例如:
public void A(){
System.out.println("我是A方法");
c1 c=new c1();//外部使用内部方法/属性创建其对象
c.C1A();
}
//成员内部类:可以直接使用外部类的任意属性与属性方法
class c1{
public void C1A(){
A();//可以直接使用外部类的方法/方法
name="111";
}
}
2).如果其他类使用某个内部类,先创建其外部类对象再创建其内部类对象
例如:
NBL.c1 c=new NBL().new c1();//先创建外部对象再创建内部对象
或者
NBL n=new NBL();
c1 c2=n.new c1();
静态内部类:static【静态】 修饰的内部类就是静态内部类
注意:
1.可以直接使用外部类的静态属性,与静态方法,外部类想使用内部类的属性方法,需要实例化内部类对象
//外部类
public class NBL {
String name;
static String name2;
public void A(){
System.out.println("我是A方法");
c3 c =new c3();
c.c3A();
}
public static void A2(){
System.out.println("我是A方法");
c3 c =new c3();
c.c3A();
}
//静态内部类
static class c3{
public void c3A(){
name2="1";
A2();
}
}
}
2.其他类使用该静态内部类,先创建外部类对象再创建内部类
public static void main(String[] args) {
NBL.c3 c3=new NBL().new c3();
c3.c3A();
}
局部内部类:创建与方法/代码块内的类叫做局部内部类,
局部:只作用于一段代码
全部:作用于整个类的任意代码
//外部类
public class NBL {
String name;
static String name2;
public void A(){
//局部内部类
class c4{
}
}
}
匿名内部类:没有名字的类叫做匿名内部类,一般用于抽象类和接口类的实例上
//外部类
public abstract class NBL {
String name;
static String name2;
public abstract void A();
public static void main(String[] args) {
NBL n =new NBL() {//紫色部分为匿名内部类
@Override
public void A() {
// TODO Auto-generated method stub
}
};
}
}
内部的作用:用于类的内部空间的划分
例如: 人 男人女人的属性不同
Class people{
Class nv{
//女人的属性方法
}
Class nr{
//男人的属性
}
//共有属性方法
}