黑马程序员_面向对象2
来源:互联网 发布:交易平台网站源码 编辑:程序博客网 时间:2024/04/27 22:24
------- android培训、java培训、期待与您交流! ----------
static(静态)关键字
a).Static用法:是一个修饰符,用于修饰成员(成员变量和成员函数);当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用。类名.静态成员;
b).Static特点
1.随着类的加载而加载,也就是说静态会随着类的消失而消失,说明他的生 命周期最长。
2.优先于对象存在。在这里需要明确一点就是:静态是先存在的,对象是后 存在的。
3.被静态修饰的成员,可以直接被类名所调用,也就是类名.静态成员。
4.被所有的数据共享。
c).实例变量和类变量的区别
Stringname//成员变量/实例变量;
Staticstring country=”cn”//静态变量/类变量;
1.存放的位置
类变量随着类的加载而存在于方法区中(共享区/数据区);
实例变量随着对象的建立而存在于堆内存中。
2.生命周期
类变量的生命周期最长,随着类的消失而消失;
实例变量的生命周期随着对象的消失而消失。
d).静态使用的注意事项
1.静态方法只能访问静态成员。
非静态的方法即可以访问静态也可以访问非静态。
2.静态方法中不可以定义this、super关键字
因为静态优先于对象存在,所以静态访问中不可以出现this、super。
e).静态的优点与缺点
优点:1.对对象的共享数据进行单独空间的存储,节省空间,没有必要每一 个对象中都存储一份。
2.可以直接被类名所调用。
缺点:1.生命周期过长2.访问有局限性(静态虽好,只能访问静态)。
f).什么时候使用静态?
因为静态修饰的内容有成员变量和成员函数,所以要从两个方面来说。
1.什么时候定义静态变量(类变量)呢?
当数据出现共享数据时,该数据被静态所修饰,对象中的特有数据要定义 成非静态存在于堆内存中。
2.什么时候定义静态函数呢?
当功能内部没有访问到非静态数据(对象的特有数据),那么该功能就可以 定义成静态的。
g).关于静态举个例子,如下
classPerson
{
private Person(){}
private String name = "hah";
private int age;
private static String country = "cn";//将静态变量私有
Person(String name,int age)//构造函数
{
this.name = name;
this.age = age;
}
{
System.out.println(name+".."+age);
}
public void setName(String name)
{
this.name = name;
}
public void speak()
{
System.out.println(this.name+"..."+this.age);
}
public static void showCountry()//静态函数
{
System.out.println("country="+Person.country);
Person.method();//类名.静态方法
}
public static void method()
{
System.out.println("methodrun");
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p = newPerson("zhangsan",20);
p.setName("lisi");
new Person();
}
}
h).静态代码块
就是一个由静态关键字标示的一个代码块区域,定义在类中。
作用:是用于给类进行初始化的,随着类的加载而执行,只执行一次,并优先于主函数。
i).代码块相关知识点
1.普通代码块
当方法执行结束时,在方法体中的变量就会消失。
2.构造代码块
构造代码块在对象建立的同时,就会执行。
3.静态代码块
在定义一个类时,如果希望一使用这个类,就执行一段代码,那么就可以将代码放在静态代码块中。静态代码块在类加载时就执行。
j).静态代码块、构造代码块、构造函数同时存在时的执行顺序:静态代码块---> 构造代码块---->构造函数.
k).练习,写出程序运行的结果并作简单的分析。
class Parent {
//静态变量
public static String p_StaticField="父类--静态变量";
// 变量
public String p_Field="父类--变量";
//静态初始化块
static {
System.out.println(p_StaticField);
System.out.println("父类--静态变量初始化块");
}
//初始化
{
System.out.println(p_Field);
System.out.println("父类--初始化块");
}
Parent(){
System.out.println("父类--构造器");
}
Parent(int x){
System.out.println("父类--构造器"+x);
}
}
public class Sub extends Parent{
public static void main(String[] args) {
new Sub ();
}
// 静态变量
public static String s_StaticField="子类--静态变量";
//变量
public String s_Field="子类--变量";
//静态初始化
static {
System.out.println(s_StaticField);
System.out.println("子类--静态初始化块");
}
//初始化
{
System.out.println(s_Field);
System.out.println("子类--初始化");
}
Parent p=new Parent(12);
//构造器
Sub (){
System.out.println("子类--构造器");
}
}
运行结果是:
父类--静态变量
父类--静态变量初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化
父类--变量
父类--初始化块
父类--构造器12
子类--构造器
分析执行过程:
在main方法中创建了new Sub();对象,程序先去Sub类的无参构造函数,接着会执行默认的super()方法,到父类后会先看父类中有没有构造代码块,有就会先执行,然后再执行父类的无参构造函数。接着返回到Subs类中,再查看Sub类中有没有构造代码块,有就会执行,接着new Parent(12)对象,到父类中后,先执行父类中构造代码块,再去执行父类中的有参构造函数。接着返回子类,再去执行子类的无参构造函数。
代码块总结:
1.并不是父类完全初始化完毕后才进行子类的初始化的。实际上是子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化 之前就完成了;
2.静态代码块在整个程序中只执行一次,而构造代码块会随着对象的创建而去执行;
3.子类的每个构造函数里都会有个默认的super();
4.静态代码块会先于构造代码块执行,构造代码块会先于构造函数执行。
对象的初始化过程
Personp = new Person("zhangsan",20);
该句话都做了什么事情?
1,因为new用到了Person.class.所以会先找到Person.class文件并加载 到内存中。
2,执行该类中的static代码块,如果有的话,给Person.class类进行初 始化。
3,在堆内存中开辟空间,分配内存地址。
4,在堆内存中建立对象的特有属性。并进行默认初始化。
5,对属性进行显示初始化。
6,对对象进行构造代码块初始化。
7,对对象进行对应的构造函数初始化。
8,将内存地址付给栈内存中的p变量。
生成Java帮助文档
命令格式:javadoc-d文件夹名(存放的目录)-anther-version*.(必须是 public类型的类)
一个类中默认的是有一个空参数的构造函数,这个构造函数的权限和类的 权限一致。
Main函数
1.主函数:是一个特殊的函数,作为程序的入口,可以被jvm调用。
2.主函数的定义:
a) Public:代表着该函数的访问权限是最大的;
b) Static:代表着主函数随着类的加载就已经存在了;
c) Void:主函数没有具体的返回值;
d) Main:不是关键字,但是是一个特殊的单词,可以被jvm识别;
e) (string[] args):函数的参数,参数类型是一个数组,该数组中的元素是字符串(字符串类型的数组)。
注意:主函数是有固定的格式的该格式是:publicstatic void main(string[] args),因为只要有这种格式jvm才识别。
jvm在调用主函数时,传入的是new string[0]。
------- android培训、java培训、期待与您交流! ----------
- 黑马程序员_面向对象(2)
- 黑马程序员_面向对象2
- 黑马程序员_面向对象(2)
- 黑马程序员_面向对象2
- 黑马程序员_面向对象2
- 黑马程序员_面向对象2
- 黑马程序员_面向对象2
- 黑马程序员_面向对象2
- 黑马程序员_面向对象(2)
- 黑马程序员_面向对象(2)
- 黑马程序员_面向对象2
- 黑马程序员_面向对象(2)
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- HTML5画布移动触摸事件教程
- codility 在线编程测试
- 动态构建双轴的FLEX报表
- solr基础之shard和zookeeper
- 常用VC插件
- 黑马程序员_面向对象2
- HTML5画布颜色选择器
- Linux环境SVN命令行使用经验总结
- C# 中调用C++ DLL (P/Invoke)
- Activity的onSaveInstanceState()和 onRestoreInstanceState()方法
- 阅读顺序
- nmap中--script功能的使用
- nfc是什么?智能手机上的nfc功能是什么?
- .NET Compact Framework 概述