1.变量:类变量、实例变量、局部变量
public class Variable{ static int allClicks=0; //类变量 String str="hello world"; //实例变量 public void method(){ int i=0; //局部变量 } }
常量
final 常量名=值; final double PI=3.14;
2.位运算
左移:<< 相当于*2
右移:>>相当于/2
3.输入
包:java.util.Scanner
基本语法:Scanner s=new Scanner(System.in)
通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前一般需要使用hasNext()与hasNextLine()判断是否还有输入数据。
关闭:s.close()
区别:next():输入有效字符后,后面的空格为结束符或分隔符
nextLine():以Enter为结束符,可以获得空白
public class Demo03{ public static void main(String[] args){ Scanner scanner=new Scanner(System.in); System.out.println("请输入数据:"); String str=scanner.nextLine(); System.out.println("输出内容为:"+str); scanner.close(); } }
4.值传递和引用传递:java是值传递
java都是“值传递”,关键看这个值是什么,简单变量就是复制了具体值,引用变量就是复制了地址呗。字符串是不可变的,不会被修改。
5.方法的重载
重载就是再一个类中,有相同的函数名称,但形参不同的函数。
方法的重载的规则:
6.可变参数
在方法声明中,再指定参数类型后加一个省略号(...)。
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通参数必须在它之前声明。
public static void printMax(double... numbers){ if (numbers.length == 0){ System.out.println("No argument passed"); return; } double result=numbers[0]; //排序 for (int i=1;i<numbers.length;i++){ if (numbers[i]>result){ result=numbers[i]; } } System.out.println("The max value is" + result); }
7.递归
递归结构包含两个部分:
8.数组
首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:
dataType[] arrayRefVar; //首选的方法 或 dataType arrayRefVar[]; //效果相同,但不是首选方法
java语言使用new操作符来创建数组,语法如下:
dataType[] arrayRefVar = new dataType[arraySize];
数组元素通过索引访问,数组索引从0开始。
获取数组长度:
array.length;
例:
public static void main(String[] args){ int[] nums; //1.声明一个数组 nums = new int[10]; //2.创建一个数组 //or int[] nums = new int[10]; //声明并创建一个数组 }
java内存:
三种初始化:
int[] a = {1,2,3};
int[] a=new int[2]; //默认初始化为0 a[0]=1; a[1]=2;
数组的四个基本特点:
冒泡排序:
public static void sort(int[] array){ //临时变量 int temp = 0; //外层循环,判断要走多少次; for (int i = 0; i < array.length-1; i++){ //内层循环,比较两个数,如果第一个数比第二个数大,则交换位置 for (int j = 0; j < array.length-1-i; j++){ if (array[j+1]>array[j]){ temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } } } }
稀疏数组:
9.面向对象(Object-Oriented Programming, OOP)
本质:以类的方式组织代码,以对象的形式封装数据
三大特性:封装、继承、多态
10.方法调用
//类名.方法名() Student.say();
//对象类型 对象名=对象值; Student student=new Student(); student.say();
静态方法不能调用非静态方法:因为静态方法和类一起加载,而非静态方法是在类实例化以后才存在。
11.类与对象
使用new关键字创建对象
//类:抽象的,实例化 //类实例化后会返回一个自己的对象! //student对象就是一个Student类的具体实例 Student student = new Student();
构造器:
作用:
注意点
public class Person{ //一个类即使什么都不写,它也会存在一个方法 //显式的定义构造器 String name; //实例化初始值 //1.使用new关键字,本质是在调用构造器 public Person(){} //构造器和类名相同 //有参构造:一旦定义了有参构造,无参构造就必须显式定义 public Person(String name){ this.name = name; } }
12.创建对象内存分析
堆中存放new的数组和对象
栈中存放基本数据类型
13.封装
高内聚:类的内部数据操作细节自己完成,不允许外部干涉
低耦合:仅暴露少量的方法给外部使用
属性私有,get/set
public class Student{ //属性私有 private String name; private int id; private char sex; //提供一些可以操作这个属性的方法! //提供一些public的 get、set方法 //get 获得这个数据 public String getName(){ return this.name; } //set 给这个参数设置值 public void setName(String name){ this.name = name; } }
14.继承
关键字:extends
Java中只有单继承,没有多继承。“一个儿子只能有一个爸爸,一个爸爸可以有多个儿子”
//Person 人:父类 public class Person{ //public 子类可以继承 //private 子类无法继承 public int money=100000; public void say(){ System.out.println("说了一句话"); } } ---------------------------------------------------- //学生 is 人:派生类,子类 //子类继承了父类,就会拥有父类的全部方法 public class Student extends Person{} //老师 is 人 public class Teacher extends Person{}
继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。
在Java中,所有的类,都默认直接或间接继承Object类。
super 和 this:
//Person 人:父类 public class Person{ public Person(){ System.out.println("Person"); } protected String name = "aaa"; public void print(){ System.out.println("Person"); } } -------------------------------------------------------------- //学生 is 人:派生类,子类 //子类继承了父类,就会拥有父类全部方法 public class Student extends Person{ public Person(){ //创建子类对象时,会先执行父类构造函数,再执行子类构造函数 //隐藏代码: super(); //调用父类的构造器必须要在子类构造器的第一行 System.out.println("Student"); } private String name = "bbb"; public void print(){ System.out.println("Student"); } public void test1(){ print(); //调用当前类Student的print()函数 this.print(); //调用当前类Student的print()函数 super.print(); //调用父类Person的print()函数 } public void test(String name){ System.out.println(name); //输出传入的参数 System.out.println(this.name); //输出当前类Student的name值bbb System.out.println(super.name); //输出父类Person的name值aaa } }
super注意点:
super vs this:
方法的重写:
//重写都是方法的重写,与属性无关 public class B{ public static void test(){ System.out.println("B=>test()"); } } -------------------------------------- public class A extends B{ public static void test(){ System.out.println("A=>test()"); } } ------------------------------------------- public class Demo{ //静态方法和非静态方法区别很大 public static void main(String[] args){ //方法的调用只和左边定义的数据类型有关 A a=new A(); a.test(); //输出A=>test() //父类的引用指向了子类 B b=new A(); b.test(); //输出B=>test() } }
静态方法和非静态方法区别很大:
静态方法是类的方法(类的成员),而非静态方法是对象的方法。有static时,b调用了B类的方法,因此b使用B类定义的;没有static时,b调用的是对象的方法,而b使用A类new的,即b是A new出来的对象,因此调用了A的方法。
重写注意点:需要有继承关系,子类重写父类方法
15.多态
public class Person{ public void run(){ System.out.println("run"); } } ------------------------------------ public class Student extends Person{ public void run(){ System.out.println("son"); } public void eat(){ System.out.println("eat"); } } ----------------------------------------- public class Demo{ public static void main(String[] args){ //一个对象的实际类型是确定的 //new Student(); //new Person(); //可以指向的引用类型就不确定了:父类的引用指向了子类 //Student能调用的方法都是自己的或者继承父类的! Student s1 = new Student(); //Person 父类型,可以指向子类,但是不能调用子类独有的方法 Person s2 = new Student(); Object s3 = new Student(); //对象能执行哪些方法,主要看对象左边类型,和右边关系不大! s2.run(); //子类重写了父类的方法,执行子类的方法 s1.run(); } }
多态注意事项:
哪些方法不能被重写:
**instanceof 关键字:**判断一个对象是什么类型
public class Person{ } ------------------------------------ public class Student extends Person{ } ------------------------------------ public class Teacher extends Person{ } ------------------------------------- public class Demo{ public static void main(String[] args){ //Object > String //Object > Person > Student //Object > Person > Teacher Object object = new Student(); //System.out.println("x instanceof Y"); //能不能编译通过看它们有没有父子关系 System.out.println(object instanceof Student); //true System.out.println(object instanceof Person); //true System.out.println(object instanceof Object); //true System.out.println(object instanceof Teacher); //false System.out.println(object instanceof String); //false System.out.println("========================"); Person person = new Student(); System.out.println(person instanceof Student); //true System.out.println(person instanceof Person); //true System.out.println(person instanceof Object); //true System.out.println(person instanceof Teacher); //false System.out.println(person instanceof String); //编译报错 System.out.println("========================"); Student student = new Student(); System.out.println(student instanceof Student); //true System.out.println(student instanceof Person); //true System.out.println(student instanceof Object); //true System.out.println(student instanceof Teacher); //编译报错 System.out.println(student instanceof String); //编译报错 } }
类型转换:
public class Person{ public void go(){ System.out.println("run"); } } ------------------------------------ public class Student extends Person{ public void go(){ System.out.println("go"); } } ------------------------------------ public class Teacher extends Person{ public void go(){ } } ------------------------------------- public class Demo{ public static void main(String[] args){ //类型之间转换 } }