


ChildGame.java
package com.hspedu.static_;
public class ChildGame {
public static void main(String[] args) {
//定义一个变量count,统计有多少小孩加入游戏
int count = 0;
Child child1 = new Child("小明");
child1.join();
count++;
Child child2 = new Child("小红");
child1.join();
count++;
Child child3 = new Child("小辉");
child1.join();
count++;
System.out.println("共有" + count + "名小孩加入了游戏");
}
}
class Child {
private String name;
public Child(String name) {
this.name = name;
}
public void join(){
System.out.println(name + "加入了游戏");
}
}

ChildGame.java
package com.hspedu.static_;
public class ChildGame {
public static void main(String[] args) {
Child child1 = new Child("小明");
child1.join();
child1.count++;
Child child2 = new Child("小红");
child1.join();
child2.count++;
Child child3 = new Child("小辉");
child1.join();
child3.count++;
//类变量,可以通过类名来访问
System.out.println("共有" + Child.count + "名小孩加入了游戏");
//下面的代码输出的都是3
System.out.println("child1.count=" +child1.count);
System.out.println("child2.count=" +child2.count);
System.out.println("child3.count=" +child3.count);
}
}
class Child {
private String name;
//定义一个变量count,是一个类变量(静态变量)
//该变量最大的特点就是会被Child类的所有对象实例共享
public static int count = 0;
public Child(String name) {
this.name = name;
}
public void join(){
System.out.println(name + "加入了游戏");
}
}


https;//blog.csdn.net/x_iya/article/details/81260154/ https://www.zhihu.com/question/59174759/answer/163207831

VisitStatic.java
package com.hspedu.static_;
public class VisitStatic {
public static void main(String[] args) {
//类名.类变量名
//类变量是随着类的加载而创建,所以即使没有创建对象实例也可以访问
System.out.println(A.name);
A a = new A();
//通过对象名.类变量名
System.out.println("a.name = " + a.name);
//类变量的访问,必须遵守相关的访问权限
//System.out.println(A.edu);
}
}
class A {
//类变量
public static String name = "韩顺平教育";
//类变量的访问,必须遵守相关的访问权限
private static String edu = "韩顺平教育";
//普通属性/普通成员变量/非静态成员变量/非静态属性/实例变量
private int num = 10;
}


StaticDetail.java
package com.hspedu.static_;
public class StaticDetail {
public static void main(String[] args) {
B b = new B();
//5.实例变量不能通过类名.类变量名方式进行访问
//System.out.println(B.n1);
System.out.println(B.n2);
//6.静态变量是类加载的时候就创建了,所以我们没有创建对象实例,也可以通过类名.类变量名来访问
System.out.println(C.address);
}
}
class B {
public int n1 = 100;
public static int n2 = 200;
}
class C{
public static String address = "北京";
}


StaticMethod.java
package com.hspedu.static_;
public class StaticMethod {
public static void main(String[] args) {
Stu tmo = new Stu("tmo");
//tmo.payFee(100);//正确
Stu.payFee(100);//正确
Stu mary = new Stu("mary");
Stu.payFee(200);//正确
//mary.payFee(200);//正确
//输出当前收到的总学费
Stu.shouFee();//300
//如果我们希望不创建实例,也可以调用某个方法,把方法做成静态方法时非常适合
System.out.println("9开平方的结果=" + Math.sqrt(9));
System.out.println(MyTools.calSum(10,30));
}
}
class Stu{
private String name;
//定义一个静态变量,来累计学生学费
private static double fee = 0;
public Stu(String name) {
this.name = name;
}
//1.当方法使用了static方法修饰后,该方法就是静态方法
//2.静态方法就可以访问静态属性变量
public static void payFee(double fee){
Stu.fee += fee;
}
public static void shouFee(){
System.out.println("总学费有:" + Stu.fee);
}
}
//开发自己的工具类时,可以将方法做成静态的,方便调用
class MyTools{
public static double calSum(double n1,double n2){
return n1+n2;
}
}


