Java学习笔记二(类)
前言:
类的五大构成(1成员变量,2成员方法,3构造器,4代码块,5内部类)
注释:类存放在(方法区),变量存放在(栈区),对象存放在(堆区)
(1) 类的定义
public class 类名 {...
}
(2) 类的实例化
注释:对象(类的实例化):类名 对象名 = new 类名();
public void test() {类型 对象名 = new 类型();
}
1 成员变量(全局变量)
public class 类名 {[修饰符] 类型 全局变量名 [=默认值];
}
2 成员方法
2.1 方法定义
public class 类名 {[修饰符] void 方法名() {... }[修饰符] void 方法名(参数类型 参数名, ...) {... }[修饰符] 返回值类型 方法名() {... return 返回值;}[修饰符] 返回值类型 方法名(参数类型 参数名, ...) {... return 返回值;}
}
2.2 局部变量
注释:局部变量声明在方法内部,只在当前方法执行时有效
public void 方法名() {类型 局部变量名 [=初期值];
}
2.3 参数传递
(1) 基本类型:值传递
// 先输出x的值(2)
// 再输出i的值(1)
public static void main(String[] args) {int i = 1;test(i);System.out.println(i);
}public static void test(int x) {// 传进来的是i的值,x值变更不影响i的值。x = x + 1;System.out.println(x);
}
(2) 引用类型:地址传递
public class Data {int age = 0;
}// 先输出d2的属性值(2)
// 再输出d1随d2变更了的属性值(2)
public class Main {public static void main(String[] args) {Data d1 = new Data();d1.age=1;test(d1);System.out.println(d1.age);}public static void test(Data d2) {// 传进来的是d1的地址,d2的属性值变更,影响外面d1的属性值一起变更d2.age=2;System.out.println(d2.age);}
}
(3) 可变参数列表
注释:可变参数默认是数组类型,只能有一个可变参数,必须在参数列表的最后。
// 可变参数列表可以实现,动态参数个数的传递
public static void main(String[] args) {test(1, "a");test(2, "a", "b");test(3, "a", "b", "c");String[] strs = {"a","b","c"};test(4, strs);
}public static void test(int p1, String p2...) {// p2是不固定长度的数组
}
3 构造器
注释:构造器在 new 对象() 时调用
public class Test {[修饰符] 类名() { ... } // 无参构造器(默认。只有无参构造器时不用显示声明)[修饰符] 类名(参数类型 参数名, ...) {... } // 有参构造器,定义有参构造器后默认无参构造器失效。
}
4 代码块
注释:代码块也叫(实例代码块),代码块代码在每次对象实例化时调用,调用静态方法时不执行,作用是初始化全局变量。
注释:代码块代码由上到下执行,代码块全部执行完再执行构造器。
public class 类名 {{代码块代码...}
}
注释:代码块未声明的变量为全局变量,与全局变量同名局部变量,用局部变量。
public class Test {int a = 0;int b = 1;{int a = 1;int c = 2;System.out.println(a); // 局部变量System.out.println(b); // 全局变量System.out.println(c); // 局部变量}
}
5 内部类
5.1 成员内部类(非静态内部类)
(1) 成员内部类的定义
注释:成员内部类类似成员方法,可访问主类的私有属性,静态变量。
public class 类名 {// 内部类声明在类内部public class 内部类名 { // 没有修饰符的内部类只能被主类同包的类调用...}
}
(2) 成员内部类的调用
主类.内部类 变量名 = new 主类().new 内部类(); // 内部类的实例化
(3) 内部类对主类同名属性访问
访问主类属性:主类名.this.变量名
访问内部类属性:this.变量名
public class 主类 {public int type1 = 1;public class 内部类 {public int type1 = 2;public void test() {主类.this.type1; //主类属性this.type1; //内部类属性}}
}
5.2 局部内部类
声明在(方法,构造器,代码块)内部,分为匿名与非匿名。好像没啥用!
public class Test {public void testFn() {class SubTest{void test() {...}}SubTest s = new SubTest();}
}
5.3 静态内部类
(1) 静态内部类定义
public class 主类 {static class 静态内部类 {public static int num = 1;}
}
(2) 静态内部类调用
public class Main {public static void main(String[] str) {主类.静态内部类.属性;主类.静态内部类.方法();}
}
5.4 匿名内部类(重点)
注释:匿名内部类可简化为Lambda表达式(之后再详细介绍)
public void fn() {类 对象 = new 抽象类接口() {抽象方法实现(){…}}
}