JAVASE

目录

一、包

1、包的命名

2、包的声明

3、包的访问

二、权限修饰符

三、static

1、修饰成员变量

2、修饰成员方法

四、代码块

1、静态代码块

2、实例代码块

3、创建一个对象时,在类中的调用顺序

4、创建一个子类对象时,在类中的调用顺序 

五、final

1、修饰类 

2、修饰方法

3、修饰变量

六、常量

七、抽象

1、修饰类

2、修饰方法

八、接口

1、被实现

2、多继承

3、默认方法

4、静态方法

5、私有方法

6、接口的多态

九、内部类

1、局部内部类

2、匿名内部类

3、成员内部类

4、静态内部类

十、枚举类

1、使用enum关键子实现枚举

2、枚举对象

3、enum成员方法 


一、包

1、包的命名

com.公司名.项目名.业务模块名     

由字母,数字,下划线,小圆点(用来分目录层级)组成

(1)不能用数字开头

(2)不能是关键字和保留字

(3)一般是小写字母                   

2、包的声明

package    声明当前类所在的包,放在类的最上面,一个类中最多只有一句package 

package com.javastudy;

3、包的访问

import    用来导入包,放在package下面,类定义的上面,可以有多句没有顺序要求

(1)相同包下的类可以直接访问,不同包下的类必须导包才能使用   

将包下的某个类导入        import.包名.类名;

package com.javastudy;

import com.javaexercise.Class1;
import com.javaexercise.Class2;

public class Test {
}

将包下的所有类导入        import.包名.*;

package com.javastudy;

import com.javaexercise.*;

public class Test {
}

(2)类中使用不同包下的相同类名,默认只能导入一个类的包,另一个类要使用全名访问

package com.javastudy;

import com.javaexercise.Run;

public class Test {
    Run r1 = new Run();
    com.javaimporve.Run r2 = new com.javaimporve.Run();
}
package com.javastudy;

public class Test {
    com.javaexercise.Run r1 = new com.javaexercise.Run();
    com.javaimporve.Run r2 = new com.javaimporve.Run();
}

二、权限修饰符

(1)控制成员变量、成员方法、类被访问的范围(只有public和无修饰符能够修饰类和接口)

(2)作用范围从小到大:private > 无修饰符 > protected > public

private      同一个类中

无修饰符    同一个类中、同一个包中

protected  同一个类中、同一个包中、不同包下的子类

public        同一个类中、同一个包中、不同包下的子类、不同包下的无关类

(3)不同包下的子类

package javaFather;

public class Father {
    protected void protectedrun(){
    }
    public void publicrun(){
    }
}
package javaSon;

import javaFather.Father;

public class Son extends Father {
    public static void main(String[] args) {
        Son s = new Son();
        s.protectedrun();
        s.publicrun();
    }
}

 (4)不同包下的无关类

package java1;

public class Test1 {
    public void publicrun(){
    }
}
package java2;

import java1.Test1;

public class Test2 {
    public static void main(String[] args) {
        Test1 t = new Test1();
        t.publicrun();
    }
}

三、static

有static修饰,归属于类,与类一起加载                                     

无static修饰,归属于对象

1、修饰成员变量

(1)静态成员变量:每个对象共享这个信息

可以类名访问(推荐),同一个类中访问静态成员变量可以省略类名

可以对象访问(不推荐)

public class Test {
    public static int numbers = 100;           //static public int numbers = 100;

    public static void main(String[] args) {
        System.out.println(numbers);
        System.out.println(Test.numbers);
        Test t = new Test();
        System.out.println(t.numbers);
    }
}

(2) 实例成员变量:每个对象都有这个信息,且信息不同

只能对象访问

public class Test {
    private int numbers=100;

    public static void main(String[] args) {
        Test t = new Test();
        System.out.println(t.numbers);
    }
}

2、修饰成员方法

(1)静态成员方法:执行一个公共功能为目的

可以类名访问(推荐),同一个类中访问访问静态成员方法可以省略类名

可以对象访问(不推荐)

public class Test {
    public static void method(int n){        //static public void method(int n){
        System.out.println(n);
    }