StaticMethodDetail.java
package com.hspedu.static_;
public class StaticMethodDetail {
public static void main(String[] args) {
D.hi();//ok
//D.say();//错误,3.非静态方法不能通过类名调用,需要先创建对象再调用
D d = new D();
d.say();
}
}
class D {
private int n1 = 100;
private static int n2 = 200;
public void say(){
}
public static void hi(){
//4.类方法中不允许使用和对象有关的关键字,比如this和super,普通方法(成员方法)可以
//System.out.println(this.n1);//错误
}
//5.类方法中,只能访问静态变量或者静态方法
//口诀:静态方法只能访问静态成员
public static void hello(){
System.out.println(n2);//ok
System.out.println(D.n2);//ok
//System.out.println(n1);//错误
//System.out.println(this.n2);//错误
hi();//ok
//say();//错误
}
//普通成员方法,即可访问非静态成员,也可以访问静态成员
//小结:非静态方法可以访问静态成员和非静态成员
public void ok(){
//非静态成员
System.out.println(n1);
say();
//静态成员
System.out.println(n2);
hello();
}
}




Hello.java
public class Hello {
public static void main(String[] args){
//args是如何传入
//遍历显示
for(int i = 0;i < args.length;i++){
System.out.println("第"+ (i+1) + "个参数=" + args[i]);
}
}
}


Main01.java
package com.hspedu.main;
public class Main01 {
//静态变量/属性
private static String name = "韩顺平教育";
//静态方法
public static void hi(){
System.out.println("Main01的hi方法");
}
//非静态变量/属性
private int n1 = 10000;
//非静态方法
public void cry(){
System.out.println("Main01的cry方法");
}
public static void main(String[] args) {
//可以直接使用name
//1.静态方法main 可以访问本类的静态成员
System.out.println("name=" + name);
hi();
//2.静态方法main不可以访问本类的非静态成员
//System.out.println("n1=" + n1);//错误
//cry();//错误
//3.如果静态方法main要访问本类的非静态成员,需要先创建对象,再调用即可
Main01 main01 = new Main01();//ok
System.out.println(main01.n1);//ok
main01.cry();//ok
}
}


Main02.java
package com.hspedu.main;
public class Main02 {
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
System.out.println("args[" + i + "] = " + args[i]);
}
}
}
//
//args[0] = 北京
//...

CodeBlock01.java
package com.hspedu.codeblock_;
public class CodeBlock01 {
public static void main(String[] args) {
Movie movie = new Movie("你好,李焕英");
System.out.println("=============");
new Movie("唐人街探案",100,"陈思诚");
}
}
class Movie{
private String name;
private double price;
private String director;
//3个构造器->重载
//1.下面单个构造器都有相同的语句
//2.代码比较冗余
//3.可以把相同的语句放在一个代码块中
//4.当我们不管调用哪个构造器创建对象,都会先调用代码块的内容
//5.代码块调用的顺序优先于构造器
{
System.out.println("电影屏幕打开...");
System.out.println("广告开始...");
System.out.println("电影正式开始...");
}
public Movie(String name) {
// System.out.println("电影屏幕打开...");
// System.out.println("广告开始...");
// System.out.println("电影正式开始...");
System.out.println("Movie(String name)构造器被调用");
this.name = name;
}
public Movie(String name, double price) {
// System.out.println("电影屏幕打开...");
// System.out.println("广告开始...");
// System.out.println("电影正式开始...");
System.out.println("Movie(String name, double price)构造器被调用");
this.name = name;
this.price = price;
}
public Movie(String name, double price, String director) {
// System.out.println("电影屏幕打开...");
// System.out.println("广告开始...");
// System.out.println("电影正式开始...");
System.out.println("Movie(String name, double price, String director)构造器被调用");
this.name = name;
this.price = price;
this.director = director;
}
}

