本文内容:

  • 什么是面对对象
  • 类的定义与对象实例化
  • 成员变量
    • 成员变量的有效范围
    • 成员变量的赋值
  • 静态变量、方法与实例变量、方法
  • 构造函数
  • 封装与私有
  • this关键字

注:函数和方法是一样东西。【由于我之前学习的时候有些书籍不是同样的说法,书看多了,我就习惯了不同情况下用不同的说法】

首发时间:2018-03-22


什么是面对对象:

  • 面向对象强调行为处于对象之中,并不直接执行行为,而是通过对象执行行为
  • 类是对象的抽象,对象是类的具体实例。 【可以说,人是一个类,而不同身份的你我他是一个具体实例。人这个类抽象出了我们人类共有的属性,而我们人是人类的各种属性的具体实例结果。】
  • 面向对象的基本特征:封装,继承,多态
    • 封装:比如一个对象把它的属性和方法都封装起来的话,它执行的属性和方法都是这个对象的,而不是其他对象的。
    • 继承:子类可以继承父类的属性和方法。比如“人类”继承了“哺乳类”的属性和方法,又增添人类独有的属性和方法。
    • 多态:一种多态是指同一个操作被不同对象执行时有不同的结果(比如:狗的say是“汪汪汪”,而猫的是"喵喵喵");另一种多态是根据对象的传入而决定执行不同的方法。【本质上这两个是一样的】


类的定义与对象实例化:

类的定义:

  • 类的定义包括两部分:类声明和类体
  • 类是java程序的基本要素
  • 定义类的格式:
    • 修饰符可以是public 或空: public代表即使不同包也能访问该类;而空代表只能该类只能在同一个包内访问。
    • 类体的内容包括变量的生命和方法的定义。【所以单独的定义是错误的,只能声明并同时定义】

对象实例化

  • 类的实例化就是创建一个对象:
    • 创建对象:类名 变量名 =new 类名()【类名()可以传入一些参数来初始化对象,由类的同名方法(构造方法,下面讲)定义能传入什么参数】
      • 匿名对象:简单来说就是没有变量名的实例化,直接使用new 类名()来执行操作,由于没有变量名来特异的标记一片内存空间,所以匿名对象一般只使用一次,比如new Dog().hello();
    • 调用方法或变量:对于实例方法或变量的可以直接使用对象来调用;而对于静态方法或变量,既可以使用对象,也可以使用类来调用。
