目录
-
Java类中包含的类型变量
- 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁
- 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
- 类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。
-
成员变量和类变量的区别
1、两个变量的生命周期不同
成员变量随着对象的创建而存在,随着对象的回收而释放。
静态变量随着类的加载而存在,随着类的消失而消失。被静态修饰的成员,可以直接被类名所调用。也就是说,静态的成员多了一种调用方式。类名.静态方式。静态随着类的加载而加载。而且优先于对象存在。
2、调用方式不同
成员变量只能被对象调用。
静态变量可以被对象调用,还可以被类名调用。
3、别名不同
成员变量也称为实例变量。成员变量所属于对象。
静态变量也称为类变量。 静态变量所属于类。
4、数据存储位置不同
成员变量存储在堆内存的对象中,所以也叫对象的特有数据。
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。
5、成员变量只能被对象所调用
静态变量可以被对象调用,也可以被类名调用。
所以,成员变量可以称为对象的特有数据,静态变量称为对象的共享数据
-
静态方法
1、静态方法只能访问静态成员,不可以访问非静态成员。
因为静态方法加载时,优先于对象存在,所以没有办法访问对象中的成员。
2、静态方法中不能使用this,super关键字。
因为this代表对象,而静态在时,有可能没有对象,所以this无法使用。
-
new关键字的作用
- 为对象分配内存空间
- 引起对象构造方法的调用
- 为对象返回一个引用。引用名称是存放的对象的地址。
-
内部类
优点:可访问外部类私有属性(内部类的唯一优点)
缺点:破坏原有类的程序结构(属性,构造方法,普通方法,内部类)
class Out{
private in age = 12;
//内部类
class In{
public void print(){
System.out.println(age);
}
}
}
public class Demo{
public static void main(String[] args){
Out.In in = new Out().new In();
in.print();
//或采用以下方式访问
/*
Out out = new Out();
Out.In in = out.new In();
in.print();
*/
}
}
-
super与this的用法
this:指向对象本身的指针,形参与成员名字重名,用this来区分
super:超(父)类对象的一个指针
用法示例:
class Person{
public static void prt(String s){
System.out.println(s);
}
Person(){
prt("父类·无参数构造方法: " + "A Person.");
}//构造函数(1)
Person(String name){
prt("父类·含一个参数的构造方法:"+"A person's name is " + name);
}//构造函数(2)
}
public class Chinese extends Person{
Chinese(){
super();//调用父类构造方法(1)
prt("子类·调用父类无参数构造方法:" + "A chinese coder.");
}
Chinese(String name){
super(name);
prt("子类·调用父类含一个参数的构造方法:" + "his name is" + name);
}
Chinese(String name, int age){
this(name);//调用具有相同形参的构造方法(3)
prt("子类:调用子类具有相同形参的构造方法:his age is " + age);
}
public static void main(String[] args){//主方法
Chinese cn = new Chinese();
cn = new Chinese("codersai");
cn = new Chinese("codersai", 18);
}
}
运行结果:
-
构造函数的注意点
Java如果不定义任何的构造函数,会自动构造,但如果定义了任何一个构造函数,就不会再自动构造,需要自己定义全部的构造函数。
出错示例:
//一个带显式构造函数的类
Public class People{
int age = 23;
Public void getAge(){
System.out.print("the age is " + age);
}
//显示声明一个带参数的构造函数,用于初始化年龄
Public People(int a){
this.age = a;
}
}
//用这个类来实例化一个对象
People xiaoMing = new People(20); //使用带参数的构造函数来实例化对象
People xiaoMing2 = new People(); //ERROR:一旦显式定义了一个构造函数,就不会再生成默认的构造函数
xiaoMing.getAge(); //打印出来的年龄变为20