CodeBlockDetail01.java
package com.hspedu.codeblock_;
public class CodeBlockDetail01 {
public static void main(String[] args) {
//类被加载的情况举例:
// 1.创建对象实例时(new)
//AA aa = new AA();
/**
* AA的静态代码块1被执行...
*/
//2.创建子类对象实例,父类也会被加载,而且父类先被加载,子类后被加载
//AA aa2 = new AA();
/**
*BB的静态代码块1被执行...
*AA的静态代码块1被执行...
*/
//3.使用类的静态成员时(静态属性,静态方法)
//System.out.println(Cat.n1);
/**
* Animal的静态代码1被执行...
* Cat的静态代码1被执行...
* 999
*/
//static代码块是在类加载时执行的,而且只会执行一次
//DD dd = new DD();
//DD dd1 = new DD();
/**
* DD的静态代码1被执行...
* DD的静普通代码块...
* DD的静普通代码块...
*/
//普通的代码块,在创建对象实例时,会被隐式的调用。
//被创建一次,就会调用一次。如果只是使用类的静态成员时,普通代码块并不会执行
System.out.println(DD.n1);
/**
* DD的静态代码1被执行...
* 8888
*/
}
}
class DD {
public static int n1 = 8888;//静态属性
//静态代码块
static {
System.out.println("DD的静态代码1被执行...");
}
//普通代码块,在new对象时,被调用,每创建一个对象,就调用一次
{
System.out.println("DD的静普通代码块...");
}
}
class Animal {
static {
System.out.println("Animal的静态代码1被执行...");
}
}
class Cat extends Animal{
public static int n1 = 999;//静态属性
//静态代码块
static {
System.out.println("Cat的静态代码1被执行...");
}
}
class BB{
//静态代码块
static {
System.out.println("BB的静态代码块1被执行...");
}
}
class AA extends BB{
//静态代码块
static {
System.out.println("AA的静态代码块1被执行...");
}
}

CodeBlockDetail02.java
package com.hspedu.codeblock_;
public class CodeBlockDetail02 {
public static void main(String[] args) {
A a = new A();
/**
* getN1被调用...
* A 静态代码块01
* getN2被调用...
* A 普通代码块01
* A()构造器被调用
*/
}
}
class A{
private int n2 = getN2();//普通属性的初始化
{//普通代码块
System.out.println("A 普通代码块01");
}
//静态属性的初始化
private static int n1 = getN1();
static {//静态代码块
System.out.println("A 静态代码块01");
}
public static int getN1(){
System.out.println("getN1被调用...");
return 100;
}
public int getN2(){
System.out.println("getN2被调用...");
return 200;
}
//无参构造器
public A() {
System.out.println("A()构造器被调用");
}
}

CodeBlockDetail03.java
package com.hspedu.codeblock_;
public class CodeBlockDetail03 {
public static void main(String[] args) {
new BBB();
/**
* AAA的普通代码块...
* AAA()构造器被调用...
* BBB的普通代码块
* BBB()构造器被调用...
*/
}
}
class AAA{
{
System.out.println("AAA的普通代码块...");
}
public AAA() {
//1.隐藏super();
//2.调用本类的普通代码块
System.out.println("AAA()构造器被调用...");
}
}
class BBB extends AAA{
{
System.out.println("BBB的普通代码块");
}
public BBB() {
//1.隐藏super();
//2.调用本类的普通代码块
System.out.println("BBB()构造器被调用...");
}
}

CodeBlockDetail04.java
package com.hspedu.codeblock_;
public class CodeBlockDetail04 {
public static void main(String[] args) {
//老师说明
//(1) 进行类的加载
//1.1 先加载 父类 A02
//1.2 再加载 B02
//(2) 创建对象
//2.1 从子类的构造器开始
new B02();//对象
/**
* getVal01
* A02的一个静态代码块..
* getVal03
* B02的一个静态代码块..
* A02的第一个普通代码块..
* getVal02
* A02的构造器
* getVal04
* B02的第一个普通代码块..
* B02的构造器
*/
//new C02();
}
}
class A02 { //父类
private static int n1 = getVal01();
static {
System.out.println("A02的一个静态代码块..");//(2)
}
{
System.out.println("A02的第一个普通代码块..");//(5)
}
public int n3 = getVal02();//普通属性的初始化
public static int getVal01() {
System.out.println("getVal01");//(1)
return 10;
}
public int getVal02() {
System.out.println("getVal02");//(6)
return 10;
}
public A02() {//构造器
//隐藏
//super()
//普通代码和普通属性的初始化......
System.out.println("A02的构造器");//(7)
}
}
class B02 extends A02 { //
private static int n3 = getVal03();
static {
System.out.println("B02的一个静态代码块..");//(4)
}
public int n5 = getVal04();
{
System.out.println("B02的第一个普通代码块..");//(9)
}
public static int getVal03() {
System.out.println("getVal03");//(3)
return 10;
}
public int getVal04() {
System.out.println("getVal04");//(8)
return 10;
}
//一定要慢慢的去品..
public B02() {//构造器
//隐藏了
//super()
//普通代码块和普通属性的初始化...
System.out.println("B02的构造器");//(10)
// TODO Auto-generated constructor stub
}
}
class C02 {
private int n1 = 100;
private static int n2 = 200;
private void m1() {
}
private static void m2() {
}
static {
//静态代码块,只能调用静态成员
//System.out.println(n1);错误
System.out.println(n2);//ok
//m1();//错误
m2();
}
{
//普通代码块,可以使用任意成员
System.out.println(n1);
System.out.println(n2);//ok
m1();
m2();
}
}

