关闭

面向对象(五)

标签: 面向对象java基础
204人阅读 评论(0) 收藏 举报
分类:

面向对象

07.08


理解访问修饰符 (信息隐藏)

被访问被调用的范围
- public :全部
- 默认 :同包
- protected :同包或有继承关系的类
- private :只有同类

在A类中定义属性和方法:

  • public:这个类的实例化对象可以访问;
  • 默认: 如果在同包下定义一个主类,然后在主类的主方法里面new A的一个对象出来,则这个对象可以访问被默认修饰的属性和方法;
  • protected:在同一个包下的类中new的A类对象和继承了A类的相同或不同包下的子类中new A类对象,这个对象能调用A类中所有的属性和方法(不同包下没有继承关系的类不能访问)
  • private:只有这个类中的属性和成员方法能访问

geter和setter更深入理解

  • 当把类的属性和方法访问权限设置为private时,一般都提供上面2个公共方法;
    在这2个方法体内,可以添加一些限制代码;
    比如说setter方法,需要用户输入账号密码才有权限修改
    getter也可以这么做,还可以在返回值的时候做一些动作;
    这就是隐藏.
  • 也可以用private修饰setter方法,那么这个属性就是只读;
  • 用private修饰getter方法,这个属性就是只写;

封装的好处

  1. 类的成员变量可以成为只读或只写
  2. 类可以对存储在其成员变量中的内容有一个整体的控制
  3. 类的用户不需要知道类是如何存储数据的

static关键字 (类级别的,与对象无关)

  1. static修饰的全局变量叫静态变量,也叫类变量,被所有的对象所共享,用类名.属性访问;
  2. static修饰的方法叫静态方法,即类方法;可以直接用类名.方法访问;
  3. 类只能使用类方法,而不能使用静态变量;
  4. 类加载以后就存在内存中了,在mian方法执行之前;
  5. 用static修饰的变量存在堆内存的数据段的静态区中

public static final int MAX = 100;

常量属性定义为static,节约空间
final:因为用final修饰,所以是个常量
public:因为是常量,所以不能更改,public修饰给别人看也没事
static:共享,这样就不用new出来才能使用;

  • 静态方法只能访问或调用静态属性和静态方法
  • 非静态方法法既能访问调用非静态属性和方法,也能访问静态方法和属性
    原因:静态属性和方法在类加载的时候就加载到内存中了,而非静态属性和方法必须绑定在对象上,而对象必须先实例化才能调用;
    如果用静态方法访问非静态属性,但是内存中却不存在非静态属性,所以编译器会报错.

代码块

静态初始化块

  • 语法:static {语句1;语句2;…;};
  • 调用顺序:当类被JVM的类加载器加载的时候执行,
    只加载一次,因为JVM只加载一次类.

实例化初始化块

  • 语法:{语句1;语句2;…;};
  • 调用顺序:在类的对象每次实例化的时候执行一次,在构造器之前调用;
class A {
    public String name = "成员属性" ;
    static {
        System.out.println("静态初始化块");
    }

    {
        this.name = "name";
        this.age  = 26;
        System.out.println("实例初始化块内");
        System.out.println(this.name);
        System.out.println(this.age);
    }
    public int age = 10;

    public A ( ) {
        System.out.println("构造方法内");
        System.out.println(name);
        System.out.println(age);
    }
}
//主方法 
class ClassName {
    public static void main(String[] args) {
        new A();
    }
}

输出结果 :
静态初始化块
实例初始化块
name
26
构造方法内
name
10

步骤:
1. 执行到new A();时,加载A.class到内存中;
2. static随着类的加载而创建(在堆内存的数据段中的静态区中,存放的是静态变量和静态方法,常量存放在堆内存的数据段的常量池中)
3. 输出 静态初始化代码块
4. 执行构造方法时要做的事:

  • 在堆内存中申请内存;(size = int + String)
  • 分配这块内存;(给name分配4字节空间,因为它是一个引用;给age分配4个字节);
  • 初始化这块内存中的变量,name="成员属性";age=10;
  • 调用实例初始化代码块,执行代码块中的语句 name = name,age=26;
  • 执行实例代码块后面的语句;public int age = 10;
  • 执行构造方法内的语句 输出nameage的值;

