java中面向对象的一些知识(一)
一:基本概念
举例:写一个程序,实现如下功能:
一群宠物,宠物有各种类型,如猫、狗、企鹅等
让这群宠物,按照各自的能力不同,进行各种比赛(如爬树、游泳、跳水);扩展性需求: 游泳比赛游泳池的参数、飞盘的大小和重量等 1.首先从里面抽象出名词性的概念(需求分析,抽取概念模型)
宠物、猫、狗、企鹅、比赛、能力、宠物类型 2. 把名词抽象成相应的class,或class的属性 3.提取动词 -------------------- 把这些动词,抽象成对象的行为
爬树、游泳、跳水
类和对象的关系:
类是用于描述同一类的对象的一个抽象的概念,类中定义了这一类对象所具有的静态属性和动态属性
类可以看成一类对象的模板,对象可以看成该类的一个具体实例。
下面看一段代码
package com.chen.biz;
/**
* 构建了一个宠物类
*
* @author 陈家小哥
*
*/
public class Pet {
private String name; // 宠物的名字
private String sex; // 宠物的性别 //构造函数(空的)
public Pet() {
// TODO Auto-generated constructor stub
}
/**
* 方法
* 宠物都可以玩游戏
* @param pet
*/
public void playGame(Pet pet){
}
}
构造函数:
创建一个对象,必须调用它的构造函数。当一个类中没有构造函数时,会自动生成一个空的构造函数。
构造函数的作用:给成员变量进行初始化。如果没有给成员变量初始化,系统会分配默认值给这些成员变量。
二:常量和变量
常量:永远不会改变(static final)
编译期常量(static final):在程序编译的时候,所有调用常量的位置,都被常量代表的值所替换 , 最大的好处是节省内存
程序运行期常量(final):一次赋值之后,永远不能改变
常量的命名一定要大写 ,如名字较长,用下划线进行间隔 SEX_MALE
变量
1.局部变量:通过参数传入或者在方法中定义
public void Play(String name){
string age; //局部变量
System.out.print(name); //name也是局部变量
}
局部变量的作用域是该变量所在的{} 。
局部变量的生命期:
基本类型:超出局部变量定义的{},就会被标识为无效,等待GC来回收。
引用类型:超出局部变量定义的{},会引用计数-1,如果引用计数为0,就会被GC下次扫描时回收。
2.成员变量(对象变量)
成员变量是定义咋方法外的变量。
public class Pet {
private String name; // 宠物的名字 成员变量
private String sex; // 宠物的性别 成员变量
/**
* 方法
* 宠物都可以玩游戏
* @param pet
*/
public void playGame(String cc){
System.out.println(cc);
}
}
成员变量的作用域:就是所在class内的所有方法
成员变量的生命期:与它所在的对象的生命期一致 在没有static静态变量的情况下程序运行顺序如下:
1.系统给属性赋默认值
2.用户在成员变量级直接赋默认值
3.在构造函数中对成员变量进行初始化。
static变量:
1.称为类变量,它是所有对象共享的内存;
2.不需要类的实例,可以直接通过类的名字调用。
3.作用域类似于全局变量
4.在第一次调用这个变量时,分配内存。 下面是几个小例子:
public class Test {
public static final double PAI = 3.1415926; //静态常量
public final double PAI2 = 3.1415926;//常量
public static double PAI3 = 3.1415926;//静态变量 public Test(){ }
}
public class Test {
public static final double PAI;
public final double PAI2;
public static double PAI3; public Test(){
this.PAI = 3.1415926; //错误,必须在定义时就赋值
this.PAI2 = 3.1415926; //可以,初始化赋值。
this.PAI3 = 3.1415926;//不可以 不能再构造方法中给静态变量赋值,因为静态变量加载时可能这个类并没有被加载。
}
}
public class Test {
public static final double PAI = 3.1415926;
public final double PAI2 = 3.1415926;;
public static double PAI3 = 3.1415926;;
public double PAI4 = 3.1415926; public static void test(){
this.PAI = 3.14;
this.PAI2 = 3.14;
this.PAI3 = 3.14;
this.PAI4 = 3.14; //均存在错误,因为静态方法中不可以用this关键字
}
}
public class Test {
public static final double PAI;
public final double PAI2;
public static double PAI3 = 3.1415926;; public static void test(){
PAI = 3.14; //编译期常量不能在这赋值
PAI2 = 3.14; //静态方法不能直接调用成员变量,原因是这个成员变量还没有分配内存,需要通过对象调用
PAI3 = 3.14; //静态方法调用静态变量OK
}
package com.chen.test;
/**
* 说出输出顺序
* @author 陈家小哥
*
*/
public class Test extends A {
int num = 7777;
private static A mm = new A();
static {
System.out.println("1111");
}
{
System.out.println("2222");
} public Test() {
System.out.println("3333");
}
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.num);
}
} class A {
int num = 5555; public A() {
System.out.println(num);
}
}
输出结果:
5555
1111
5555
2222
3333
7777
解释:当类被加载时,先初始化静态的变量,输出5555和1111,然后调用父类的构造函数,输出5555,然后输出2222,最后调用子类的构造函数,输出子类的成员变量。
java中面向对象的一些知识(一)的更多相关文章
- java中面向对象的一些知识(二)
一. 封装的讲解 什么是封装?为什么要封装?怎么实现封装? 封装的目的是为了提高程序的安全性.封装就是把不想让第三者看的属性,方法隐藏起来. 封装的实现方法是: 1.修改属性的可见性,限制访问. 2. ...
- Java中面向对象三大特征
也就是说在这里"人"是多态的, 在不同的形态时,特征行为是不一样的, 这里的"人", 同时有两种形态,一种是教师形态,一种是学生形态,所对应的特征行为分别是&q ...
- java中面向对象的三大特性小结
java中面向对象的三大特性:封装.继承.多态 封装 把抽象的数据和对数据的操作封装在一起,隐藏变量的实现细节.数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法)才能对数据进行访问. 1 ...
- 关于Java中面向对象章节、IO 流中的重点基础知识。
一.面向对象的三大特征,以及作用. 答:面向对象的三大特征即,封装性.继承性.多态性. 其分别的作用为 : 封装作用:将数据封装起来,提高数据的安全性, 继承作用:提高代码的复用性,减少冗余代码. 多 ...
- Java中面向对象的理解
按照惯例,先做一个简单的介绍,现在开始学习 Thinging in Java 4 ,一边看,一边记录,我都不想给自己设定时间安排了,毕竟很少实现过.所以就这样吧!不定期的更新,我都会放到博客中的. 所 ...
- java中的字符串相关知识整理
字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...
- JAVA中面向对象
一.方法: 1.方法概述: 在JAVA中,方法就是用来完成解决某件事情或实现某个功能的办法. 2.方法的语法格式: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,.....){ ...
- 2017.12.25 Java中面向对象思想的深刻理解
今日内容介绍 1.面向对象思想 2.类与对象的关系 3.局部变量和成员变量的关系 4.封装思想 5.private,this关键字 6.随机点名器 01面向对象和面向过程的思想 * A: 面向过程与面 ...
- [转]java中的字符串相关知识整理
字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...
随机推荐
- .net core 源码解析-web app是如何启动并接收处理请求
最近.net core 1.1也发布了,蹒跚学步的小孩又长高了一些,园子里大家也都非常积极的在学习,闲来无事,扒拔源码,涨涨见识. 先来见识一下web站点是如何启动的,如何接受请求,.net core ...
- C#中Abstract和Virtual的区别
c# 中 Abstract和Virtual比较容易混淆,都与继承有关,并且涉及override的使用.下面讨论一下二者的区别: 一.Virtual方法(虚方法) virtual 关键字用于在基类中修饰 ...
- Dubbo_异常_Service启动时默认将方法注册到内网IP
一.背景 一般Dubbo服务都是通过内网调用,Dubbo服务启动时默认会将服务注册到内网IP,消费端就无法从外网访问. 二.解决过程 1.Linux的hosts中设置外网IP a) 通过hostnam ...
- 菜鸟git学习
基础知识: 安装github之后,所有的命令在git shell 中输入. E:\文档\GitHub [master +2 ~0 -0 !]> cd [ToDoList]E:\文档\GitHub ...
- 发送ajax请求时页面被刷新
浏览器默认会认为 button 的属性是submit.type='submit',会发生提交表单的默认行为,为button添加type="button"即可.
- JavaScript系列文章:自动类型转换
我们都知道,JavaScript是类型松散型语言,在声明一个变量时,我们是无法明确声明其类型的,变量的类型是根据其实际值来决定的,而且在运行期间,我们可以随时改变这个变量的值和类型,另外,变量在运行期 ...
- 纯JS判断各种浏览器类型及版本.
IE11或者非IE if (!document.all) { alert('IE11+ or not IE'); } IE10 if (document.all && document ...
- oracle--存储过程--bai
--1 无入参最简单的存储过程 create or replace procedure hello_proc as v_name varchar2(20); v_age number; begin v ...
- 几种常见的Shell
Unix/Linux上常见的Shell脚本解释器有bash.sh.csh.ksh等,习惯上把它们称作一种Shell.我们常说有多少种Shell,其实说的是Shell脚本解释器. bash bash是L ...
- Make 命令教程
http://www.ruanyifeng.com/blog/2015/02/make.html 作者: 阮一峰 日期: 2015年2月20日 代码变成可执行文件,叫做编译(compile):先编译这 ...