package com.hspedu.codeblock_;
public class CodeBlockExercise01 {
}
class Person {
public static int total;//静态变量
static {//静态代码块
total = 100;
System.out.println("in static block!");//(1)
}
}
class Test1 {
public static void main(String[] args) {
System.out.println("total = "+ Person.total); //100
System.out.println("total = "+ Person.total); //100
}
}
/**
* in static block!
* total = 100
* total = 100
*/

package com.hspedu.codeblock_;
public class CodeBlockExercise02 {
}
class Sample
{
Sample(String s)
{
System.out.println(s);
}
Sample()
{
System.out.println("Sample默认构造函数被调用");
}
}
class Test{
Sample sam1=new Sample("sam1成员初始化");//
static Sample sam=new Sample("静态成员sam初始化 ");//
static{
System.out.println("static块执行");//
if(sam==null)System.out.println("sam is null");
}
Test()//构造器
{
System.out.println("Test默认构造函数被调用");//
}
//主方法
public static void main(String str[])
{
Test a=new Test();//无参构造器
}
}
/**
* 静态成员sam初始化
* static块执行
* sam1成员初始化
* Test默认构造函数被调用
*/

SingleTon01.java
package com.hspedu.single_;
public class SingleTon01 {
public static void main(String[] args) {
//GirlFriend xh = new GirlFriend("小红");
//GirlFriend xb = new GirlFriend("小白");
//通过方法可以获得对象
System.out.println(GirlFriend.getInstance());
GirlFriend instance1 = GirlFriend.getInstance();
System.out.println(instance1);
GirlFriend instance2 = GirlFriend.getInstance();
System.out.println(instance2);
System.out.println(instance1 == instance2);
/**
* GirlFriend{name='小红红'}
* GirlFriend{name='小红红'}
* GirlFriend{name='小红红'}
* true
*/
System.out.println(GirlFriend.n1);
/**
* 构造器被调用
* 100
*/
//饿汉式:在执行上面语句时,还没有用到gf对象,但是处于类的机制,gf对象已经创建好了
}
}
//有一个类 GirlFriend
//只能有一个女朋友
class GirlFriend{
private String name;
public static int n1 = 100;
//为了能够在静态方法中 ,返回gf对象,需要将其修饰为static
//对象通常是重量级的对象,饿汉式可能造成创建了对象,但是没有使用
private static GirlFriend gf = new GirlFriend("小红红");
//如何保证只能创建一个GirlFriend对象
//步骤[单例模式-饿汉式]:
//1.将构造器私有化
//2.在类的内部直接创建对象(该对象是static)
//3.提供一个公共的static方法,返回gf对象
private GirlFriend(String name) {
System.out.println("构造器被调用");
this.name = name;
}
public static GirlFriend getInstance(){
return gf;
}
@Override
public String toString() {
return "GirlFriend{" +
"name='" + name + '\'' +
'}';
}
}
SingleTon02.java
package com.hspedu.single_;
/**
* 演示懒汉式的单例模式
*/
public class SingleTon02 {
public static void main(String[] args) {
System.out.println(Cat.n1);//999
Cat instance = Cat.getInstance();
System.out.println(instance);
//再次调用getInstance
Cat instance2 = Cat.getInstance();
System.out.println(instance2);
System.out.println(instance == instance2);
/**
* 999
* 构造器被调用...
* Cat{name='小可爱'}
* Cat{name='小可爱'}
* true
*/
}
}
//希望在程序运行过程中,只能创建一个Cat对象
//使用单例模式
class Cat {
private String name;
public static int n1 = 999;
private static Cat cat;//默认为null
//步骤
//1.构造器私有化
//2.定义一个static静态属性对象
//3.提供一个public的static方法,可以返回一个Cat对象
//4.懒汉式,只有当用户使用getInstance时,才返回cat对象,后面再次调用时,会返回上次创建的cat对象,保证单例
public Cat(String name) {
System.out.println("构造器被调用...");
this.name = name;
}
public static Cat getInstance(){
if(cat == null){
cat = new Cat("小可爱");
}
return cat;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
'}';
}
}