    public static void main(String[] args) {
        method(1);
        Test.method(1);
        Test t = new Test();
        t.method(1);
    }
}

 (2)实例成员方法:表示对象自己的行为的,而且该方法需要直接访问对象的实例成员

只能对象访问

public class Test {
    public void method(int n){
        System.out.println(n);
    }

    public static void main(String[] args) {
        Test t = new Test(); 
        t.method(1);
    }
}

(3)静态方法只能访问静态成员,不可以直接访问实例成员,不能使用this,super关键字 

public class Test {
    public static int numbers1 = 100;
    private int numbers2;
    public static void method(){
        System.out.println(numbers1);      //正常
        System.out.println(numbers2);      //报错
        Test t = new Test();
        t.numbers2=100;
        System.out.println(t.numbers2);    //正常
        System.out.println(this);          //报错
    }
}

(4)实例方法可以访问静态成员,也可以访问实例成员 

public class Test {
    public static int numbers1 = 100;
    private int numbers2 = 100;
    public void method(){
        System.out.println(numbers1);      //正常
        System.out.println(numbers2);      //正常
        Test t = new Test();
        t.numbers2=100;
        System.out.println(t.numbers2);    //正常
        System.out.println(this);          //正常
    }
}

四、代码块

定义在类中,方法外,{}括起来的代码                      { } 或 { };

1、静态代码块

static{ }    只能调用静态成员

特点:随着类加载而执行只会执行一次,并且在main方法执行前执行    

public class Test {
    static {
        System.out.println("静态代码块被执行");
    }

    public static void main(String[] args) {
        System.out.println(1);
    }
}

(1)创建对象时会加载类,执行静态代码块

public class Test {
    public static void main(String[] args) {
        new A();
        System.out.println(1);
    }
}

class A{
    static {
        System.out.println("A的静态代码块被执行");
    }
}

(2)使用静态成员时会加载类,执行静态代码块 

public class Test {
    public static void main(String[] args) {
        System.out.println(A.n);
    }
}

class A{
    static int n = 1;

    static {
        System.out.println("A的静态代码块被执行");
    }
}

(3)创建子类对象或使用子类成员时,父类也会被加载,先执行父类的静态代码块,再执行子类的静态代码块

public class Test {
    public static void main(String[] args) {
        new B();
        System.out.println(1);
    }
}

class A{
    static {
        System.out.println("A的静态代码块被执行");
    }
}

class B extends A{
    static {
        System.out.println("B的静态代码块被执行");
    }
}
public class Test {
    public static void main(String[] args) {
        System.out.println(B.n);
    }
}

class A{
    static {
        System.out.println("A的静态代码块被执行");
    }
}

class B extends A{
    static int n = 1;
    static {
        System.out.println("B的静态代码块被执行");
    }
}

2、实例代码块

{ }    可以调用任意成员

特点:每次创建对象都会执行该代码块,并且在构造器执行前执行

public class Test {
    public static void main(String[] args) {
        new A();
    }
}

class A{
    {
        System.out.println("实例代码块被执行");
    }

    public A(){
        System.out.println("构造器被执行");
    }
}

 创建子类对象时,先执行父类的实例代码块,构造器,再执行子类的实例代码块,构造器

public class Test {
    public static void main(String[] args) {
        new B();
    }
}

class A{
    {
        System.out.println("A的实例代码块被执行");
    }

    public A(){
        System.out.println("A的构造器被执行");
    }
}

class B extends A{
    {
        System.out.println("B的实例代码块被执行");
    }

    public B(){
        System.out.println("B的构造器被执行");
    }
}

3、创建一个对象时,在类中的调用顺序

(1)调用静态代码块和静态成员变量初始化,两者调用的优先级一样,按顺序调用

(2)调用实例代码块和实例成员变量初始化,两者调用的优先级一样,按顺序调用

(3)调用构造器

public class Test {
    public static void main(String[] args) {
        new A();
    }
}

class A{
    static int n1 = getN1();

    int n2 = getN2();

    static {
        System.out.println("A的静态代码块被执行");
    }

    {
        System.out.println("A的实例代码块被执行");
    }

