空指针异常
出现空指针异常的前提条件是:
“空引用”访问实例对象相关的数据时,都会出现空指针异常。
JVM中体现如下:
参数传递
Java中关于方法调用时的参数传递实际上只有一个规则:
不管你是基本数据类型,还是引用数据类型,实际上在传递的时候都是将变量中保存的那个“值”复制一份,传过去
1 2 3 4 5 6 7 8 9 10
| int i = 10; int j = i;
User u = 0x1234; User u2 = u;
|
构造方法
1.当一个类中没有提供任何构造方法,系统默认提供一个无参数的构造方法。这个无参数的构造方法叫做缺省构造器。
2.当一个类中手动的提供了构造方法,那么系统将不再提供无参数的构造方法。
3.无参数构造方法和有参数构造方法都可以调用。
1 2
| Student x = new Student(); Student y = new Student(123);
|
4.构造方法支持方法重载。在一个类当中构造方法可以有多个,并且所有的构造方法名字都是一样的。(与类名一致)
代码示例:
Student.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
public class Student {
int id; String name; boolean sex; String address; int age;
public Student() { System.out.println("无参数的构造方法执行了!"); } public Student(int i) { System.out.println(i); } }
|
ConstructorTest.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
public class ConstructorTest { public static void main(String[] args) { new Student();
ConstructorTest.doSome(); doSome();
Student s1 = new Student(); System.out.println(s1);
Student s2 = new Student(100); System.out.println(s2); }
public static void doSome() { System.out.println("Do some!!!!"); } }
|
综上,构造方法是用来创建对象,并且同时给对象的属性赋值(注意:实例变量没有手动赋值时,系统会使用默认值)
封装
set和get方法都是实例方法,不能带static。
不带static的方法称为实例方法,实例方法的调用必须先new对象。
以下为代码示例:
Person.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
public class Person { private int age;
public int getAge() { return age; }
public boolean setAge(int nianLing) { int nianLingMax = 150; if(nianLing < 0 || nianLing > nianLingMax) { System.out.println("年龄不合法!"); return false; } age = nianLing; return true; }
}
|
PersonTest.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
import java.util.Scanner; public class PersonTest { public static void main(String[] args) { Person p1= new Person(); Scanner s = new Scanner(System.in); int i; boolean found; do{ i = s.nextInt(); found = p1.setAge(i);} while(!found); System.out.println(p1.getAge()); } }
|
static关键字
1、static修饰的统一都是静态的,都是类相关的,不需要new对象。直接采用“类名.”访问。
2、当一个属性是类级别的属性,所有对象的这个属性的值是一样的,建议定义为静态变量。
3、static修饰的变量:静态变量(在类加载的时候执行)
4、static修饰的方法:静态方法
变量根据声明的位置进行划分:
- 在方法体当中声明的变量叫做:局部变量
- 在方法体外声明的变量叫做:成员变量
成员变量又可分为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class VarTest{
int i;
public void m2(){ int x = 200; }
static int k;
public static void m1(){ int m = 100; } }
|
什么时候变量声明为实例的,什么时候声明为静态的?
如果这个类型的所有对象的某个属性值都是一样的,不建议定义为实例变量,浪费内存空间。建议定义为类级别特征,定义为静态变量,在方法区中只保留一份,节省内存开销。
一个对象一份的是实例变量。
所有对象一份的是静态变量。
实例相关的都是需要new对象的。
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| public class StaticTest{ public static void main(String[] args){ System.out.println(Chinese.country);
Chinese c1 = new Chinese("1231456456456456","张三"); System.out.println(c1.idCard); System.out.println(c1.name);
Chinese c2 = new Chinese("7897897896748564","李四"); System.out.println(c2.idCard); System.out.println(c2.name);
} }
class Chinese{
String idCard;
String name;
static String country = "中国";
public Chinese(){ }
public Chinese(String s1,String s2){ idCard = s1; name = s2; } }
|
JVM体现:
静态代码块
1、使用static关键字可以定义:静态代码块
2、什么是静态代码块,语法是什么?
static {
java语句;
java语句;
}
3、static静态代码块在什么时候执行呢?
类加载时执行。并且只执行一次。
静态代码块有这样的特征/特点。
4、注意:静态代码块在类加载时执行,并且在main方法执行之前执行。
5、静态代码块一般是按照自上而下的顺序执行。
6、静态代码块有啥作用,有什么用?
第一:静态代码块不是那么常用。(不是每一个类当中都要写的东西。)
第二:静态代码块这种语法机制实际上是SUN公司给我们java程序员的一个特殊的时刻/时机。
这个时机叫做:类加载时机。
具体的业务:
项目经理说了:大家注意了,所有我们编写的程序中,只要是类加载了,请记录一下类加载的日志信息(在哪年哪月哪日几时几分几秒,哪个类加载到JVM当中了)。
思考:这些记录日志的代码写到哪里呢?
写到静态代码块当中。
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public class StaticTest{
static { System.out.println("A"); }
static { System.out.println("B"); }
public static void main(String[] args){ System.out.println("Hello World!"); }
static{ System.out.println("C"); } }
|
实例语句块
1、实例语句在类加载时并没有执行。
2、实例语句语法
{
java语句;
java语句;
java语句;
}
3、实例语句块在什么时候执行?
只要是构造方法执行,必然在构造方法执行之前,自动执行“实例语句块”中的代码。
实际上这也是SUN公司为java程序员准备一个特殊的时机,叫做对象构建时机。若每个构造方法中前几行语句均相同,则可以使用实例语句块进行简化
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public class InstanceCode{
public static void main(String[] args){ System.out.println("main begin"); new InstanceCode(); new InstanceCode();
new InstanceCode("abc"); new InstanceCode("xyz"); }
{ System.out.println("实例语句块执行!"); }
public InstanceCode(){ System.out.println("无参数构造方法"); }
public InstanceCode(String name){ System.out.println("有参数的构造方法"); }
}
|