java第三天

java中如果有一个对象没有任何引用指向,那么该对象就会变为垃圾对象,java中有垃圾回收机制,会在不定时对其进行回收。
成员变量与局部变量
成员变量:在类中方法外。在堆内存(成员变量属于对象,对象进堆内存)
局部变量:在方法定义中或者方法声明上。(局部变量属于方法,方法进栈内存。)
生命周期
成员对象:随对象创建而存在,随对象消失而消失。有默认初始化值。
局部变量:随方法调用而存在,方法调用完毕而消失。使用前必须对其赋值。
成员变量和局部变量可以一样,在方法中使用时,采用就近原则。(因为它们存储位置不一样。)
构造方法:
给对象的数据(属性)进行初始化。
特点:
方法名与类名相同,
没有返回值类型,void都没有
构造方法不能用对象调用。
构造方法也可以重载。
如果我们不给构造方法系统将自己提供一个无参的构造方法。

堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
static:随着类的加载而加载,优先于对象存在,被所有的对象共享。可以用类名调用(推荐使用)
注意事项:静态方法无法访问非静态,因为静态成员是在对象之前加载的,此时非静态成员尚不能使用。所以静态方法中也没有this。
静态变量属于类,存储于方法区的静态区,随着类的加载而加载,优先于对象存在,被所有的对象共享。可以用类名调用(推荐使用)
成员变量属于对象,也叫实例变量,存储于堆内存。随着对象变化,只能通过对象调用。

static String name = "lisi";
int num =10;
public static void print(){
    System.out.println(name);//lisi
    System.out.println(num);//错误: 无法从静态上下文中引用非静态 变量 num
}

主方法详解:
public:被jvm调用,所以权限要足够大。
static:被jvm调用,不需要创建对象,直接类名调用即可。
void:被jvm调用,不需要任何返回值。
main:只有这样写才能被jvm识别,main不是关键字。
String[ ] args:以前是用来接接收键盘录入的。
如果一个类中所有方法都是静态的,需要多做一步,将构造方法私有化,不让其他类创建该类对象,只能通过类名来调用。
代码块:
在java中使用{ }括起来的代码就被称为代码块。
局部代码块:在方法中出现;限定 变量的声明周期,只能存在于{ }中。
构造代码块:类中方法外出现。每创建一次对象就执行一次。在构造方法执行前调用。
静态代码块: 用static修饰的代码块,随着类的加载而加载并且只执行一次。用来给类初始化,一般用来加载驱动,优先于主方法执行。
继承:关键字extends,class 子类名extens父类名
只支持单继承不支持多继承 ,但支持多层继承
子类只能继承父类所有非私有的成员(成员方法和成员变量)
子类不能继承父类的构造方法,可以通过super关键字去访问父类构造方法。
子类可以对父类中的变量重新定义
this既可以调用本类的,也可以调用父类的(本类没有此成员时)
super调用父类
子类中的所有构造方法默认都会访问父类中的空参数的构造方法。因为子类会继承父类的数据,所以一定要初始化父类的数据。

class Father{
    public Father(){
        System.out.println("Father 的构造方法");
        }
}
class Son{
    public Son(){
        super();//调用父类的空参构造方法,如果不写系统会默认加上
        System.out.println("Son 的构造方法");
        }
}
class Main{
    public static void main(String[] args){
        Son s = new Son()//Father 的构造方法
                            Son 的构造方法
        }
}

如果父类中没有空参构造只有有参构造,那么就会报错,如果想要执行父类的有参构造,在子类构造方法中super(参数)。

class Father{
    public Father(){
        System.out.println("Father 的构造方法");
        }
}
class Son{
    public Son(){
        super();//调用父类的空参构造方法,如果不写系统会默认加上
        System.out.println("Son 的构造方法");
        }
}
class Main{
    public static void main(String[] args){
        Son s = new Son()//Father 的构造方法
                            Son 的构造方法
        }
}
  1 class Super{
  2     public static void main(String[] args){
  3         Son s = new Son("zhangsan",21);
  4         Son s2 = new Son();
  5         }
  6 }
  7 class Father{
  8     int age;
  9     String name;
 10     public Father(String name,int age){
 11         this.age = age;
 12         this.name = name;
 13         System.out.println("this is Father's parametric construct!");
 14     }   
 15 }
 16 class Son extends Father{
 17     public Son(){
 18         this ("Lisi",10);
 19         System.out.println("this is Son's Non-parametric construct!");
 20     }
 21     public Son(String name,int age){
 22         super(name,age);                                                    
 23         System.out.println("this is Son's parametric construct!");
 24     }   
 25 }   

输出为

this is Father's parametric construct!
this is Son's parametric construct!
this is Father's parametric construct!
this is Son's parametric construct!
this is Son's Non-parametric construct!

this和super都必须放在构造方法第一句,子类只能且必须调用一次父类的构造方法。
先加载子类的父类再加载子类

class Test_Extends{
    public static void main(String[] args){
        Zi z = new Zi();
    }
}
Class Fu{
    static{
        System.out.println("静态代码块Fu");
    }
    {
        System.out.println("构造代码块Fu");
    }
    public Fu(){
        System.out.println("构造方法fu");
    }

}
class Zi{
    static{
        Sytem.out.println("静态代码块Zi");
        }
    {
        System.out.println("构造代码块Zi");
    }
    public Zi(){
        System.out.println("构造方法Zi");
    }
}

输出为:

静态代码块Fu
静态代码块Zi
构造代码块Fu
构造方法fu
构造代码块Zi
构造方法Zi

方法重写:子、父类出现了一样的方法(返回值一致,或者是子父类的关系)。 要想调用父类的同名方法,可用super调用。
父类中私有方法不能被重写,子类重写父类方法时权限不能更低(最好就一致),父类的静态方法只能通过静态方法重写。
final修饰符:
修饰类,类不能被继承
修饰变量,变量变为常量,只能被赋值一次。(常量命名规范:如果是一个单词,所有字母大写,若果是多个单词,所有字母大写,中间用_连接,PS:ANIMAL_AGE;一般会与public static同时修饰,方便直接用类名调用)
修饰方法:方法不能被重写。
final修饰基本数据类型,值不能被改变。
修饰引用类型,地址值不能被改变,但对象的属性可以改变。
final修饰的成员变量必须对其显示初始化,默认初始化值为无效值。

猜你喜欢

转载自blog.csdn.net/qq_41584674/article/details/81478845