Java学习笔记(面向对象1)
2015-11-14 13:39
274 查看
面向对象
1.何为面向对象
面相对象是相对面向过程而言的面相对象和面向过程都是一种思想
面向过程
强调功能行为
面向对象
将功能封装进对象,强调具备了功能的对象。
面向对象是基于面向过程的。
2.类与对象
类就是对现实生活中事物的描述;对象则是这类事物,实实在在存在的个体;
描述类时,有属性(成员变量)和行为(成员方法);
成员变量与局部变量
成员变量作用于整个类中;
局部变量作用于函数中或者语句中;
成员变量在堆内存中,因为对象的存在才在内存中存在;
局部变量在栈内存中
3.匿名对象
使用:当对对象的方法只调用一次,可以使用匿名对象来完成,这样较为简化;若对一个对象进行多个成员调用,必须给这个对象起个名字;
可以将匿名对象作为实际参数进行传递。
4.封装
封装:指隐藏对象的属性和实现细节,仅对外提供公共访问方式;好处:
将变化隔离
便于使用
提高重用性
提高安全性
封装原则:
将不需要对外提供的内容都隐藏起来
把属性都隐藏,提供公共方法对其访问
4.1 private
私有只在本类中有效一个成员变量(私有属性)通常对应两个访问方式,一个是设置set一个是获取get;
局部变量必须初始化值,成员变量不需要初始化值,有系统默认
5.构造函数
5.1特点:
函数名与类名相同不用定义返回值类型
不可以写return语句
5.1作用:
给对象进行初始化。即对象一建立,就会调用与之对应的构造函数5.3注意:
默认构造函数的特点;多个构造函数是一重载的方式存在的;
当一个类中没有定义构造函数,系统会默认给该类加入一个空参数的构造函数;
构造函数在对象一建立就运行,给对象初始化,而一般函数是对象调用才执行,给对象添加对象具备的功能;
一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次;
当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中;
5.4构造代码块
作用:给对象进行初始化,对象一建立就运行,并优先于构造函数执行构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化
6.关键字
6.1 this关键字
作用:用于区分局部变量和成员变量同名的情况;this代表本类的对象;哪个对象调用this所在的函数,this就代表哪个对象;即this代表它所在函数所属对象的引用
应用:
当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示对象
构造函数之间调用只能使用this关键字;
this的调用必须放在构造函数第一句,因为初始化要先执行;
6.2 static关键字
6.2.1 作用:
修饰符,用于修饰成员(成员变量,成员函数),被修饰后成为类变量;当成员被静态修饰后,便多一个调用方式,除了可以被对象调用外,还可以直接被类名调用(类名.静态变量)。
6.2.2 特点:
static修饰的变量存在于随着类的加载而加载,随着类的消失而消失;说明其生命周期最长;优先于对象存在,即静态是先存在的,对象是后存在的;
被所有对象共享
可直接被类名所调用
ps:实例变量与类变量的区别
存放位置
类变量随着类的加载而存在于方法区中;实例变量随着对象的建立而存在于堆内存中;
生命周期
类变量生命周期最长,随着类的消失而消失;
实例变量生命周期随着对象消失而消失;
6.2.3 使用注意事项:
静态方法只能访问静态成员;非静态方法既可以访问静态也可以访问非静态;静态方法中不可以定义this,super关键字,因为静态优先于对象存在;
主函数为静态。
6.2.4 优缺点:
优点:对对象的共享数据进行单独空间的存储,节省空间,没必要对每一个对象都存储一份;
可以直接被类名调用。
缺点:
生命周期过长;
访问出现局限性(只能访问静态)。
6.2.5 何时使用:
何时定义静态变量(类变量):当对象出现共享数据时,该数据被静态所修饰,对象中的特有数据要定义成非静态存在于堆内存中;只要数据在对象中都是不同的,就是对象的特有数据,必须存储在对象中,是非静态的。如果是相同的数据,对象不需要做修改,只需要使用即可,不需要存储在对象中,定义成静态的。
何时定义静态函数:当功能内部没有访问非静态数据(对象的特有数据),则该功能可以定义为静态的。
简单点说,从源代码看,该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的。如果不需要,就可以将该功能定义成静态的。当然,也可以定义成非静态,但是非静态需要被对象调用。如果没有访问特有数据的方法,该对象的创建是没有意义。
6.2.5 静态的应用:
每个应用程序中都有共性的功能,可以将这些功能进行抽取,独立封装,以重复使用6.2.5 静态代码块:
特点:随着类的加载而执行,只执行一次,用于给类进行初始化;
优先于主函数执行;(如例1)
只有类 加载的时候才会执行静态代码块。(如例2)
例1
class StaticCode{
static
{
System.out.print(“a”);
}
}
class StaticCodeDemo{ static { System.out.print("b"); } public static void main(String[] args) { new StaticCode(); new StaticCode(); System.out.print("over"); } static{ System.out.print("c"); } }
输出结果:bcaover
例2
class StaticCode{
static
{
System.out.print(“a”);
}
public static void show(){
System.out.print(“show run”);
}
}
class StaticCodeDemo{ static { System.out.print("b"); } public static void main(String[] args) { StaticCode s = null; } static{ System.out.print("c"); } }
输出结果:bcover
By the way说一下构造代码块,如下例:
class StaticCode{
int num = 9;
StaticCode()//构造函数,给对应对象初始化
{
System.out.println(“b”);
}
static { System.out.print("a");//静态代码块,给类初始化 } { System.out.print("c"+9);//构造代码块,给对象初始化 } StaticCode(int x)//构造函数,给对应对象初始化 { System.out.println("d"+x); } public static void show(){ System.out.print("show run"); } } class StaticCodeDemo{ public static void main(String[] args) { new StaticCode(4); } static{ System.out.print("e"); } }
输出结果:eac9d4
7.main函数
public static void mian(String[] args);主函数是一个特殊的函数,作为程序的入口,可以被jvm(虚拟机)调用。
主函数的定义:
public:代表该函数访问权限是最大的;
static:代表主函数随着类的加载就已经存在了;
void:主函数没有具体返回值;
main:不是关键字,但是是一个特殊字符,可以被jvm识别;
(String[] args):函数的参数,参数类型是一个字符串类型数组,该数组中的元素是字符串;
主函数为固定模式,jvm唯一识别格式
args为参数名,可更改;
jvm在调用主函数时,传入的是new String[0];
例如:
class MainDemo
{
public static void main(String[] args){
System.out.println(args);
}
}
执行结果:
例如1:
class MainDemo
{
public static void main(String[] args){
System.out.println(args.length);
System.out.println(args.[0]);
}
}
编译后输入数值:
例如2:
class MainDemo
{
public static void main(String[] args){
String[] arr ={“hehe”,”haha”,”heihei”,”xixi”};
MainTest.main(arr);
}
}
class MainTest(){
public static void main(String[] args){
for(int x=0; x
相关文章推荐
- Java中 对象克隆实例
- JDK和JVM
- 自己写的一个转换数字为中文大写形式的工具类
- Java基础之注解(annotation)
- 关于xml自定义颜色在xml布局的调用和java类中的调用
- Java泛型基础知识
- Java Web性能优化之一:减少DAO层的调用次数
- java按值传递理解
- [CareerCup] 14.4 Templates Java模板
- Java入门之数据类型以及变量的定义
- Java与Mysql开发中的特殊字符(包括Emoji)
- java.lang.IllegalArgumentException: Service Intent must be explicit异常说明
- java日志组件介绍(common-logging,log4j,slf4j,logback)
- java中Random()详解
- 解决spring、springMVC重复扫描导致事务失效的问题
- JavaFX透明窗口
- 如何给Spring MVC的action加上事务
- 利用java反射动态调整数组长度
- Spring中ServletContextAware接口使用理解
- Spring实例化Bean的三种方式及Bean的类型