JAVA学习笔记

break和continue

//break通过标号跳出循环
        da:for(int i=0;i<3;i++)
        {
            xiao:for(int j=0;j<3;j++)
            {
                System.out.println("j:"+j);
                if(j==2)
                {
                    break da;
                }
            }
        }
        
        //continue
        
        da:for(int i=0;i<3;i++)
        {
            xiao:for(int j=0;j<3;j++)
            {
                if(j==1)
                {
                    continue;
                }
                System.out.println("j:"+j);
            }
        }
        

数组排序

int[] arr = {33,2,56,7,23,90,32,22};
        //选择排序
        for(int i=0;i<arr.length-1;i++)
        {
            for(int j=i+1;j<arr.length;j++)
            {
                if(arr[i]>arr[j])
                {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
int[] arr = {33,2,56,7,23,90,32,22};
        //冒泡排序
        for(int i=0;i<arr.length-1;i++)
        {
            for(int j=0;j<arr.length-1-i;j++)
            {
                if(arr[j]>arr[j+1])
                {
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        for(int i=arr.length;i>0;i--)
        {
            for(int j=0;j<i-1;j++)
            {
                if(arr[j]>arr[j+1])
                {
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        //选择排序
        for(int i=0;i<arr.length-1;i++)
        {
        	int num = arr[i];
        	int index = i;
        	for(int j=i+1;j<arr.length;j++)
        	{
        		if(arr[j]<num)
        		{
        			num = arr[j];
        			index = j;
        		}
        	}
        	swap(arr,i,index);
        }

查找
折半查找

public static int halfSearch(int[] arr,int key)
    {
        int max,min,mid;
        min = 0;
        max = arr.length-1;
        mid = (min+max)/2;
        while(arr[mid]!=key)
        {
            if(arr[mid]>key)
                max = mid-1;
            else if(arr[mid]<key)
                min = mid+1;
            if(max<min)
                return -1;
            mid = (min+max)/2;
        }
        return mid;
    }

给一个有序数组,拟插入一个元素,找到插入元素的位置

public static int halfSearch(int[] arr,int key)
    {
        int max,min,mid;
        min = 0;
        max = arr.length-1;
        mid = (min+max)/2;
        while(arr[mid]!=key)
        {
            if(arr[mid]>key)
                max = mid-1;
            else if(arr[mid]<key)
                min = mid+1;
            if(max<min)
                return min;
            mid = (min+max)/2;
        }
        return min;
    }

## 进制转换

 //将数字转换为16进制
    public static void toHex(int num)
    {
        for(int i=0;i<8;i++)
        {
            int temp = num & 15;
            if(temp>9)
                System.out.println((char)(temp-10+'A'));
            else
                System.out.println(temp);
            num = num >>> 4;//右移四位
        }
    }
    //将数字转换为16进制
    public static void toHex(int num)
    {
        trans(num,15,4,8);
    }
    //将数字转换为2进制
    public static void toBinary(int num)
    {
        trans(num,1,1,32);
    }
    //将数字转换为8进制
    public static void toOcl(int num)
    {
        trans(num,7,3,16);
    }
    public static void trans(int num,int base,int offset,int len)
    {
        if(num==0)
        {
            System.out.println('0');
            return ;
        }
        char[] chs = {'0','1','2','3','4',
                    '5','6','7','8','9',
                    'A','B','C','D','E','F'};
        char[] hex = new char[len];
        int pos = 0;
        while(num!=0)
        {
            int temp = num & base;
            hex[pos++] = chs[temp];
            num = num >>> offset;//右移四位
        }
        for(int i=len-1;i>=0;i--)
        {
            System.out.print(hex[i]);
        }
    }

二维数组

		int[][] arr = new int[3][2];//创建一个二维数组,包含3个一维数组,每个一维数组包含2个元素
        int[][] arr1 = new int[2][];//分别对二维数组的每一个一维数组进行初始化
        arr1[0] = new int[1];
        arr1[1] = new int[2];

面向对象
匿名对象

Car c = new Car();//实名
new Car().run()//匿名对象
/*
当对象只对对象方法调用一次时,可以使用匿名对象
*/

static关键字

/*
1,用于修饰成员
2,修饰的成员被所有对象共享
3,static随着类的加载就存在了,优先于对象存在
4,可以直接被类名所调用
5,静态修饰的数据是共享数据,对象中存储的是特有数据
*/
//成员变量与静态变量的区别
/*
1,生命周期不一样
   成员变量随着对象的创建而存在,随着对象被收回而释放
   静态变量随着类的加载而存在,随着类的消失而消失
2,调用方式不同
   成员变量只被对象调用
   静态变量不仅可以被对象调用,还可以被类调用
3,别名不同
   成员变量--实例变量
   静态变量--类变量
4,数据存储位置不同
   成员变量数据:堆内存的对象中,所以也叫对象的特有数据
   静态变量数据:方法区中的静态区,所以也叫对象的共享数据
*/
//static在使用过程中需要注意的细节
/*
1.静态方法只能访问静态成员(非静态方法既可以访问静态成员,也可以访问非静态方法)
2.静态方法不能使用super和this关键字
3.主函数是静态的
*/
//静态什么时候用
/*
1.静态变量
  对象中所具有的成员变量都是相同的,可以用static修饰
2.静态函数
  函数是否访问到对象中的特有数据(非静态变量),需要,函数非静态,不需要函数静态。
*/
class Person{
    public String name;//成员变量,实例变量
    private int age;
    static String country = "cn";//静态变量
}
public class javatest{
        public static void main(String args[]) {
            Person p = new Person();
            System.out.println(p.country);
            System.out.println(Person.country);
    }
}

静态代码块

class staticCodeDemo//用于给类进行初始化
{
    static
    {
        System.out.println("static run");
    }
    void show()
    {
        System.out.println("show run");
    }
}
public class javatest{
        public static void main(String args[]) {
            new staticCodeDemo().show();
            new staticCodeDemo().show();
    }
}

在这里插入图片描述

主函数

//主函数
/*
1.格式是固定的:public static void main(String args[])
2.被jvm所识别和调用
public:权限必须最大
static:不需要对象的,直接用主函数所属类名调用
void:主函数没有具体返回值
main:函数名
args[]:参数列表
*/

类方法要不要加静态?
先写一个数组工具集

public class arrayTool {
    public int getMaxIndex(int[] arr){
        int maxIndex = 0;
        for(int i=0;i<arr.length;i++)
        {
            if(arr[i]>arr[maxIndex])
            {
                maxIndex = i;
            }
        }
        return maxIndex;
    }
}

javatest.java调用

import java.io.*;
public class javatest{
        public static void main(String args[]) {
            int[] arr = {1,2,3,4,5,6,7};
            arrayTool arrayTool = new arrayTool();
            int maxIndex = arrayTool.getMaxIndex(arr);
            System.out.println("the max:"+maxIndex);
    }
}
/*
调用前需要new一个arrayTool对象,考虑加static
*/

方法

public class arrayTool {
    private arrayTool(){}//该类中的方法都是静态的,所以该类不需要创建对象
                        //为了保证不让其他程序创建该类对象,将构造函数私有化
    public static int getMaxIndex(int[] arr){
        int maxIndex = 0;
        for(int i=0;i<arr.length;i++)
        {
            if(arr[i]>arr[maxIndex])
            {
                maxIndex = i;
            }
        }
        return maxIndex;
    }
}

调用程序

import java.io.*;
public class javatest{
        public static void main(String args[]) {
            int[] arr = {1,2,3,4,5,6,7};
            int maxIndex = arrayTool.getMaxIndex(arr);
            System.out.println("the max:"+maxIndex);
    }
}

设计模式

//设计模式
/**
 * 对问题行之有效的解决方式,其实他是一种思想
 * 1.单例设计模式
 *      保证一个类在内存中的对象唯一性
 * 怎么保证对象唯一性?
 * 1.不允许其他程序用new创建该类对象
 * 2.在该类创建一个本类实例
 * 3.对外提供一个方法让其他程序可以获取该对象
 * 步骤:
 * 1.私有化该类构造函数
 * 2.用new在本类创建一个本类对象
 * 3.定义一个公用方法,将该对象返回
 */
class Singal{//饿汉式,类一加载,就有对象
    static Singal s = new Singal();
    private Singal(){}
    public static Singal getInstance()
    {
        return s;
    }
}
class Singal2{//懒汉式,调用getInstance方法时才有对象
    static Singal2 s = null;
    private Singal2(){}
    public static Singal2 getInstance()
    {
        if(s==null)
            s = new Singal2();
        return s;
    }
}
public class javatest{
        public static void main(String args[]) {
            Singal ss = Singal.getInstance();
            Singal sss = Singal.s;
    }
}

继承

/**
 * 当本类的成员和局部变量同名,用this区分
 * this代表本类对象引用
 * 当本类成员和父类成员同名,用super区分
 * super代表父类空间
 */
/**
 * 覆盖注意事项:
 * 1.子类方法覆盖父类方法时,子类权限必须大于等于父类权限。
 * 2.静态只能覆盖静态,或被静态覆盖
 */
/**
 * 子父类中构造函数的特点
 * 在子类构造对象时,父类的构造函数也运行了
 * 因为在子类的构造函数中第一行有个默认的隐式语句:super();
 * 子类的实例化过程:
 * 子类中的所有构造函数默认都会访问父类中的空参构造函数
 * 如果子类构造函数中用this();调用本类的构造函数,就没有super();调用父类构造函数了
 * 因为this();和super();只能在第一行,但是可以保证的是会有其他构造函数调用父类的构造函数。
 */
/**
 * 自类构造对象时先运行父类构造函数,再县式初始化自类成员变量
 */
class A{
    A(){
        show();
    }
    void show()
    {
        System.out.println("A run");
    }
}
class B extends A{
    int num = 9;
    B()
    {
        super();
        System.out.println("B run");
    }
    void show()
    {
        System.out.println("zi run ... "+num);
    }
}
public class javatest{
        public static void main(String args[]) {
            B b = new B();
            b.show();
    }
}
运行结果:
zi run ... 0
B run
zi run ... 9

在这里插入图片描述
final关键字
在这里插入图片描述
抽象類

/**
 * 特點:
 * 1.方法只有聲明沒有實現時,該方法就是抽象方法,用abstract修飾
 * 2.抽象方法只能放在抽象類裏面
 * 3.抽象類不能被實例化,因爲抽象方法沒有意義
 * 4.抽象類必須由其子類覆蓋完所有的抽象方法之後,該子類才能被實例化
 */
 /**
 * 1.抽象類有構造函數,可以為子類進行初始化
 * 2.抽象類可以不定義抽象方法,目的是不讓該類創建對象。AWT的適配器對象就是這種類
 * 通常這個類中的方法有方法體,但是卻沒有類容
 * 3.抽象關鍵字(abstract)不能和private,static,final共存
 */
abstract class demo{
    abstract void show();
}
class demoA extends demo{
    void show(){
        System.out.println("demoA run");
    }
}
public class javatest{
        public static void main(String args[]) {
            demoA b = new demoA();
            b.show();
    }
}

接口

/*
 abstract class AbsDemo
 {
     abstract void show1();
     abstract void show2();
 } 
 儅一個抽象類中的方法都是抽象方法的時候,可以將該抽象類用用另一種形式定義和表示
 接口:interface
 對於接口中常見的成員:這些成員都有固定的修飾符:
 1.全局變量:public   static final
 2.抽象方法:public   abstract
 得出結論:接口中的成員都是公共的
 */
 //一个类可以实现多个多个接口
interface Demo{
    public static final int NUM = 4;
    public abstract void show1();
    public abstract void ahow2();
}
//接口不可以實例化,只能由實現了接口的子類並覆蓋了接口中所有的抽象方法之後,該子類才可以實例化
//否則這樣的子類就是一個抽象類
class DemoImpl implements Demo{
    public void show1(){}
    public void ahow2(){}
}

public class javatest{
        public static void main(String args[]) {
            DemoImpl d = new DemoImpl();
            System.out.println(d.NUM);
            System.out.println(DemoImpl.NUM);
            System.out.println(Demo.NUM);
    }
}
//4
//4
//4
//接口的出现避免了单继承的局限性
interface CC{
    void show();
}
interface MM{
    void method();
}
interface QQ extends CC,MM{//接口与接口之间是继承关系,并且接口可以多继承
    void function();
}
class WW implements QQ{
    //覆盖三个方法
    public void show(){}
    public void method(){};
    public void function(){};
}

在这里插入图片描述
接口和抽象类的区别
在这里插入图片描述
多态
在这里插入图片描述

/**
 * 多态
 * Cat c = new Cat();
 * Animal a = new Cat();//一个对象两种形态
 * 父类引用指向子类对象
 * 一个对象对应着不同类型
 * 多态在代码中的体现:
 *      父类或者接口的引用指向其子类的对象
 * 多态的好处:
 * 		提高了代码的扩展性,前期定义的代码可以使用后期的内容
 * 多态的弊端:
 * 		前期定义的内容不能使用(调用)后期子类特有的内容
 * 多态的前提:
 * 		1.必须有关系,继承,实现
 * 		2.要有覆盖
 */
abstract class Animal{
    abstract void eat();
}
class Dog extends Animal{
    void eat(){
        System.out.println("啃骨头");
    }
    void LookHome(){
        System.out.println("看家");
    }
}
class Cat extends Animal{
    void eat(){
        System.out.println("吃鱼");
    }
    void CatchMouse(){
        System.out.println("抓老鼠");
    }
}
public class javatest{
    public static void main(String args[]) {
            Cat cat = new Cat();
            Dog dog = new Dog();
            method(cat);
            method(dog);
    }
    public static void method(Animal c){
        c.eat();
    }
}
//运行结果
//吃鱼
//啃骨头
Animal cat = new Cat();//自动类型提升,猫对象提升为动物类型,但是特有功能无法访问
                     //功能:限制对特有功能的访问
                     //专业讲:向上提升
cat.eat();
//如果还想用猫的特有功能,可以讲该对象向下转型
Cat cat_ = (Cat)cat;
cat_.eat();
cat_.CatchMouse();
//注意:对于转型,自始至终都是子类对象在做着变化。
//这样不对
//Animal a = new Animal();
//Cat c = (Cat)a;

多态类型判断:instanceof

if(c instanceof Cat){//instanceof 用于判断对象的具体类型。只能用于引用数据类型判断
	Cat c_ = (Cat)c;
	c_.CatchMouse();
}
else if(c instanceof Dog){
	Dog d_ = (Dog)c;
	d_.LookHome();
}
//通常在向下转型前用于健壮性的判断
/**
 * 多态时,成员的特点:
 * 1.成员变量
 *      编译时,参考引用型变量所属的类中是否有调用的成员变量,有,编译通过,没有,编译失败
 *      运行时,参考引用型变量所属的类中是否有调用的成员变量,并运行该所属类中的成员变量
 *      编译和运行都参考左边
 * 2.成员函数(非静态)
 *      编译时,参考引用型变量所属的类中是否有调用的函数,有,编译通过,没有,编译失败
 *      运行时,参考对象所属的类中是否有调用的函数。
 *      编译看左边,运行看右边
 * 3.静态函数
 *      编译和运行都看左边
 *      其实对于静态方法是不需要对象的,直接用类名进行调用
 */

内部类
在这里插入图片描述

//分析事物时,发现事物中还有事物,而且这个事物还在访问被描述事物的内容,这时还有的事物用内部类来描述
//内部类可以加修饰符private protect等
//如果内部类中定义了静态成员,该内部类也必须是静态的
class Outer{
    private int age = 10;
    class Inner{
        private int in_age;
        void show(){
            System.out.println("inner show"+age);
        }
    }
    public void method(){
        Inner i = new Inner();
        i.show();
    }
}

public class javatest{
    public static void main(String args[]) {
        Outer o = new Outer();
        o.method();
        //直接访问外部类中的内部类成员
        Outer.Inner in = new Outer().new Inner();
        in.show();
        //如果内部类是静态的,相当于一个外部类
        //Outer.Inner in = new Outer.Inner();
    }
}
//内部类在局部位置上,只能访问局部位置被final修饰的变量
//运行结果:
//inner show10
/**
 * 内部类访问特点:
 * 1.内部类可以直接访问外部类中的成员
 * 2.外部类
 */
class Outer{
    private int age = 10;
    static class Inner{
        private int in_age;
        void show(){
            System.out.println("inner show");
        }
    }
    public void method(){
        Inner i = new Inner();
        i.show();
    }
}

public class javatest{
    public static void main(String args[]) {
        Outer o = new Outer();
        o.method();
        Outer.Inner in = new Outer.Inner();
        in.show();
        //如果内部类是静态的,相当于一个外部类
    }
}

匿名内部类

/**
 * 匿名内部类,就是内部类的简写格式。
 *      前提:
 *      内部类必须继承或实现一个外部类或接口
 * 格式:new 父类or接口{子类内容}
 */
abstract class Demo{
    abstract void show();
}
class Outer{
    int num = 3;
    /*
    class Inner extends Demo{
        void show(){
            System.out.println("inner show   "+num);
        }
    }
    */
    public void method(){
        // Inner i = new Inner();
        // i.show();
        new Demo(){//匿名内部类:创建一个Demo子类对象
            void show(){
                System.out.println("inner show   "+num);
            }
        }.show();
    }
}

public class javatest{
    public static void main(String args[]) {
        new Outer().method();
        //如果内部类是静态的,相当于一个外部类
    }
}
//运行结果:
//inner show   3
/**
 * 匿名内部类的应用
 *      使用场景一:当函数参数是接口类型时,而且接口中的方法不超过三个
 *      可以用匿名内部类作为实际参数进行传递
 */
abstract class Inner{
    abstract void show1();
    abstract void show2();
}
class Outer{
    int num = 3;
    public void method(){
        Inner in = new Inner(){//匿名内部类:创建一个Demo子类对象
            void show1(){
                System.out.println("inner show1   "+num);
            }
            void show2(){
                System.out.println("inner show2   "+num);
            }
        };
        in.show1();
        in.show2();
    }
}

public class javatest{
    public static void main(String args[]) {
        // Outer o = new Outer();
        // o.method();
        show(new Inner(){
            public void show1(){}
            public void show2(){}
        });
    }
    public static void show(Inner in){
        in.show1();
        in.show2();
    }
}

Object

import javax.crypto.interfaces.PBEKey;
import javax.management.RuntimeErrorException;

/**
 * Object是所有类的根类,具备所有对象的共性内容
 * equals(Object obj):比较两个对象地址
 *      equals方法和equals方法覆盖
 * hashCode方法:返回该对象的哈希码值
 * getClass方法:返回此Object的运行时类
 * toString方法
 */
class Fu //extends Object
{
    Fu(){
        super();
    }
}
class Zi extends Fu{
    int age;
    Zi(int age){
        super();
        this.age = age;
    }
    //比较Zi的年龄,是否一样
    public boolean compare(Zi z){
        return this.age == z.age;
    }
    //public boolean equals(Zi z){//和父类Object的equals重载}
    //一般都会根据对象特有内容覆盖此方法,建立对象是否相同的依据。
    public boolean equals(Object obj)// Object obj = z//重写
    {
        if(!(obj instanceof Zi)){
            throw new ClassCastException("类型错误");
        }
        Zi z = (Zi)obj;
        return this.age==z.age;
    }
    public int hashCode(){
        return this.age;
    }
    public String toString(){
        return "Zi"+"#"+this.age;
    }
}

class objectDemo{
    public static void main(String[] args)
    {
        Zi z1 = new Zi(10);
        Zi z2 = new Zi(10);
        Demo d = new Demo();
        //System.out.println(z1==z2);//false
        //System.out.println(z1.equals(z2));//未覆盖equals:false
        //System.out.println(d.equals(z2));//false
        //System.out.println(z1.equals(z2));//覆盖equals后:true
        System.out.println(Integer.toHexString(d.hashCode()));//1555009629  5caf905d
        System.out.println(z1.hashCode());//10
        System.out.println(z1.getClass());//class Zi
        System.out.println(z2.getClass());//class Zi
        System.out.println(z1);//toString未覆盖:Zi@a
        //toString覆盖:Zi#10
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值