1、类的描述
//类名用大驼峰
class Person{
//属性 字段 成员变量
//定义在类当中,方法外部
//普通成员变量
public String name;
//静态成员变量
public static int age = 10;
//普通成员方法
public void sleep();
//静态成员方法
public static void staticMethod(){
}
}
Java中每个类都会产生一个字节码文件
2、类的实例化
Person p1 = new person();
访问成员变量
p1.name = "张三";
p1.sleep();
3、this引用
注意:
1、this只能在成员方法中用
2、静态变量不属于this(静态变量不属于实例化对象,而this本质上是实例化对象)
this的三种应用
(1)访问成员变量
(2)访问成员方法
public class Date{
public int year;
public int month;
public int day;
//形参隐藏了一个date this
public void setDate(int year,int month,int day){
this.year = y;
this.month = m;
this.day = d;
}
//局部变量优先,所以this用以区分形参和对象的属性
public void eat(){
this.setDate();
}
}
(3)访问构造方法
public class Student{
public String name;
public int age;
public Student(){
this("李三",23);//调用了有参构造方法
//只能出现在当前构造方法的第一行
System.out.println();
}
public Student(String name,int age){
this.name = name;
this.age = age;
}
}
4、成员变量初始化
(1)局部变量、成员变量
局部变量没有初始化的情况下,不能应用,否则会报错
而成员变量没有初始化时,有一个默认值。默认值如下
int 0
float 0.0f
boolean false
char '\u0000'
引用变量 null
(2)就地初始化
实例化类时便进行了初始化(不推荐)
public class Date{
public int year = 1995;
public int month = 6;
public int day = 24;
}
(3)构造方法初始化
· 实例化一个对象时,会为对象分配内存和调用合适的构造方法
· 当没有传参时,调用无参数构造方法;当有参数时,调用有参数构造方法
· 如果没有写构造方法,编译器会自动提供一个无参构造方法;如果有构造方法,那么不会提供,需要无参和有参都自己写
public class Student{
public String name;
public int age;
public Student(){
System.out.println();
}
public Student(String name,int age){
this.name = name;
this.age = age;
}
//alt + insert快捷键生成构造方法
}
· 调用类当中其他构造方法
public class Student{
public String name;
public int age;
public Student(){
this("李三",23);//调用了有参构造方法
//只能出现在当前构造方法的第一行
System.out.println();
}
public Student(String name,int age){
this.name = name;
this.age = age;
}
}
5、封装
(1)访问限定符
访问限定符可以修饰类名,接口,方法,成员变量等
范围 | private | default | protected | public |
---|---|---|---|---|
同一包中的同类 | √ | √ | √ | √ |
同一包中的不同类 | √ | √ | √ | |
不同包中的子类 | √ | √ | ||
不同包中的非子类 | √ |
default的意思是默认
(2)set方法和get方法
public class Student{
private String name;
private int age;
public Student(){
System.out.println();
}
public Student(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
(3)包
包是一组类的集合,能防止类的名字冲突
· package定义包
package com.bit.com1;
//在代码最上方,说明该类在哪个包中
· import导入包
//import导入具体包中的类
import java.utils.Arrays;
//import导入包下的所有类,用到这个包底下哪个类就回调用哪个
import java.sql.*;
import不能只导入指定包
import java.utils;//报错
6、static成员
(1)静态成员变量不属于对象(实际上是在方法区存储);this不能调用静态变量
public class Student{
private String name;
private int age;
static String classRoom = '101';
}
实例化对象为null时访问静态变量编译运行也不会报错(但同样不推荐)
(2)通过类名访问对象
静态变量用实例化的对象访问可以编译运行,但静态方法的正确访问方式应该是用过类型来访问
System.out.println(Student.classroom);
(3)静态方法中不能调用非静态的成员变量或者成员方法(非静态方法有this参数传递,而静态方法中没有)
(4)在方法当中定义的变量是局部变量,而静态的变量属于类变量。随着类的加载而被创建,而局部变量是调用该方法的时候,才创建的。
所以,此时两种变量的性质是冲突的。Java当中不允许定义局部的静态变量。
7、代码块
(1)静态代码块
·必须放在类下。与类一起加载执行。并且静态代码块执行一次
· 一般用以初始化静态成员
static {
classRoom = '101';
}
(2)构造代码块(实例代码块)
· 没有static修饰,必须放在类下。与对象初始化一起加载,即每次调用构造方法都会执行,并且在构造方法前执行。
· 可以用来初始化实例成员
{
age = '3';
}
(3)局部代码块
public class Test1{
public static void main(String[] args) {
//局部代码块
{
int n = 100;
}
// 局部代码块中声明的变量在代码块外部访问不到!
// System.out.println(n);
}
}
(4)执行顺序:静态代码块–>构造代码块–>构造方法
public class Main {
int a;
static {
System.out.println("执行第一个静态代码块");
}
{
System.out.println("执行实例代码块");
}
public static void main(String[] args) {
System.out.println("执行main方法");
Main m = new Main();
Main m2 = new Main(2);
}
Main(){
System.out.println("执行无参构造方法");
}
Main(int a){
System.out.println("执行有参构造方法");
this.a = a;
}
static {
System.out.println("执行第二个静态代码块");
}
}
最终执行结果如下
执行第一个静态代码块
执行第二个静态代码块
执行main方法
执行实例代码块
执行无参构造方法
执行实例代码块
执行有参构造方法
Process finished with exit code 0