Java基础(零散的记记)

标识符

#所有的标识符都应该以字母(A-Z或a-z),美元符(&),或者下划线(_)开始
#首字符之后可以是以上符号或者其他任何字符的组合
#不能使用关键字作为变量名或者方法名
#标识符是大小写敏感的 Man!=man
#标识符可以是中文,但是最好不要是中文

数据类型

Java是强类型语言,要求变量的使用要严格符合规定,所有变量都必须先定义好之后才可以使用

 

八大基本数据类型

//整数
int num1=10;
byte  num2=20;
short num3=30;
long num4=30L; //long类型腰子数字后面加个L
//小数
float num5=50.1F; //float类型要在数字后面加个F
double num63.1415926;
//字符
char name='国';
string namea="张三"; //字符串,String不是关键字,而是类
//布尔值:是否
boolean flag = true;

引用数据类型

除基本数据类型之外的都是引用数据类型

# 类
# 接口
# 数组

拓展

  1. 整数拓展

  1. 浮点数拓展(图片中应该是最好不要使用浮点数进行比较)

  1. 字符拓展

类型转换

  1. 强制转换:大容量转换小容量的要强制转换 //(类型)变量名

  2. 自动转换:小容量转换成大容量的会自动转换

变量

  1. 变量分为成员变量,局部变量

  1. 成员变量包括类变量、实例变量。

  2. 类变量可由类或者类的对象访问,生命周期随类的生命周期变化

  3. 实例变量由类的对象访问

  4. 成员变量可以自动初始化,其中成员变量是基本数据类型的初始化为“0”或“0.0”,引用类型变量初始化为null;

  5. 局部变量必须要初始化

常量

初始化后不可以改变值;

修饰符不分顺序,例如:static final int num=0; 等价于 final static int num=0;

 

运算符

  1. 关系运算符:instanceof

  2. a=1;
    b=a++; //b=1 a=2 a先赋值给b,再加1
    c=++a; //c=3 a=3 a先加1,再赋值给b
  3. 幂运算:2^3 Math.pow(2,3)

  4. X?Y=Z,如果x==true,则结果为y,否则为Z

短路运算

int c=5;
boolean d=(c<4)&&(c++<4);
sout(d); //false
sout(c); //c=5 与运算前面为false,则后面的代码不执行

位运算

    //A=0011 1100   
//B=0000 1101
A&B=0000 1100
   A|B=0011 1101
   A^B=0011 0001 //异或,相同为0
   ~B= 1111 0010 //取反

包机制

一般用公司的域名倒置作为报名,如com.baidu.wenku.www

 

可变参数

  1. 在方法的声明中,在指定参数类型后加一个省略号(...)

  2. 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通参数必须在他之前声明。

递归结构

  1. 递归头:什么时候不调用自身方法

  2. 递归体:什么时候要调用自身方法、

多态

多态跟属性无关,多态指的是方法的多态,而不是属性的多态

public class Animal {//父类:动物
   public void shout(){
       System.out.println("我是小动物 ");
  }
}
public class Cat extends Animal {//子类:猫
   public void shout(){
       System.out.println("我是小猫 ");
  }
}
public class Dog extends Animal {//子类:狗
   public void shout(){
       System.out.println("我是小狗 ");
  }
}
public class Girl {
   public void play(Animal an){
       an.shout();
  }
}
public class Test{
   public static void main(String args[]){
       Girl g = new Girl();
       Aniaml an=new Dog();
       g.play(an);
  }
}
  1. 多态就是多个状态,同一种行为,不同子类表现为不同状态。指的就是同一个方法调用,然而由于对象的不同会产生不同的行为。具体场景:

    (一)父类当方法的形参,然而传入的是子类的对象,调用同一个方法,就会根据传入的子类不同而产生不同的效果。

    (二)父类作为方法的返回值类型,真是返回的是该类的任意一个子类的对象。(简单工厂模式)

  2. 提高了代码的拓展性,符合面向对象的设计原则:开闭原则(拓展是开放的推荐的,修改是关闭的)。

  3. 多态的要素:1.继承 2.重写:子类对父类的方法重写 3,父类引用指向子类对象