    static int getN1(){
        System.out.println("getN1被调用");
        return 1;
    }

    int getN2(){
        System.out.println("getN2被调用");
        return 1;
    }

    public A(){
        System.out.println("A的构造器被调用");
    }
}

 输出结果:

getN1被调用
A的静态代码块被执行
getN2被调用
A的实例代码块被执行
A的构造器被调用

4、创建一个子类对象时,在类中的调用顺序 

(1)调用父类静态代码块和静态成员变量初始化,两者调用的优先级一样,按顺序调用

(2)调用子类静态代码块和静态成员变量初始化,两者调用的优先级一样,按顺序调用

(3)调用父类实例代码块和实例成员变量初始化,两者调用的优先级一样,按顺序调用

(4)调用父类构造器

(5)调用子类实例代码块和实例成员变量初始化,两者调用的优先级一样,按顺序调用

(6)调用子类构造器

public class Test {
    public static void main(String[] args) {
        new B();
    }
}

class A{
    static int n = getNA();

    int m = getMA();

    public static int getNA(){
        System.out.println("父类静态初始化");
        return 1;
    }

    public int getMA(){
        System.out.println("父类实例初始化");
        return 1;
    }

    static {
        System.out.println("父类的静态代码块被调用");
    }

    {
        System.out.println("父类的实例代码块被调用");
    }

    public A(){
        System.out.println("父类的构造器被调用");
    }
}

class B extends A{
    static int n = getNB();

    int m = getMB();

    public static int getNB(){
        System.out.println("子类静态初始化");
        return 1;
    }

    public int getMB(){
        System.out.println("子类实例初始化");
        return 1;
    }

    static {
        System.out.println("子类的静态代码块被调用");
    }

    {
        System.out.println("子类的实例代码块被调用");
    }

    public B(){
        System.out.println("子类的构造器被调用");
    }
}

输出结果:

父类静态初始化
父类的静态代码块被调用
子类静态初始化
子类的静态代码块被调用
父类实例初始化
父类的实例代码块被调用
父类的构造器被调用
子类实例初始化
子类的实例代码块被调用
子类的构造器被调用

五、final

1、修饰类 

该类是最终类,不能被继承

class father{

}
final class son extends father{
    
}
final class father{
    
}
class son extends father{     //报错

}

2、修饰方法

该方法是最终方法,不能被重写

class father{
    public final void run(){
        System.out.println(1);
    }
}
class son extends father{
    @Override
    public void run() {       //报错
        super.run();
    }
}

3、修饰变量

该变量第一次被赋值后,不能再次被赋值

(1)修饰的变量是基本类型,数据值不能改变

修饰局部变量

public class Test {
    public static void main(String[] args) {
        final int n = 1;
        n = 2;               //报错
    }
}

修饰静态成员变量  

public class Test {
    public static final int n = 1;

    public static void main(String[] args) {
        n = 2;              //报错
    } 
}

修饰实例成员变量 

public class Test {
    private final int n = 1;

    public static void main(String[] args) {
        Test t = new Test();
        t.n = 2;            //报错
    }
}

(2)修饰的变量是引用类型 ,地址值不能改变,地址指向的对象内容可以发生变化

public class Test {
    public static void main(String[] args) {
        final Numbers n = new Numbers();
        n = null;            //报错
    }
}

class Numbers{
}

六、常量

使用 final 修饰的成员变量,用大写字母命名,多个单词用下划线连接起来

(1)必须初始化,其值不能改变,初始化可在定义时,代码块,构造器中进行

class A {
    public final int NUMBERS1 = 100;
    public final int NUMBERS2;
    public final int NUMBERS3;

    {
        NUMBERS2 = 100;
    }

    public A() {
        NUMBERS3 = 100;
    }
}

(2)使用 public static final 修饰的成员变量,初始化可在定义时,静态代码块中进行

class A {
    public static final int NUMBERS1 = 100;
    public static final int NUMBERS2;

    static {
        NUMBERS2 = 100;
    }
}

(3)使用 public static final 修饰的成员变量,不会导致类加载

public class Test {
    public static void main(String[] args) {
        System.out.println(A.NUMBERS);
    }
}