Final01.java
package com.hspedu.final_;
public class Final01 {
public static void main(String[] args) {
//3.当不希望类的某个属性的值被修改,可以用final修饰
//E e = new E();
//e.TAX_RATE = 0.09;错误
}
}
//1.如果我们要求A类不能被其他类继承,可以使用final修饰A类
final class A{
}
//class B extends A{
//
//}错误
class C{
//2.如果我们要求hi不能被子类重写,可以使用final修饰hi方法
public final void hi(){}
}
class D extends C{
// public void hi(){
// System.out.println("我重写了父类C类的hi方法....");
// }//错误
}
class E{
//3.当不希望类的某个属性的值被修改,可以用final修饰
public final double TAX_RATE = 0.08;
}
//4.当不希望某个局部变量被修改,可以使用final修饰
class F{
public void cry(){
//这时NUM也被称为局部变量
final double NUM = 0.01;
//NUM = 0.9;//错误
System.out.println("NUM=" + NUM);
}
}

FinalDetail01.java
package com.hspedu.final_;
public class FinalDetail01 {
public static void main(String[] args) {
CC cc = new CC();
new EE().cal();//cal()方法
}
}
class AA {
/*
2.final修饰的属性在定义时,必须赋初值,并且以后不能再修改,赋值可以在如下位置之一(选择一个位置赋值即可):
a.定义时:如 public final double TAX_RATE=0.08;
b.在构造器中
c.在代码块中
*/
//1.final修饰的属性又叫常量,一般用XX_XX_XX来命名
public final double TAX_RATE = 0.08;//1.定义时赋值
public final double TAX_RATE2 ;
public final double TAX_RATE3 ;
public AA() {//构造器中赋值
TAX_RATE2 = 1.1;
}
{//在代码块赋值
TAX_RATE3 = 8.8;
}
}
class BB {
/*
3.如果final修饰的属性是静态的,则初始化的位置只能是
a.定义时
b.在静态代码块 不能在构造器中赋值。
*/
public static final double TAX_RATE = 99.9;
public static final double TAX_RATE2 ;
static {
TAX_RATE2 = 3.3;
}
}
//4.final类不能继承,但是可以实例化对象
final class CC { }
//5.如果类不是final类,但是含有final方法,则该方法虽然不能重写,但是可以被继承,即,仍然遵守继承的机制.
class DD {
public final void cal() {
System.out.println("cal()方法");
}
}
class EE extends DD { }

FinalDetail02.java
package com.hspedu.final_;
public class FinalDetail02 {
public static void main(String[] args) {
System.out.println(BBB.num);
/**
* 10000
* 不会输出代码块
*/
//包装类,String 是final类,不能被继承
//String;
//Double;
}
}
//final 和 static 往往搭配使用,效率更高,不会导致类加载.底层编译器做了优化处理
class BBB {
public final static int num = 10000;
static {
System.out.println("BBB 静态代码块被执行");
}
}
final class AAA{
//一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法
//public final void cry(){
}

FinalExercise01.java
package com.hspedu.final_;
public class FinalExercise01 {
public static void main(String[] args) {
Circle circle = new Circle(5.0);
System.out.println("面积=" + circle.calArea());
//面积=78.5
}
}
class Circle {
private double radius;
private final double PI = 3.14;
public Circle(double radius) {
this.radius = radius;
//PI = 3.14;
}
{
//PI = 3.14;
}
public double calArea(){
return PI * radius *radius;
}
}
FinalExercise02.java
package com.hspedu.final_;
public class FinalExercise02 {
public static void main(String[] args) {
}
}
class Something { //FinalExercise02.java
public int addOne(final int x) {
//下面的代码是否有误,为什么? 1min
//++x; //错误,原因是不能修改 final x的值
return x + 1; //这里是可以.
}
}
MySQL学习笔记