一切皆对象。
编译型语言:编译器会将我们编写的源码一次性地编译成计算机可识别的二进制文件,然后计算机直接执行。如c、c++等。
解释型语言:在程序运行时,解释器会一行行读取我们的代码,然后实时地将这些源码解释成计算机可识别的二进制后再执行,因此解释型语言的效率通常较差一些。如Python、JavaScript等。
Java属于解释型语言,因为JVM就是解释器,并将class文件解释成计算机可识别的二进制数据后再执行。
public String toString() {
return this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());
}
A a = new A();
System.out.println(a);
System.out.println(a.hashCode());
System.out.println("将默认的十进制哈希码转换成十六进制形式:" + Integer.toHexString(a.hashCode()));
输出:
com.eos.javalearn.A@2401f4c3
604107971
将默认的十进制哈希码转换成十六进制形式:2401f4c3
public boolean equals(Object obj) {
return this == obj;
}
static {
System.out.println("执行:静态初始化块");
}
{
System.out.println("执行:实例初始化块");
}
class Dog {
{
//这里会报错:llegal forward reference
System.out.println("tag = " + tag);
}
public String tag;
}
class Cat {
int j = getI();
int i = 10;
public static void main(String[] args) {
System.out.println(new Cat().j);
}
public int getI() {
return i;
}
}
输出:
0
class Cat {
{
if(true) {
throw new FileNotFoundException();
}
}
public Cat() throws FileNotFoundException {}
public static void main(String[] args) throws FileNotFoundException {
System.out.println(new Cat());
}
}
class Dog {
String name;
//1.定义变量时就进行初始化
int age = 2;
public static int ID = 1;
static {
System.out.println("执行:静态初始化块1,ID = " + ID);
}
{
System.out.println("执行:实例初始化块1,name = " + name);
//4.使用实例初始化
name = "wangwang";
}
static {
System.out.println("执行:静态初始化块2");
}
{
System.out.println("执行:实例初始化块2,name = " + name);
name = "shasha";
}
public Dog(String name) {
System.out.println("执行:构造方法,name = " + this.name);
//2.在类的构造器中初始化
this.name = name;
System.out.println("构造方法执行完成,name = " + this.name);
}
public void say() {
//3.惰性初始化
if (name == null) {
name = "Jojo";
}
System.out.println("执行:say()成员方法, name = " + name);
}
public static void run() {
System.out.println("执行:run()类方法");
}
}
//调用:
Dog dog = new Dog("lala");
Dog.run();
输出如下:
执行:静态初始化块1,ID = 1
执行:静态初始化块2
执行:实例初始化块1,name = null
执行:实例初始化块2,name = wangwang
执行:构造方法,name = shasha
构造方法执行完成,name = lala
执行:run()类方法
Date date = new Date();
Srting str = new String("123adb");
引用存储在堆栈中,对象存储在堆中。堆和堆栈都在RAM中。
堆栈:栈又名堆栈。Java系统必须知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针,向上移动释放内存,向下移动分配新内存。
堆:new一个对象时,会自动在堆里进行存储分配。所有的Java对象都存储在堆中。
注:对于特别小又很简单的对象,为了高效起见,java和c++采用了相同的办法——基本类型。
Java对象和基本类型的生命周期不一样,它可以存活于作用域之外。
{
String s = new String("abc");
}
引用s在作用域终点就消失了,但是,s引用的String对象仍继续占据内存空间。
Java有一个垃圾回收器GC,用来监视new创建的所有对象,并辨别那些不会再被引用的对象,然后释放这些对象的内存空间,以便其他新的对象使用。所以你不必像c++那样考虑对象的回收问题。
abstract void f();
。 abstract class Animal {
@Override
public String toString() {
return getClass().getSimpleName();
}
}
interface AnimalBehavior {
void run();
void eat(String food);
}
abstract class Animal {
String name;
public Animal(String name) {
this.name = name;
}
}
class Cat extends Animal implements AnimalBehavior {
public Cat(String name) {
super(name);
}
@Override
public void run() {
System.out.println(name + " start run!");
}
@Override
public void eat(String food) {
System.out.println(name + " start eat " + food + "!");
}
}
//调用:
Cat cat = new Cat("wangwang");
cat.eat("meat");
cat.run();
输出:
wangwang start eat meat!
wangwang start run!
int A;
。 class A {
interface B {
void exec();
}
private B b;
public void setB(B b) {
this.b = b;
}
public void exec() {
b.exec();
}
}
class C implements A.B {
private A a;
@Override
public void exec() {
System.out.println("C exec()");
}
public void set() {
a = new A();
a.setB(this);
}
public A getA() {
return a;
}
}
调用:
C c = new C();
c.set();
A a = c.getA();
a.exec();
输出:
C exec()
class A {
private interface B {
void run();
}
private class C implements B {
@Override
public void run() {}
}
public class D implements B {
@Override
public void run() {}
}
public B getB_C() {
return new C();
}
public B getB_D() {
return new D();
}
//接收B
private B b;
public void setB(B b) {
this.b = b;
b.run();
}
}
public class JavaLearnClass {
public static void main(String[] args) {
A a = new A();
//父接口是private,因此外部无法引用其子类的对象,不管是public还是private的
//A.B b_c = a.getB_C();
//A.B b_d = a.getB_D();
//A.C a_c = a.getB_C();
//A.D a_d = a.getB_D();
//也不能访问其子类对象的方法
//a.getB_C().run();
//a.getB_D().run();
a.setB(a.getB_C());
a.setB(a.getB_D());
}
}
interface AA {
interface BB {
}
}
interface AnimalBehavior {
void eat(String food);
}
interface FlyAnimalBehavior extends AnimalBehavior {
void fly();
}
interface WaterAnimalBehavior extends AnimalBehavior {
void swim();
}
class Bird implements FlyAnimalBehavior {
@Override
public void eat(String food) {}
@Override
public void fly() {}
}
class Fish implements WaterAnimalBehavior {
@Override
public void eat(String food) {}
@Override
public void swim() {}
}
interface A {
void run();
}
interface B {
void run();
}
interface C {
void run();
}
class D {
void run() {
}
}
class E extends D implements A,B,C {
//run方法共同来自于D类、A接口、B接口、C接口
@Override
public void run() {
}
}
//系统动画监听类:Animator.AnimatorListener
public interface AnimatorListener {
default void onAnimationStart(@NonNull Animator animation, boolean isReverse) {
throw new RuntimeException("Stub!");
}
default void onAnimationEnd(@NonNull Animator animation, boolean isReverse) {
throw new RuntimeException("Stub!");
}
void onAnimationStart(@NonNull Animator var1);
void onAnimationEnd(@NonNull Animator var1);
void onAnimationCancel(@NonNull Animator var1);
void onAnimationRepeat(@NonNull Animator var1);
}
//我们进行实现
class MyAnimatorListener implements Animator.AnimatorListener {
@Override
public void onAnimationStart(@NonNull Animator animator) {}
@Override
public void onAnimationEnd(@NonNull Animator animator) {}
@Override
public void onAnimationCancel(@NonNull Animator animator) {}
@Override
public void onAnimationRepeat(@NonNull Animator animator) {}
}
//使用:
binding.lavStatus.addAnimatorListener(new MyAnimatorListener() {
@Override
public void onAnimationEnd(@NonNull Animator animator) {
super.onAnimationEnd(animator);
//xxx...
}
});
class Cat {
//重载
public void test(int a) {
System.out.println("Cat test(int)");
}
//重载
public void test(boolean a) {
System.out.println("Cat test(boolean)");
}
//重载
public void test(long a) {
System.out.println("Cat test(long)");
}
}
class BBB extends Cat {
//重写
public void test(int a) {
System.out.println("BBB test(int)");
}
//重载
public void test(short a) {
System.out.println("BBB test(short)");
}
}
class Dog {
String name;
public Dog() {
}
public Dog(String name) {
this.name = name;
}
public void say() {
System.out.println("say what?");
}
public void say(String text) {
System.out.println("say " + text);
}
}
-在子类中的被覆盖方法可以返回基类方法的返回类型的某种子类型。
class Animal {
@Override
public String toString() {
return getClass().getSimpleName();
}
}
class Cat extends Animal {
@Override
public String toString() {
return getClass().getSimpleName();
}
}
class GetAnimal {
public Animal getAnimal() {
return new Animal();
}
}
class GetCat extends GetAnimal{
@Override
public Cat getAnimal() {
return new Cat();
}
public static void main(String[] args) {
GetAnimal getAnimal = new GetAnimal();
Animal animal = getAnimal.getAnimal();
System.out.println(animal);
getAnimal = new GetCat();
animal = getAnimal.getAnimal();
System.out.println(animal);
}
}
class Test {
//类字段
public static int a;
//成员字段
public int b;
//类方法
public static int test() {
return 0;
}
//成员方法
public int getB() {
return b;
}
}
public static final int TEN_NUMBER = 10;
private final int intA = rand.nextInt(20);
private static final int INT_A = rand.nextInt(20);
public final String name;
public void run(final String a) {
//会报错
a = "0";
}
'private' method declared 'final'
。修饰符 | 可见性 |
---|---|
public | 所有类可见 |
protected | 当前类、子类、同一包路径下的类可见 |
default | 同一包路径下的类可见 |
private | 当前类可见 |
OuterClassName.InnerClassName
。外部类.this.成员
这种方式访问同名的成员或者方法。 class A {
public void test() {
}
class B {
private int b = 2;
public int value() {
return b;
}
public A getA() {
//引用外部类的对象
return A.this;
}
}
}
public class JavaLearnClass {
public static void main(String[] args) {
A a = new A();
//创建内部类的对象
A.B b = a.new B();
b.getA().test();
}
}
class A {
class B {
}
}
class C extends A.B {
public C(A a) {
a.super();
}
public static void main(String[] args) {
A a = new A();
C c = new C(a);
}
}
class A {
class B {
public B() {
System.out.println("Old B");
}
}
public A() {
System.out.println("Old A");
B b = new B();
}
}
class AA extends A {
class B {
public B() {
System.out.println("New B");
}
}
public AA() {
System.out.println("New AA");
}
public static void main(String[] args) {
new AA();
}
}
输出:
Old A
Old B
New AA
class A {
private B b;
class B {
public B() {
System.out.println("Old B");
}
public void test() {
System.out.println("Old B test()");
}
}
public A() {
System.out.println("Old A");
b = new B();
}
public void setB(B b) {
this.b = b;
}
public void test() {
b.test();
}
}
class AA extends A {
class BB extends B{
public BB() {
System.out.println("New BB");
}
@Override
public void test() {
System.out.println("New BB test()");
}
}
public AA() {
System.out.println("New AA");
setB(new BB());
}
public static void main(String[] args) {
AA aa = new AA();
aa.test();
}
}
输出:
Old A
Old B
New AA
Old B
New BB
New BB test()
public void test() {
class C {
}
C c = new C();
}
public void test(int a, int b) {
if (a > b) {
class C {
}
C c = new C();
}
}
interface String {
void string(java.lang.String string);
}
class A implements String {
String s1;
@Override
public void string(final java.lang.String s2) {
final java.lang.String s3 = "";
new String() {
String s4;
java.lang.String str = s2;
@Override
public void string(java.lang.String s5) {
java.lang.String s6 = "";
System.out.println("类的成员变量 s1 = " + s1 + ", 不需要指定为final, 不强制初始化");
System.out.println("方法的参数 s2 = " + s2 + ", 需要指定为final");
System.out.println("方法的局部变量 s3 = " + s3 + ", 需要指定为final, 强制初始化");
System.out.println("匿名内部类的成员变量 s4 = " + s4 + ", 不需要指定为final, 不强制初始化");
System.out.println("匿名内部类的方法的参数 s5 = " + s5 + ", 不需要指定为final");
System.out.println("匿名内部类的方法的局部变量 s6 = " + s6 + ", 不需要指定为final, 强制初始化");
}
};
}
}
interface Count {
int next();
}
class A {
int count;
public Count getCount(final String name) {
class LocalClass implements Count {
@Override
public int next() {
System.out.print(name);
return count++;
}
}
return new LocalClass();
}
public Count getCount2(final String name) {
return new Count() {
@Override
public int next() {
System.out.print(name);
return count++;
}
};
}
public static void main(String[] args) {
A a = new A();
Count count1 = a.getCount("局部内部类 ");
Count count2 = a.getCount2("匿名内部类 ");
for (int i = 0;i < 10;i++) {
if (i < 5) {
System.out.println(count1.next());
} else {
System.out.println(count2.next());
}
}
}
}
输出:
局部内部类 0
局部内部类 1
局部内部类 2
局部内部类 3
局部内部类 4
匿名内部类 5
匿名内部类 6
匿名内部类 7
匿名内部类 8
匿名内部类 9
abstract class A {
}
interface B {
}
class C {
private String str1;
public A a = new A() {
@Override
public String toString() {
return this.getClass().getSimpleName();
}
};
public B b = new B() {
@Override
public String toString() {
return this.getClass().getSimpleName();
}
};
public B getNewB(final String str2) {
final String str3 = "1";
return new B() {
String str4;
String str = str2;
public void test(String str5) {
String str6 = "";
System.out.println("类的成员变量 str1 = " + str1 + ", 不需要指定为final, 不强制初始化");
System.out.println("方法的参数 str2 = " + str2 + ", 需要指定为final");
System.out.println("方法的局部变量 str3 = " + str3 + ", 需要指定为final, 强制初始化");
System.out.println("匿名内部类的成员变量 str4 = " + str4 + ", 不需要指定为final, 不强制初始化");
System.out.println("匿名内部类的方法的参数 str5 = " + str5 + ", 不需要指定为final");
System.out.println("匿名内部类的方法的局部变量 str6 = " + str6 + ", 不需要指定为final, 强制初始化");
}
};
}
public void test() {
System.out.println("a = " + a.toString() + ", b = " + b.toString());
}
public static void main(String[] args) {
C c = new C();
c.test();
}
}
A.B b = new A.B();
new 外部类().成员
的方式访问 。外部类名.静态成员
访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过成员名
直接调用外部类的静态成员。Inner in = new Inner();
Outer.Inner in = new Outer.Inner();
。 class A {
//外部类的成员变量
String s;
//外部类的静态成员变量
static String ss;
//外部类的成员方法
void test(int i) {}
//外部类的静态方法
static void test() {}
static class B {
//静态内部类可以定义静态变量
static String s1;
//静态内部类可以定义成员变量
String s2;
//静态内部类不可以使用外部类的成员变量
//String s3 = s;
//但可以使用创建的外部类的实例来访问外部类的成员变量
String s3 = a.s;
//静态内部类可以使用外部类的静态变量
String s4 = ss;
//静态内部类不可以访问非静态外部类对象
//A a = A.this;
//但可以创建外部类的实例
A a = new A();
//静态内部类可以定义静态方法
static void show() {}
//静态内部类可以定义成员变量
void exec() {
//静态内部类不能访问非静态外部类对象,因此不能调用其的成员方法
//a.test(1);
//但可以通过创建的外部类的实例来访问其成员方法
a.test(1);
//静态内部类可以调用非静态外部类的静态方法
test();
}
//静态内部类可以定义成员内部类
class D {
}
//静态内部类可以定义静态内部类
static class E {
}
}
class C {
//成员内部类不可以定义静态变量
//static String s1;
//成员内部类可以定义成员变量
String s2;
//成员内部类可以使用外部类的成员变量
String s3 = s;
//成员内部类可以使用外部类的静态变量
String s4 = ss;
//成员内部类可以访问非静态外部类对象
A a = A.this;
//成员内部类不可以定义静态方法
//static void show() {}
//成员内部类可以定义成员方法
void exec() {
//成员内部类可以调用非静态外部类对象的成员方法
a.test(1);
//成员内部类可以调用非静态外部类对象的静态方法
test();
}
//成员内部类可以定义成员内部类
class D {
}
//成员内部类可以不可以定义静态内部类
//static class E {
//
//}
}
}
interface A {
void test();
class B implements A {
@Override
public void test() {
}
}
}
interface E {
}
class A {
//成员内部类
class B {}
//静态内部类
static class C {}
public void test() {
A a = new A();
System.out.println("外部类的类名称:" + a.getClass().getName());
B b = new B();
System.out.println("成员内部类的类名称:" + b.getClass().getName());
C c = new C();
System.out.println("静态内部类的类名称:" + c.getClass().getName());
//局部内部类
class D {
}
D d = new D();
System.out.println("局部内部类的类名称:" + d.getClass().getName());
//匿名内部类
E e = new E() {
};
System.out.println("匿名内部类的类名称:" + e.getClass().getName());
}
public static void main(String[] args) {
A a = new A();
a.test();
}
}
输出:
外部类的类名称:com.eos.javalearn.A
成员内部类的类名称:com.eos.javalearn.A$B
静态内部类的类名称:com.eos.javalearn.A$C
局部内部类的类名称:com.eos.javalearn.A$1D
匿名内部类的类名称:com.eos.javalearn.A$1