class A {
    public static final int NUMBERS = 100;
    static {
        System.out.println("类被加载");         //不会输出
    }
}

七、抽象

1、修饰类

abstract修饰的为父类,由子类继承来实现抽象方法       

public abstract class Animal{

}

2、修饰方法

abstract修饰的为抽象方法,没有方法体,结尾有分号

public abstract class Animal{
    public abstract void eat();
}

(1)抽象类中不一定有抽象方法,但有抽象方法的必须是抽象类

(2)抽象方法不能使用private,final,static关键字,抽象类不能创造对象与重写相违背

private修饰的方法为私有方法,不能被其他类访问,因此不能被重写

final修饰的方法为最终方法,不能被重写

static修饰的方法可以直接被调用,而抽象方法没有方法体,不能够被类直接调用

对象可以调用类的方法,而抽象方法没有方法体,不能够被对象直接调用

(3)如果一个类继承了抽象类,那这个类必须重写完抽象类的所有抽象方法,否则这个类必须被定义成抽象类

abstract class Animal {
    public abstract void eat();
}

abstract class Cat extends Animal {

}

八、接口

public interface 接口名 { 常量 抽象方法 }   

(1)接口给出一些抽象方法,封装到一起,当某个类要使用的时候,再把这些方法写出来 

public interface Face {
    public static final int number = 1;
    public abstract void run();
}

(2)接口方法体中的常量和抽象方法都是public static final和public abstract,可以省略不写 

(3)常量可以通过接口名访问    接口名.常量名

public class Test{
    public static void main(String[] args) {
        System.out.println(Face.number);
    }
}

interface Face {
    int number = 1;
}

1、被实现

public class 实现类 implements 接口,接口....{} 

(1)接口不能创建对象,是用来被类实现的

(2)一个类实现接口必须重写完全部接口的全部抽象方法,否则这个类必须被定义成抽象类

class A implements Face1,Face2 {
    @Override
    public void run() {
        System.out.println(1);
    }
    @Override
    public void walk() {
        System.out.println(2);
    }
}

abstract class B implements Face1,Face2 {

}

interface Face1 {
    void run();
}

interface Face2 {
    void walk();
}

(3)一个类实现了多个接口,多个接口中存在同名方法不冲突,在这个类中重写方法即可

public class Test{
    public static void main(String[] args) {
        new Face().run();
    }
}

class Face implements Face1,Face2{
    @Override
    public void run() {
        System.out.println(1);
    }
}

interface Face1{
    void run();
}

interface Face2{
    void run();
}

(3)一个类继承了父类,又实现了接口,父类和接口中有同名方法,默认用父类的方法 

public class Test{
    public static void main(String[] args) {
        new Son().run();
    }
}

class Son extends Father implements Face{

}

class Father{
    public void run(){
        System.out.println(1);
    }
}

interface Face{
    default void run(){
        System.out.println(2);
    }
}

 (4)一个类继承了父类,又实现了接口,父类和接口中有同名变量 

public class Test {
    public static void main(String[] args) {
        new Son().run();
    }
}

class Son extends Father implements Face {
    int n = 1;
    public void run() {
        System.out.println(super.n);
        System.out.println(n);
        System.out.println(Face.n);
    }
}

class Father {
    int n = 0;
}

interface Face {
    int n = 2;
}

2、多继承

接口不能继承类,但可以继承多个其他接口,整合多个接口为一个接口,便于子类的实现

(1)public interface 接口1 extends 接口2,接口3....{} 

public class Test{
    public static void main(String[] args) {
        new A().run();
        new A().walk();
    }
}
interface Face1{
    void run();
}

interface Face2 extends Face1{
    void walk();
}

class A implements Face2{
    @Override
    public void run() {
        System.out.println(1);
    }

    @Override
    public void walk() {
        System.out.println(2);

    }
}

(2)一个接口继承多个接口,如果多个接口中的方法出现规范冲突则不能继承 

interface face extends Face1,Face2{      //报错
}

interface Face1{
    int run();
}

interface Face2{
    void run();
}

3、默认方法