向上转型和向下转型

Dog类添加一个自己独有的方法时,多态的情况下会报错。

public class Dog extends Animal {//子类:狗
   public void shout(){
       System.out.println("我是小狗 ");
  }
   public void eat(){
       System.out.println("吃狗粮");
  }
}
public class Test{
   public static void main(String args[]){
       Aniaml an=new Dog();
       an.shout();
       an.eat();//报错 ,Animal类中没有eat()方法
  }
}

报错原因:

(1)Animal an = new Dog(); 左边:编译期的类型 右边:运行期的类型

an在编译期的时候是Animal类型,Animal类没有eat()方法。

(2)内存:

an只能访问到pig对象中Animal部分的内容

解决方法:将Animal类型转为Dog类型

public class Test{
   public static void main(String args[]){
       Aniaml an=new Dog();//向上转型
       an.shout();
       an.eat();//报错 ,Animal类中没有eat()方法
       
       Dog dog =(Dog)an;//向下转型 为了获取子类特有的内容
       dog.shout();
       dog.eat();
  }
}

从上面的代码可以看出,(1)Aniaml an=new Dog(),an在编译期的类型是Animal,但是运行期指向的是Dog类型,所以an.eat()会报错(2)Dog dog =(Dog)an; dog在编译期类型为Dog,而右边的an运行期类型指向的是Dog类型,所以没报错。

简单工厂模式

简单工厂模式的实现,他是解决大量对象创建问题的一个解决方案。将创建和使用分开,工厂负责创建,使用者直接调用就可以了。简单工厂模式的基本要求是:

  1. 定义一个static方法,通过类名直接调用

  2. 返回值类型是父类类型,返回的可以是其任意子类类型

  3. 传入一个字符串类型的参数,工厂根据参数创建对应的子类产品

public class PetStore{
   public static Animal getAnimal(String petName){
       Animal an = null;
       if("猫".equals(petName)){
           an = new Cat();
      }
       if("狗".equals(petName)){
           an = new Dog();
      }
       return an;
  }
}
public class Test{
   public static void main(String args[]){
       Girl g = new Girl();
       Aniaml an=PetStore.getAnimal("猫");
       g.play(an);
  }
}

final关键字

一、修饰变量

public class Test{
   public static void main(String[] args){
       final int A = 10;//fianl修饰基本数据类型,变量的值不变
       //A=20; //报错,不可以修改值
       
       final Dog d =new Dog(); //fianl修饰引用数据类型,地址值不可以改变
       //d = new Dog(); //报错,地址值不可以改变
       d.age=10;//d对象的属性依然可以改变,不受影响
       
       test(d);
  }
   public static void test(final Dog d){
       //d=new Dog(); //报错,因为d被final修饰了,方法被调用时传来的参数第一次赋了地址值就不可以改变了
  }
}

二、修饰方法

final 修饰方法,那么该方法的子类无法重写该方法

三、修饰类

final修饰类,代表没有子类,该类无法被继承。

一旦一个类被final修饰,那么里面的方法也没必要用final修饰了(没子类就没有重写这一说)

抽象类_抽象方法

//4.一个类中如果有方法是抽象方法,那么这个类也要变成抽象类
//5.抽象类可以有0-n个抽象方法
public abstract class Person{
   //1.在一个类中,会有一类方法,子类对他永远满意,不会重写,直接使用
   public void eat(){
       System.out.pringln("一顿不吃饿得慌");
  }
   //2.在一个类中,会有一类方法,子类对他永远不满意,会重写他,那么这个方法的方法体就没意义了
   //因为子类会重写他。这时候需加上abstract修饰
   //3.一个方法的方法体去掉,然后被abstract修饰,那么这个方法就变成了一个抽象方法
    public void say();
}
//6.抽象类可以被其他类继承。
//7.一个类继承了一个抽象类,那么该类也可以变成一个抽象类
//8.一般子类不加abstract修饰,一般让子类重写父类全部的抽象方法
class Student extends Person{
   public void say(){
       System.out.pringln("阿巴阿巴。。");
  }
}