内部类 (先大概了解)

  • 在类的里面再定义一个类,这个类就叫内部类;
  • 它是一个独立的类;
  • 可以产生对象使用;
  • 编译后又独立的class文件;
    • classA$1classB –>是局部内部类;(比成员内部类少了一个数字,因为一个类有多个方法,在不同的方法里面可以定义相同名字的内部类,为了区分,编译器自动为我们添加你一个数字作为区分)
    • classA$classB –>是成员内部类;(把成员内部类作为外部类的属性,属性当然不能重名了,所以成员内部类的名字不能相同)

分类

  • 成员内部类 –>定义在外部类中方法外面的类;
    • 静态内部类:(成员内部类的一种)
  • 局部内部类 –>定义在外部类的方法里面,定义的时候不能加访问修饰符
    • 匿名内部类:没名字,主要用于实现接口的方法.

为什么局部内部类不能用访问修饰符修饰?

从内存中看,当方法里的局部变量所在方法结束时,该变量即在栈内存中消失;而内部类其实是一个类,只有内存中对它的所有引用都消失后,该内部类才”死亡”,即内部类的生命周期可能比局部变量长。如果局部内部类能访问一般的局部变量,则在多线程中,可能当方法结束后,局部内部类(是线程类时)还在使用局部变量。为了避免方法内的变量脱离方法而存在的现象发生,于是java规定局部内部类不能访问一般的局部变量。但能访问被final修饰的局部变量。因为常量放在堆内存中的数据段的常量池中


0
0
查看评论

面向对象的三个基本元素,五大基本原则

三个基本元素: 1. 封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 2. 继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重...
  • u014745848
  • u014745848
  • 2016-03-02 22:32
  • 2206

面向对象三大基本特性,五大基本原则(上篇)

透切理解面向对象三大基本特性是理解面向对象五大基本原则的基础. 三大特性是:封装,继承,多态   所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性...
  • david840316
  • david840316
  • 2016-05-17 09:08
  • 838

java 面向对象 OO 反射 "六原则一法则"

1.获得一个类的类对象有哪些方式? 答: - 方法1:类型.class,例如:String.class - 方法2:对象.getClass(),例如:”hello”.getClass() - 方法3:Class.forName(),例如:Class.forName(“java.lang....
  • u010575093
  • u010575093
  • 2016-02-28 12:57
  • 822

面向对象五

第1章 构造方法1.1      构造方法介绍在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他的姓名、年龄等属性信息。那么,创建对象就要明确属性值,那怎么解决呢?也就是在创建对象的时候就要做的事情,当使用new关键字创建对...
  • qq_36084681
  • qq_36084681
  • 3天前 10:27
  • 4

面向对象五

1、继承:is a 继承作用: A、提高代码的复用性,简化代码; B、让类与类之间产生了关系,有了这个关系,才有了多态的特征。 继承注意点: A、千万不要为了获取其他类的功能,简化代码而继承; B、必须是类与类之间有所属关系才可以继承,所属关系is a。 2、继承2 继承特点: A、继承不支持多继承...
  • luxiangzhou
  • luxiangzhou
  • 2013-05-18 16:58
  • 504

面向对象(五)

1、多态概述       在同一个方法中,由于参数类型不同而导致执行效果各异的现象就是多态。在Java中为了实现多态,允许使用一个父类类型的变量来引用一个子类类型的对象,根据被引用子类对象的特征的不同,得到不同的运行结果。       ...
  • fs19890523
  • fs19890523
  • 2016-09-07 10:07
  • 53

黑马程序员----十-面向对象五

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- ========================================== 10-01-01 ========================================== ...
  • cs930923
  • cs930923
  • 2016-01-26 11:24
  • 52

javaScript 面向对象-继承(五)

原文来自  博客园 -三生石 JavaScript继承详解 这里只是做资料整理 详情请见原文
  • u011417072
  • u011417072
  • 2014-04-23 16:29
  • 377

javascript面向对象技术基础(五)

<br />类变量/类方法/实例变量/实例方法<br /> 先补充一下以前写过的方法:<br /> 在javascript中,所有的方法都有一个call方法和apply方法.这两个方法可以模拟对象调用方法.它的第一个参数是对象,后面的<br /> ...
  • drgreentea
  • drgreentea
  • 2010-08-11 15:11
  • 91

javascript面向对象(五)

标题 function Flyer(name,speed){ this.name=name; this.speed=speed; } Flyer.prototype.fly=function(){ ...
  • qq_25707185
  • qq_25707185
  • 2016-10-30 13:11
  • 52
    个人资料
    • 访问:11149次
    • 积分:383
    • 等级:
    • 排名:千里之外
    • 原创:28篇
    • 转载:1篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论