用default修饰,接口不能创建对象,方法过继给实现类,由实现类的对象调用

public class Test{
    public static void main(String[] args) {
        A a = new A();
        a.run();
    }
}

class A implements Face{

}

interface Face{
    default void run(){
        System.out.println(1);
    }
}

4、静态方法

用static修饰,接口的静态方法,必须接口名自己调用

public class Test{
    public static void main(String[] args) {
        Face.run();
    }
}
interface Face{
    static void run(){
        System.out.println(1);
    }
}

一个类实现多个接口,多个接口中有同样的静态方法名不冲突

public class Test implements face1,face2{
    public static void main(String[] args) {
        Face1.run();
        Face2.run();
    }
}

interface Face1{
    static void run(){
        System.out.println(1);
    }
}

interface Face2{
    static void run(){
        System.out.println(2);
    }
}

5、私有方法

用private修饰,只能在借口内部被调用

public class Test{
    public static void main(String[] args) {
        new A().run1();
    }
}

class A implements Face{

}

interface Face {
    default void run1(){
        System.out.println(1);
        run2();
    }
    private void run2(){
        System.out.println(2);
    }
}

6、接口的多态

(1)多态参数              接口类型的变量可以指向实现了该接口的类的对象实例

public class Test {
    public static void main(String[] args) {
        A a = new B();
        a = new C();
        run(new B());
        run(a);
    }
    public static void run(A a){
        a.run();
    }
}

interface A {
    void run();
}

class B implements A {
    @Override
    public void run() {
        System.out.println(1);
    }
}

class C implements A {
    @Override
    public void run() {
        System.out.println(2);
    }
}

(2)多态数组

public class Test {
    public static void main(String[] args) {
        A[] a = new A[2];
        a[0] = new B();
        a[1] = new C();
        a[0].run();
        a[1].run();
    }
}

interface A {
    void run();
}

class B implements A {
    @Override
    public void run() {
        System.out.println(1);
    }
}

class C implements A {
    @Override
    public void run() {
        System.out.println(2);
    }
}

(3)接口的多态传递 

B继承了A接口,C实现了B接口,那么相当于C也实现了A接口

public class Test {
    public static void main(String[] args) {
        B b = new C();
        A a = new C();
    }
}

interface A{
}

interface B extends A{
}

class C implements B{
}

九、内部类

                            定义位置                有无类名              作用域                             修饰符

局部内部类:外部类的局部位置上      有类名       定义它的方法体中      不能添加修饰符  final可以

匿名内部类:外部类的局部位置上      无类名       定义它的方法体中              不能添加修饰符

成员内部类:外部类的成员位置上      有类名       和外部类的成员一样        任何修饰符,无static

静态内部类:外部类的成员位置上      有类名       和外部类的成员一样        任何修饰符,有static

1、局部内部类

class Outer {                     //外部类

    public void m() {             //成员方法

        final class Inner {       //局部内部类,有final修饰,不可以被继承

        }
    }
}

(1)局部内部类可以直接访问外部类的包括private的所有成员

class Outer {
    private int n1 = 1;
    private void n2(){
    }

    public void m1() {

        class Inner {
            public void m2() {
                System.out.println(n1);
                n2();
            }
        }
    }
}

(2)外部其他类不能访问局部内部类,可以在局部内部类所在的方法中,创建局部内部类的对象,然后通过对象调用局部内部类的成员

public class Test {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.m1();
    }
}

class Outer {
    private int n1 = 1;
    private void n2(){
    }

    public void m1() {

        class Inner {
            public void m2() {
                System.out.println(n1);
                n2();
            }
        }
        Inner i = new Inner();
        i.m2();
    }
}

(3)如果外部类和局部内部类的成员重名时,就近原则

如果想访问外部类的成员,使用    外部类名.this.成员   

public class Test {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.m1();
    }
}

class Outer {
    private int n1 = 2;
    private void n2(){
        System.out.println(4);
    }
    public void m1() {
        class Inner {
            private int n1 = 1;
            private void n2(){
                System.out.println(3);
            }
            public void m2() {
                System.out.println(n1);
                System.out.println(Outer.this.n1);
                n2();
                Outer.this.n2();
            }
        }
        Inner i = new Inner();
        i.m2();
    }
}

