List,是个接口
ArrayList才是动态数组类
3.7垃圾回收机制
this的三种用法
this(1,2,3)会调用构造器
下图三个对象都是垃圾对象
让系统回收垃圾对象
回收的时候,会调用自己的finalize方法
加不加this都行,甚至可以加一个this.getName()
结果会略有不同,但都消失
3.8 static的使用
同时也是静态的
this到底指什么
当前类的对象
类加载的时候就运行静态代码块
之后程序调用构造函数时,构造函数里的才输出,所以有先后顺序
java静态代码块在什么时候会执行
未调用的时候未执行
创建新对象就要加载类,执行了
package com.example;
import sun.rmi.runtime.NewThreadAction;
import javax.sound.midi.Soundbank;
import java.util.Scanner;
import java.util.Set;
public class javahello_2 {
public static void main(String[] args) {
System.out.println("textofmian");
}
}
class A{
static {
System.out.println("textofstaic");
}
}
类加载的时机
对于初始化阶段,虚拟机规范规定了有且只有 5 种情况必须立即对类进行“初始化”(而加载、验证、准备自然需要在此之前开始):
遇到new、getstatic 和 putstatic 或 invokestatic 这4条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。对应场景是:使用 new 实例化对象、读取或设置一个类的静态字段(被 final 修饰、已在编译期把结果放入常量池的静态字段除外)、以及调用一个类的静态方法。
对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。
当初始化类的父类还没有进行过初始化,则需要先触发其父类的初始化。(而一个接口在初始化时,并不要求其父接口全部都完成了初始化)
虚拟机启动时,用户需要指定一个要执行的主类(包含 main() 方法的那个类),
虚拟机会先初始化这个主类。
当使用 JDK 1.7 的动态语言支持时,如果一个 java.lang.invoke.MethodHandle 实例最后的解析结果 REF_getStatic、REF_putStatic、REF_invokeStatic 的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先触发其初始化。
第5种情况,我暂时看不懂。
以上这 5 种场景中的行为称为对一个类进行主动引用。除此之外,所有引用类的方式都不会触发初始化,称为被动引用,例如:
通过子类引用父类的静态字段,不会导致子类初始化。
通过数组定义来引用类,不会触发此类的初始化。MyClass[] cs = new MyClass[10];
常量在编译阶段会存入调用类的常量池中,本质上并没有直接引用到定义常量的类,因此不会触发定义常量的类的初始化。
3.9类的组合
3.10summary
作业
1.输出?
public class javahello_2 {
static void f(Book p) {
p.width = 20;
p.length = 40;
}
public static void main(String args[]) {
Book b = new Book();
b.width = 10;
b.length = 20;
f(b);
System.out.print(" " + b.width);
System.out.print(" " + b.length);
}
}
20 40
2.输出?
package com.example;
class Book {
int width;
int length;
}
public class javahello_2 {
static int j = 20;
public static void main(String args[]) {
int i = 10;
javahello_2 p = new javahello_2();
p.amethod(i);
System.out.println(i + " and " + j);
}
public void amethod(int x) {
x = x * 2;
j = j * 2;
}
}
定义一个表示学生的student类,包括的域有学号、姓名、性别、年龄,包括的方法有获得学号、姓名、性别、年龄及修改年龄。编写Java程序创建student类的对象及测试其方法的功能。
package com.example;
import javax.swing.*;
class Student{
int number=0;
String name="aas";
char sex='f';
int age=0;
public int getAge() {
return age;
}
public int getNumber() {
return number;
}
public String getName() {
return name;
}
public char getSex() {
return sex;
}
public void setAge(int age) {
this.age = age;
}
}
public class javahello_2 {
public static void main(String[] args) {
Student student=new Student();
System.out.println(student.getSex());
student.setAge(12);
System.out.println(student.getAge());
System.out.println(student.getName());
System.out.println(student.getNumber());
System.out.println(student.toString());
}
}
定义一个计算矩形面积、立方体和球体体积的类。该类完成计算的方法用静态方法实现。
package com.example;
class Jisuanqi{
static double jisuan(double a){
return 4/3*a*a*a*Math.PI;
}
static double jisuan(double a,double b){
return a*b;
}
static double jisuan(double a,double b,double c){
return a*b*c;
}
}
public class javahello_2 {
public static void main(String[] args) {
///用缺省处理
///不用了Jisuanqi jisuanqi = new Jisuanqi();
System.out.println(Jisuanqi.jisuan(9));
System.out.println(Jisuanqi.jisuan(1,2));
System.out.println(Jisuanqi.jisuan(4,5,6));
}
}
定义一个Company类,成员变量有公司名称、雇员列表、公司每年的总收入。该类的构造方法可能有如下形式: public Company(String name) { } 也可以有更多其它形式的构造方法。或许还应该有如下方法: public void setName(String name){ } public String getName() { } 必须提供一个公共的dump方法来打印有关Company的信息,如公司名称、雇员和公司总收入。最后为Company类编写一个测试客户程序。
List不是一个类,是个接口
ArrayList才是动态数组类
package com.example;
import com.sun.org.apache.xml.internal.resolver.helpers.PublicId;
import javax.xml.soap.Name;
import java.lang.reflect.Member;
import java.util.*;
class Company{
public String name="aa";
public List<String> member=new ArrayList<String>();
// public List<String> member2=new List<String>();
int money=0;
public void setName(String name) {
this.name = name;
}
public Company(String name){
this.name=name;
}
public Company(){
this("undefined");
}
public String getName() {
return name;
}
public void addMember(String newMember){
member.add(newMember);
}
public void earnMoney(int newEarn){
this.money+=newEarn;
}
public String dump(){
return "name:"+name+"\n"+"menber:"+member.toString()+"\n"+"money:"+money;
}
}
public class javahello_2 {
public static void main(String[] args) {
Company company=new Company();
//testing addmember
company.addMember("ass");
company.addMember("rere");
company.addMember("wewe");
company.earnMoney(56);
//out all
System.out.println(company.dump());
}
}