javaDay4_面向对象

面向对象:

对象:任何一个客观存在的事务都是对象   

例如:一个人(每个人都是一个独立的个体 ——  一个对象 )

类:

(1)是对象的模板(对象根据类创建)

(2)类是客观存在的事物存在于人思维中的反映

例如:Thinkpad 笔记本

        Thinkpad设计图 —— 类:只是一个思维中抽象的设计方式

                   

                                            通过设计图

       Thinkpad笔记本的真实的个体 —— 每一个体都是对象:真实存在的

Java的面向对象(面向对象编程  OOP :Object(对象)  Oriented  Programming):是一种思想方式

   

类:抽象的设计——不具备内存空间的

对象:具体的,真实存在  —— 在内存上存在一块特定的储存空间

——  实例化类:根据类在内存上创建一个特定的储存空间的过程

内存分区问题:

  1. 栈内存:不需要程序员主动申请内存空的,声明即存在,例如基本类型变量
  2. 堆内存:需要程序员主动的去申请内存空间,表现 new  ,并且会在没被使用的时候 ,jvm垃圾回收器会自动回收销毁
  3. 静态储存区: 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. 构造方法没有返回值
  3. 如果自定义了构造方法,类不再默认提供无参构造方法

(如果存在自定义的有参构造方法,如果需要无参创建 则需要补充一个无参构造)

  1. 构造方法只有创建对象时候调用

构造方法用处:

1.创建对象必须调用构造方法

                    +

2.构造方法可以带参数的——有参构造方法

                    ||

可以通过有参构造方法实现创建对象的同时给对象的属性赋值

构造方法 实现对像的赋值需要使用关键字 : this —指代当前创建对象

this的用法:

  1. this.成员属性 : 当前对象的属性
  2. this.成员方法(); 当前对象方法

使用对象的属性/方法 通过  对象名.属性/方法的方式

例如:

Dog dog = new Dog("dog1");

//.:对象.属性/方法 : 使用某个对象的方法/属性

System.out.println(dog.dogName);

类的初始化 与 类的实例化:

类的初始化:jvm加载类的过程叫做类的初始化

类的实例化:jvm根据类在内存上创建一个储存空间的过程叫做实例化

对象的创建 =类的初始化+类的实例化

注意:

  1. 类只会初始化一次,当jvm虚拟机调用(使用)该类的时候初始化<调用init方法实现初始化>

  1. 类的实例化,当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{

     //男人的属性

}

 //共有属性方法

}

  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这是程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值