外部类名.this本质就是外部类的对象,哪个对象调用了m1方法,外部类名.this就是哪个对象 

public class Test {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.m1();
        System.out.println(o);
    }
}

class Outer {
    public void m1() {
        class Inner {
            public void m() {
                System.out.println(Outer.this);
            }
        }
        Inner i = new Inner();
        i.m();
    }
}

输出结果:

com.javastudy.Outer@3b07d329
com.javastudy.Outer@3b07d329 

2、匿名内部类

基于接口/类的匿名内部类         new 类/接口(参数列表){ };      (注意结尾有分号)

public class Test {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.m();
    }
}

class Outer {
    public void m() {
        A a = new A(){          //a的编译类型是A,运行类型是匿名内部类Outer$1(匿名内部类命名方式=外部类$1)
            @Override           //jdk底层创建了匿名内部类Outer$1,同时马上创建了Outer$1对象,并且把地址返回给a
            public void mA() {

            }
        };
        System.out.println(a.getClass());  //匿名内部类使用一次就不能再使用,a可以一直使用
    }
}

interface A {
    void mA();
}

(1)匿名内部类可以直接访问外部类的包括private的所有成员

(2)外部其他类不能访问匿名内部类,匿名内部类是一个类的定义,可以在匿名内部类所在的方法中,创建匿名内部类的对象,然后通过对象调用匿名内部类的成员。同时匿名内部类本身也是一个对象,通过对象可以直接调用匿名内部类方法

public class Test {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.m();
    }
}

class Outer {
    public void m() {
        A a = new A() {
            @Override
            void mA() {
                System.out.println(1);
            }
        };
        a.mA();

        new A() {
            @Override
            void mA() {
                System.out.println(2);
            }
        }.mA();
    }
}

class A {
    void mA() {
    }
}

(3)如果外部类和匿名内部类的成员重名时,就近原则

如果想访问外部类的成员,使用    外部类名.this.成员

(4)匿名内部类可以当作实参直接传递

public class Test {
    public static void main(String[] args) {
        m(new A() {
            @Override
            public void run() {
                System.out.println(1);
            }
        });
    }
    public static void m(A a){
        a.run();
    }
}

interface A{
    void run();
}

3、成员内部类

class Outer{
    class Inner{
        
    }
}

(1)成员内部类可以直接访问外部类的包括private的所有成员

(2)可以在外部类的方法中,创建成员内部类的对象,进行调用

class Outer{
    public void n(){
        Inner i = new Inner();
        i.m();
    }

    class Inner{
        public void m(){
            
        }
    }
}

(3)外部其他类访问成员内部类

 直接创建内部类对象

public class Test {
    public static void main(String[] args) {
        Outer.Inner i = new Outer().new Inner();
        i.m();
    }
}

class Outer{
    class Inner{
        public void m(){
        }
    }
}

先创建外部类对象,再通过外部类对象创建内部类对象

public class Test {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.new Inner().m();
        Outer.Inner i = o.new Inner();    //相当于把new Inner()当作是的o成员
        i.m();
    }
}

class Outer{
    class Inner{
        public void m(){
        }
    }
}

 在外部类中编写一个可以返回Inner对象的方法

public class Test {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.getInner().m();
        Outer.Inner i = new Outer().getInner();
        i.m();
    }
}

class Outer{
    class Inner{
        public void m(){
        }
    }
    public Inner getInner(){
        return new Inner();
    }
}

(4)如果外部类和成员内部类的成员重名时,就近原则,

如果想访问外部类的成员,使用    外部类名.this.成员

4、静态内部类

class Outer{
    static class Inner{

    }
}

(1)静态内部类可以直接访问外部类的包括private的所有静态成员

(2)可以在外部类的方法中,创建静态内部类的对象,进行调用

(3)外部其他类访问静态内部类

 直接创建内部类对象 

public class Test {
    public static void main(String[] args) {
        Outer.Inner i = new Outer.Inner();
        i.m();
    }
}

class Outer{
    private static int n = 1;