public class Test{
   public static void main(String args[]){
       //Person p=new Perosn(); //报错,抽象类不可以实例化
  }
}

抽象类的作用

抽象类定义抽象方法,目的是为了为子类提供一个通用的模板,子类可以重写拓展自己的内容,又避免了子类设计的随意性

面试题

【1】抽象类不能创建对象,那么抽象类中是否有构造器?

抽象类中一定有构造器,构造器的作用:给子类初始化对象的时候要先super调用父类的构造器

【2】抽象类是否可以被final修饰?

不能被final稀释,因为抽象类设计的初衷就是给子类继承用的。

 

接口

  1. 类是类,接口是接口,他们是同一层级的概念

  2. 接口没有构造器

  3. 接口声明:interface

  4. 在JDK1.8之前,接口只有两个部分内容:

    (1)常量:固定修饰符:public static final

    (2)抽象方法:固定修饰符:public abstract

    这些固定修饰符可省略不写

  5. 类和接口的关系是什么? 实现关系 ,类实现接口

  6. 一旦实现一个接口,那么实现类要重写接口中的全部抽象方法

  7. 如果没有全部重写抽象方法,那么这个类可以加上abstract变成一个抽象类

  8. Java有单继承,多实现,只能继承一个类,可实现多个接口

  9. 在JDK2.8之后,新增了非抽象方法:

    (1)被public default修饰的非抽象方法

    注意1;default 修饰符必须加上

    注意2:在实现类中,重写的非抽象方法不可以加default

    (2)静态方法

    注意1:static不能省略

    注意2:静态方法不能重写,所以实现类中的同名静态方法不是重写,而是实现类中你自己独有的一个静态方法

public interface TestInterface{
   
   //public default非抽象方法
   public default void b(){//加上default
       System.out.println("---b---");
  }
   
   //静态方法
   public static void c(){
       System.out.println("---c---");
  }
}
class Test implements TestInterface{
   
   public void b(){//去掉default
       System.out.println("重写b方法");
  }
}

问题:接口中为什么要添加非抽象方法?

如果接口中只能定义抽象方法的话,如果要修改接口中的内容,呢么对实现类的影响太大了,现在在接口中可以加入抽象方法,对实现类没有影响,像调用就调用即可。

内部类

内部类:成员内部类(静态的,非静态的) 局部内部类(位置:方法内,块内,构造器内)

public class TestOuter{
   int age=10;
   int tall=155;
   public void a(){
       System.out.println("这是方法a");
       D d = new D();
       //3.外部类想要访问内部类的东西需要创建内部类的对象
        System.out.println(d.name);
       d.method();
  }
   
   //成员内部类
   public class D{
       String name;
       int tall=166;
       public void method(){
           //1.内部类可以访问外部类的内容
           System.out.println(age);
           a();
           int tall=188;
           //4.内部类和外部类属性重名时,如何调用:
           System.out.println(tall);//188
           System.out.println(this.tall);//166
           System.out.println(TestOuter.this.tall);//155
      }
  }
   //静态内部类
   static class E{
       public void method(){
           //2.静态内部类只能访问外部类中被static修饰的内容
           //System.out.println(age); //报错
           //a(); //报错
      }
  }
}

class Demo{
   //静态成员内部类闯将对象
   TestOuter.E e=new TestOuter.E();
   //非静态成员内部类创建对象
   TestOuter t = new TestOuter();
   TestOuter.D d = t.new D()
}
posted @ 2020-10-13 23:16  迷失外太空  阅读(34)  评论(0)    收藏  举报