1.数组
数组是一个数据容器,用来存放同类型的数据。
int[] arr={1,2,3,4}; //简化写法 int[] arr=new int[]{1,2,3,4}; //完整格式访问格式:数组名[索引] 例如arr[0];
元素个数: 数组名.length 例如arr.length
动态化存储数组:
int[] arr=new int[8];默认值规则:byte、short、char、int、long默认值0
float、double默认值0/0
boolean默认值false
类、接口、数组、String默认值null
静态初始化: //二维数组
int[][] arr=new int[][]{ {12,34,55}, {45,56}, {78,99,100,45} };动态初始化:
int[][] arr=new int[3][5];2.面向对象
三大特征:继承、封装、多态
2.1 封装
类是对象的封装,对象是类的实例.
先创建类:
public class Student { String name; double chinese; double math; }再创建对象:
public class Test { public static void main(String[] args) { Student s1=new Student(); s1.name="张三"; s1.chinese=18; s1.math=19; System.out.println(s1.name+"的语文成绩是"+s1.chinese); System.out.println(s1.name+"的数学成绩是"+s1.math); Student s2=new Student(); s2.name="李四"; s2.chinese=20; s2.math=18; System.out.println(s2.name+"的语文成绩是"+s2.chinese); System.out.println(s2.name+"的数学成绩是"+s2.math); } }封装:把数据和对数据的处理放到同一个类中。例如上述的学生类,只有数学和语文成绩,在类中写总成绩函数与平均成绩函数就是封装。
对象:可以看作一种特殊的数据结构,例如一张表。类就是表的模板,对象就是具体的表。
栈存放引用的变量:例如我们要输出的是s1.name,引用的就是s1的数据,s1就是引用的变量
栈里边存放的是内存地址,可以理解为存放的是门牌号,找到栈拿到门牌号之后去堆里边获取具体的信息。
堆存放具体的对象,方法区存放类。
构造器:是一种特殊方法,没有返回值类型,名称必须跟类名一致
作用是简化代码,构造器在创建对象时会自动完成对象的初始化赋值。
//无参构造器: public Student{ }; //有参构造器: public Student(String name){ };构造类的时候本身就自带了一个无参构造器,写Student s1=new Student();是没问题的
但如果写了有参构造器,自带的无参构造器默认失效,上述写法将报错,解决方法是新写一个无参构造器。
this关键字:一个变量,来拿到当前对象。解决名称冲突问题。
封装:合理隐藏(private),合理暴露(public的get set方法) set赋值,get取值
生成私有变量,右键选择generate,选择getter/setter/getter和setter,按住shift点击最后一个可以全选生成get/set方法。
实体类:成员变量为私有,且有public的getter/setter方法,有无参构造器,有参构造器可选。
实体类只存数据,进行数据拿放,不存放业务方法
static关键字:叫静态,可以修饰成员变量、成员方法。
成员变量分为:
1. 静态变量:有static修饰,属于类,在计算机中独一份
2. 实例变量:无static修饰,属于每个对象的。
静态变量在对象中赋值,只保留最后一个赋值。因为静态变量只有一个,在不同对象中赋值,其实是在修改一个变量。实例变量相反,每个对象修改的是自己的变量。
成员方法分为:
1. 静态方法:有static修饰,属于类,在计算机中独一份
2. 实例方法:无static修饰,属于每个对象的。
如果一个方法只是为了做一个功能并且不需要访问对象的数据,就定义为静态方法。
工具类没有创建对象的需求,建议将工具类的构造器进行私有。
tips:
1.静态方法可以直接访问静态成员,不能直接访问实例成员。
2.实例方法可以直接访问静态成员,也可以直接访问实例成员。
3. 实例方法可以出现THIS关键字,静态不行。
2.2 继承
关键字 extends: public class B extends A A是父类,B是子类
子类可以继承父类的非私有成员;子类的对象是由子类、父类共同完成的。
权限修饰符:(被访问的范围)
1. private :只能本类
2. 缺省(什么都不写) : 本类、同一个包中的类
3. protected :本类、同一个包中的类、子孙类
4. public : 任意位置
继承的特点:
1. 单继承 :一个类只能继承一个直接父类
2. 多层继承 : 不支持多继承(多个父类),但可以多层继承(父类层层传递)
3. 祖宗类:Java中的类都是Object中的子类
4. 就近原则 : 优先访问自己类,自己没有的访问父类(如果父子类有重名,且想要访问父类,需要加super. 访问子类可以加this.)
方法重写:
1.名称、形参必须一样
2.@Override著明这是重写,更安全 (toString重写直接输入toS选择第二个然后两次回车)
3.子类重写的方法权限要大于等于父类的方法,public>proteced>default(缺省)
4.私有方法、静态方法不允许重写
5.重写方法的返回值类型必须一致或更小
子类的构造器必须先调用父类的无参构造器(因为子类构造器默认有一个super()会调用父类),再调用自己的。不用super(参数)指定的话会自动调用父类的无参构造器。
写法:
父类定义变量,定义有参无参构造器。
子类继承父类,定义变量,定义无参有参构造器,super引入父类构造器内容。
直接调用子类构造器,可以使用父类变量。
super(.....)和this(....)必须在构造器第一行,第二行及以后会报错。super(..)和this(...)不能同时出现。
2.3 多态
多态是继承/实现情况下的一种现象,表现为:对象多态,行为多态。
方法:编译看左边,运行看右边。
变量:编译和运行都看左边。
多态的前提:
- 有继承/实现关系
- 存在父类引用子类对象(People p1=new Student();People p2=new Teacher(); )
- 存在方法重写
多态可以向上转型。写wolf可以用animal的方法。Animal a1=new Wolf();
向下转型一般是在向上转型的基础上,因为编译看左边,a1只能用animal类中的方法,虽然运行的时候可以用子类wolf的方法,但由于编译看左边,写不出来,这时候就要用向下转型写出来。
类型转换:
- 自动类型转换:父类 变量名=new 子类();
- 强制类型转换:子类 变量名=(子类) 父类变量;
//向上转型 Animal a2=new Tortoise(); go(a2); a2.run(); System.out.println(a2.name); //向下转型 Tortoise t1=(Tortoise) a2; t1.shrinkHead();为避免转型错误(ClassCastException),可以用instanceof判断
2.4 final关键字
变量分为成员变量(静态变量和实例变量)和局部变量(循环中定义的变量)。
注意事项:
- final修饰基本类型的变量,变量存储的数据不能更改
- final修饰引用类型的变量,变量存储的地址不能更改,但是地址指向对象的内容是可以被更改的
常量:加了static final修饰的成员变量就是常量。一般命名全为大写,且单词之间用_连接,例如SCHOOL_NAME
2.5 单例类、枚举类、抽象类
2.5.1 单例设计模式
作用:确保一个类只能创建一个对象,例如进程管理器只能打开一个
设计模式是具体问题的最优解决方案。
写法:
- 构造器私有化
- 定义一个类变量(即静态成员变量)记住类的一个对象
- 定义一个类方法,返回对象
饿汉式单例:拿到类的时候,对象已经创建好了。
public class A { private static A a=new A(); private A(){} public static A getInstance(){ return a; } }懒汉式单例:拿到类之后才开始创建对象
public class B { private static B b; private B(){ } public static B getObject(){ if(b==null){ b=new B(); } return b; } }2.5.2 枚举
枚举类是一种特殊类,不用class 用enum
写法:(选择java.class之后有enum类型可以直接选)
//修饰符 enum 类名{ // 名称1,名称2,名称3.... 这些名称本质是常量,每一个都记住了一个枚举类的一个对象 //其他成员 //} public enum A{ X,Y,Z; }枚举类都是最终类,不可以被继承,但他们需要继承java.lang.Enum类。
第一行只能罗列一些名称,且这些名称都是常量。每个常量都会记住枚举类的一个对象。
构造器是私有的。(多例对象)
作用:枚举做信息分类和标志。
2.5.3 抽象类
抽象类:abstract 可以修饰类和方法,抽象方法只有方法名,没有方法体(即{})
注意:
- 抽象类中不一定有抽象方法,有抽象方法的一定是抽象类。
- 抽象类也可以有:成员变量,方法,构造器。
- 抽象类最主要的特点是不能创建对象,只作为一种特殊父类,可以有子类继承并实现
- 子类继承抽象父类必须重写所有抽象方法,否则也会被定义为抽象类。
好处就是:父类定义一个子类都有但是各异的方法,例如动物叫声不同,可以在父类中写一个抽象方法,子类中重写,适用于多态(向上转型)。
抽象类可以用来简化代码,提高代码复用率。
步骤:1.构建抽象类。2.写模板方法(最好加final,避免被修改) 3.写有异部分(用抽象方法写,这样子类必须重写)
3.接口
接口类interface:JDK8之前接口类里边只能写常量和抽象类。常量可以省略public static final,抽象类可以省略public abstract
接口可以被类实现(可以理解为特殊的继承),继承的类称为实现类。一个实现类可以实现多个接口。写法为:修饰词 class 实现类名 implements 接口1,接口2.....
public class C implements A,B{ @Override public void show() { } @Override public void methodB() { } }接口只能写抽象类,所以接口里边也不能创建对象。
JDK8以后接口新增方法:
default void go(){} //使用接口的实现类的对象就可以调用
private void run(){} //使用接口中的其他实例方法来调用,比如上边的go方法中可以使用run()
static void show(){} //静态方法只能用接口名来调用
注意:
- 一个接口可以继承多个接口
- 一个接口继承多个接口,如果多个接口存在方法签名冲突,那么不支持多继承/多实现
- 一个类继承了父类也实现了接口,有同名的默认方法时,会优先用父类的
- 一个类实现了多个接口,多接口存在同名的默认方法,不冲突,类重写即可
4.代码块
类的五大成分:成员变量、构造器、方法、代码块、内部类
代码块分为静态代码块和实例代码块。
静态代码块:
static{ System.out.println("静态代码块"); card[0]="A"; card[1]="2"; card[2]="3"; card[3]="4"; }输出数组时可以调用Arrays.toString(数组名) 就可以输出数组内容。例如:
System.out.println(Arrays.toString(card));
实例代码块:{} 无static 属于对象
5.内部类
分为:成员内部类、静态内部类、局部内部类、匿名内部类
5.1 成员内部类
类似于成员变量,就是在一个类中再写一个类
public class Outer { //外部类 public class Inner{ //成员内部类,属于对象,因为没有static public void show(){ System.out.println("show"); } } } //创建对象如何调用: Outer.Inner a=new Outer().new Inner(); a.show();内部类成员访问外部类成员的特点:
- 内部类可以直接访问外部类成员的静态成员和实例成员
- 成员内部类的实例方法中,可以拿到当前寄生的外部类的外部类对象:外部类名.this Outer.this
5.2 静态内部类
加static修饰的内部类,只加载一次,由外部类持有
创建对象:Outer.Inner a=new Outer.Inner(); //与成员不同
只能访问外部类的静态成员
5.3 局部内部类
定义在方法、代码块、构造器中(了解即可)
5.4 匿名内部类
程序员不用自己命名,默认有个隐藏的名字。
本质就是一个子类,并且会立即创建出一个子类对象。
写法:
new 类名/接口名(参数值){ 类体(一般是方法重写) }关于匿名内部类应用场景有一个排序
Arrays.sort(students, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { //指定排序规则 //如果左边大于右边,返回正整数 //右边大于左边,返回负整数 //两边相等,返回0 if(o1.getAge()>o2.getAge()){ return 1; }else if(o1.getAge()<o2.getAge()){ return -1; } return 0; } });Arrays.sort(数组名,匿名内部类)以上写法可以按照年龄升序输出。