    static class Inner{
        public void m(){
            System.out.println(n);
        }
    }
}

  在外部类中编写一个可以返回Inner对象的方法

public class Test {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.getInner().m();
        Outer.Inner i = o.getInner();
        i.m();
    }
}

class Outer{
    private static int n = 1;

    static class Inner{
        public void m(){
            System.out.println(n);
        }
    }
    public Inner getInner(){
        return new Inner();
    }
}
public class Test {
    public static void main(String[] args) {
        Outer.Inner i = Outer.getInner();
        i.m();
    }
}

class Outer{
    private int n = 1;
    static int m = 2;

    static class Inner{
        public void m(){
            System.out.println(m);
        }
    }
    public static Inner getInner(){
        return new Inner();
    }
}

(4)如果外部类和静态内部类的成员重名时,就近原则,

如果想访问外部类的成员,使用    外部类名.成员   

public class Test {
    public static void main(String[] args) {
        Outer.Inner i = new Outer.Inner();
        i.m();
    }
}

class Outer{
    private static int n = 1;
    static int m = 2;

    static class Inner{
        int n = 2;
        public void m(){
            System.out.println(Outer.n);
            System.out.println(n);
        }
    }
}

十、枚举类

1、使用enum关键子实现枚举

修饰符 enum 枚举类名  {  }

(1)枚举类都是继承了Enum类(java.lang.Enum),不能继承其他任何类,但可以实现接口

(2)枚举类都是最终类,不可被继承

(3)构造器默认私有化

(4)枚举类的第一行默认都是枚举对象的名称     常量名(实参列表)           逗号间隔,分号结尾

enum Season {
    SPRING("春天"), SUMMER("夏天"),
    AUTUMN("秋天"), WINTER("冬天");

    private String name;

    Season(){    
   
    }

    Season(String name) {
        this.name = name;
    }
}
enum Season {
    SPRING(1,"春天"), 
    SUMMER(2,"夏天"),
    AUTUMN(3,"秋天"), 
    WINTER(4,"冬天");

    private Integer id;
    private String name;

    Season(Integer id, String name) {
        this.id = id;
        this.name = name;
    }
}

 2、枚举对象

(1)创建枚举对象           枚举类名 对象名 = 枚举类名.成员变量名

        如果使用无参构造器创建枚举对象,则实参列表和括号都可以省略

(2)调用枚举成员变量    枚举类名.成员变量名

(3)调用枚举成员方法    对象名.成员方法  或者  枚举类名.成员变量名.成员方法

public class Test {
    public static void main(String[] args) {
        Season s = Season.SPRING;
        System.out.println(Season.SPRING);
        s.run();
        Season.SPRING.run();
    }

enum Season {
    SPRING("春天"), SUMMER("夏天"),
    AUTUMN("秋天"), WINTER("冬天");
    private String name;

    public void run(){
        System.out.println(1);
    }

    Season(String name) {
        this.name = name;
    }
}

3、enum成员方法 

(1)toString:Eunm类已经重写过,返回当前对象名,子类可以重写方法,返回对象的信息

        Season s = Season.SPRING;        
        System.out.println(s);               //输出SPRING

(2)name:返回当前对象名,子类不能重写

        Season s = Season.SPRING; 
        System.out.println(s.name());        //输出SPRING

(3)ordinal:返回当前对象的位置号,默认从0开始 

        Season s = Season.SPRING;        
        System.out.println(s.ordinal());     //输出0

(4)compareTo:比较两个枚举常量,比较的就是位置号,结果为前者位置号-后者位置号

        Season s = Season.SPRING;
        System.out.println(Season.AUTUMN.compareTo(s));  //输出2

(5)values:返回当前枚举类中所有的常量的一个数组

        Season[] s = Season.values();
        for (Season ss : s) {
            System.out.print(ss);
            System.out.print(" ");
        }
        //输出SPRING SUMMER AUTUMN WINTER SPRING

(6)valueOf:将字符串转换成枚举对象,要求字符串必须为已有的枚举常量名

        Season s = Season.valueOf("SPRING");
        System.out.println(s==Season.SPRING);       //输出true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值