class Dog{
String name;
int foot=4;
Dog(){//这是一个构造函数
this.name="旺财";
}
void hello() {
System.out.println("hello,this is a dog");
}
static void static_hello() {
System.out.println("hello,this is a dog too");
} } public class Demo { public static void main(String args[]) { Dog d=new Dog();
System.out.println(d.foot);//4
d.hello();//hello,this is a dog
d.static_hello();//hello,this is a dog too
Dog.static_hello();//hello,this is a dog too }
}

成员变量:

成员变量的有效范围

  • 成员变量在整个类范围内有效,与变量声明的位置无关。方法中的局部变量从声明它的位置开始生效,并且只在方法体内有效。

  • 当局部变量跟成员变量同名时,如果想特别的使用成员变量,可以使用“this.变量名”
  • 成员变量有默认值,而局部变量没有默认值。

成员变量的赋值:

  • 可以使用构造函数来对一些成员变量初始化

  • 如果成员变量不是私有的,也可以直接取得变量名来赋值,比如dog.age=18

静态变量、方法与实例变量、方法:

根据变量、方法是否有static修饰可以分为实例变量,实例方法和静态变量(类变量),静态方法(类方法)

  • 静态变量,静态方法:

    • 被static修饰的成员的特点:

      • 随着类的加载而加载,优先于对象存在,静态成员内存位于方法区

      • 被所有对象所用享【所以可称为类变量或类方法】

      • 可以直接类名调用

      • 静态方法只能访问静态成员

      • 静态方法中不可以写this,super关键字

  • 实例变量、实例方法:

    • 实例变量、实例方法是对象的变量和方法,对象操作变量或方法也只是操作自己的变量或方法,不会影响其他对象。

实例变量\方法跟静态变量\方法的区别好比:“泰迪狗类”比如有一个共有属性“狗种类名”,那么这个属性应该是所有泰迪狗都有的,并且是泰迪狗共享的,如果某一天人类想改泰迪狗的种类名称,那么应该是所有泰迪狗都改的(静态的);而每一只泰迪狗都有自己的主人,这是由每一只狗自身决定的,所以这是特有属性,即使这只狗换了主人,也不会影响别的狗。(实例的)


构造函数:

  • 构造函数是类中的一种特殊函数,构造函数的名字与类的名字相同,而且没有类型。

  • 构造函数负责对类对象的特定属性初始化。【比如每一只狗对象都有不同的名字,而狗类是一个模板,是没有名字的,而构造函数可以做到给狗定义名字。】
  • 类中可以有多个构造函数,它们以函数重载的方式存在。
  • 构造函数是没有类型的,是直接以“ 类名(){}” 作为函数。
  • 类中会默认有一个无参数的构造函数,如果定义了其他构造函数,那么这个默认的无参构造函数就会不默认存在了。
class Dog{
String name;
Dog(){
this.name="旺财";
}
Dog(String name){
this.name=name;
}
}
public class Init_usage { public static void main(String args[]) { Dog d3=new Dog();
Dog d4=new Dog("小菜");
System.out.println(d3.name);
System.out.println(d4.name);
}
}

补充:

  • 构造函数之间可以相互调用,但要防止递归调用。

    • 调用其他构造函数来实现初始化在有多个变量需要初始化的时候有明显的代码节省。


封装与私有:

  • 类的封装的一个体现是变量和函数的私有化

  • 封装的准则:
    • 将不需要对外提供的内容都隐藏起来。

    • 将属性都隐藏,提供公共方法对其访问。
  • 私有化使类的非公共属性隐藏了起来,比如一个“人类”对象有自己的资产,一般只有自己才能知道自己有多少资产,并且不想直接给别人看到,但如果别人问题,还是会告诉别人的(隐藏了自己的资产情况,但是自己能够使用方法获得结果,这个方法是开放的,调用就是相当于别人问)。
  • 可以使用private来使变量和函数私有化,这样之后不能直接使用 对象.变量 或 对象.函数 来调用,只有对象内部的方法才能调用
  • 将变量或方法私有化之后,一般对外提供getXXX,setXXX方法进行访问,提高数据访问的安全性。
class Man{
private int money;
String name;
Man(String name,int money){
this.name=name;
this.money=money;
}
int getmoney(){
return money;
}
void setMoney(int money){
this.money=money;
} } public class Private_usage { public static void main(String[] args) {
Man m=new Man("lilei",2000);
System.out.println(m.name);//lilei
// System.out.println(m.money);//报错的,因为私有了,不能访问
// System.out.println(m.wife);//报错的,因为私有了,不能访问
System.out.println(m.getmoney()); //2000
m.setMoney(6000);
System.out.println(m.getmoney());//6000 } }

this关键字:

  • this代表当前对象(调用函数时代表当前调用该函数的对象),比如在类中可以使用this.XXX来调用对象自己的变量或方法。

  • 当局部变量和成员变量同名时,可以用this关键字区分,this.XXX代表使用对象自身的变量
  • 类中的成员变量默认是带有this前缀的,但遇到同名时必须加以区分。

  • this加上参数列表(this(参数))的方式就是访问本类中符合该参数的构造函数

  • 用于调用构造函数的this语句必须放在第一行,因为初始化动作要优先执行

class Person{
String name;
int age;
Person(String name,int age){
this.name=name;
this.age=age;
}
void hello() {
this.sysprint();
// sysprint();
}
void sysprint() {
System.out.println("hello world!");
}
} public class This_usage {
public static void main(String args[]) {
Person p1=new Person("lilei",18);
p1.hello();//hello world! } }

Java:【面向对象:类的定义,静态变量,成员变量,构造函数,封装与私有,this】的更多相关文章

  1. Android-Java-静态成员变量&成员变量&局部变量(内存图&回收机制)

    静态成员变量(回收机制) StaticDemo 和 MyDemo package android.java.oop13; class MyDemo { /** * 定义一个静态变量 */ public ...

  2. Java面向对象——类的成员

    Java面向对象——类的成员 摘要:本文主要介绍了类的常见成员. 属性 属性称为成员变量,一般来讲不用赋值,因为有默认值,另外显式赋值没有意义会导致所有由此类创建对象都是此值. 默认值 Boolean ...

  3. java 静态代码块 代码块 构造函数 静态成员变量 成员变量的初始化顺序

    没有父类的情况 1,静态代码块-->静态成员变量-->成员变量(实例属性)-->代码块-->构造函数 2, 静态代码块 和 静态成员变量 只会初始化一次 有父类的情况 1,父类 ...

  4. Java面向对象——相关基本定义

    Java面向对象——相关基本定义 摘要:本文简单介绍了面向对象的编程方式,以及与之有关的一些基本定义. 面向对象 什么是面向对象 面向对象编程是一种对现实世界建立计算机模型的一种编程方法.简称OOP( ...

  5. Java面向对象-类与对象

    Java面向对象-类与对象 类与对象的关系 我们通俗的举个例子,比如人类是一种类,张三这个人就是人类的具体的一个个体,也就是java中的对象:这就是一个类与对象的关系: 类的定义 下面看实例 类的创建 ...

  6. Java反射理解(四)-- 获取成员变量构造函数信息

    Java反射理解(四)-- 获取成员变量构造函数信息 步骤 获取成员变量信息: obj.getClass() 获取类类型对象 成员变量也是对象,java.lang.reflect.Field 类中封装 ...

  7. Java基础 - 面向对象 - 类的定义

    package mingri.chapter_6; import java.util.Scanner; public class Person { /* * 类变量 * 定义方法: * 数据类型 变量 ...

  8. java 面向对象 — 类和对象

    构造方法 1.构造器必须与类同名(如果一个源文件中有多个类,那么构造器必须与公共类同名) 2.每个类可以有一个以上的构造器 3.构造器可以有0个.1个或1个以上的参数 4.构造器没有返回值 5.构造器 ...

  9. Java面向对象--类和对象

    面向对象是相对于面向过程而言的,是软件开发方法.面向对象把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统设计,更贴近事物的自然运行模式.本篇博客介绍Java面向对象的类和对象 目录: 面 ...

  10. Java面向对象~类和对象&方法,类方法

    面向对象 概念:     1.同一类事物的抽象描述,不是具体的    2.类和对象的关系:        类 是抽象的.        对象 是具体的.    3.对象的体征,称为"属性&q ...

随机推荐

  1. Scala + IntelliJ IDEA

    学习路上的新起点:大数据Scala + Spark +(HDFS + HBase),本文主要介绍下Scala的基本语法和用法吧.最后再简单介绍一种Java开发工具IntelliJ IDEA的使用. S ...

  2. jquery 回车键实现表单提交

    JQery http://jquery.cuishifeng.cn/keydown.html 键盘事件参考:1.keydown()keydown事件会在键盘按下时触发.2.keyup()keyup事件 ...

  3. 从零开始学 Web 之 Ajax(三)Ajax 概述,快速上手

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  4. CSS 基础:CSS 工作原理(2)<思维导图>

    这段时间利用一下间隙时间学习了CSS的基础知识,主要目的是加深对CSS的理解,虽然个人主要工作基本都是后台开发,但是个人觉得系统学习一下CSS的基础还是很有必要的.下面我学习CSS时做的思维导图(全屏 ...

  5. 附实例!实现iframe父窗体与子窗体的通信

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由前端林子发表于云+社区专栏 本文主要会介绍如何基于MessengerJS,实现iframe父窗体与子窗体间的通信,传递数据信息.同时本 ...

  6. 【P2P浏览器】跟大家讨论一个想法

    内容分享者通过这个浏览器来创建自己待分享的内容 任谁看了这些内容,就会在本地保存一份,成为一个节点只要任一个节点在线,别人就能看这些内容在线的节点越多,获取这些内容的速度越快 任何使用这个浏览器的人, ...

  7. Struts2学习(二)———— 表单参数自动封装和参数类型自动转换

    前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...

  8. C# GDI+编程之绘图

    在了解绘图之前,我们先讲几个预备知识 一.坐标系 坐标系是图形设计的基础.GDI+使用三个坐标空间:世界.页面和设备,其中,世界坐标是用于建立特殊图形世界模型的坐标系,也是在.NET Framewor ...

  9. loggin(日志模块)

    这是一个提供日志功能的模块,它可以让你更敏捷的为你程序提供日志功能 一.常用日志记录场景及最佳解决方案: 日志记录方式 最佳记录日志方案 普通情况下,在控制台显示输出 print()报告正常程序操作过 ...

  10. 将不确定变为确定~老赵写的CodeTimer是代码性能测试的利器

    首先,非常感谢赵老大的CodeTimer,它让我们更好的了解到代码执行的性能,从而可以让我们从性能的角度来考虑问题,有些东西可能我们认为是这样的,但经理测试并非如何,这正应了我之前的那名话:“机器最能 ...