Java是基于面向对象设计的编程语言 面向对象的三大特征:
封装继承多态Class: 类 对象的模板 对象 通过class来建立
class 类名(){ }堆栈 数据结构 栈: • 先进后出 • 读取速度快 栈:存储指向堆的位置 堆:存储具体数据
每当定义一个新的对象时,一个内存地址会被存贮入栈内存中。该地址会指向堆内存,堆内存内则会存贮对象的具体数据。
构造方法 • 用于对象初始化 • 会自动生成无参数的(建议自己写)
class Test(){ //无参数构造方法 Test(){}; }方法重载 • 可以有多个方法 • 相同名称,参数类型或参数长度不同 • 构造方法重载
class Test{ int var1; int var2; //无参数构造方法 Test(){}; //构造方法重载 Test(int var_1, int var_2){ var1 = var_1; var2 = var_2; } }匿名对象 • 匿名对象只能使用一次,因为没有任何的对象引用,所以将称为垃圾, 等待被G·C回收。 只使用一次的对象可以通过匿名对象的方式完成,这 一点在以后的开发中将经常使用到。 Int sum = new Math().sum(x,y)
封装 - 避免误操作 隐藏对象属性
class Test{ private int var1; private int var2; //无参数构造方法 Test(){}; //构造方法重载 Test(int var1, int var2){ this.var1 = var1; this.var2 = var2; } }在一个构造方法中,调用另一个构造方法时,调用的代码必须放在代码的第一行
Static-静态修饰词
静态是类的property,与对象无关 在类加载时,静态属性加载 静态修饰的方法,可被调用的时机早于非静态 非静态必须通过对象的调用 静态不能访问非静态,非静态可以访问静态
包 Com.公司名.项目名 权限修饰符 Public Protected Private Default
代码块
构造代码块: * 随着对象的每次创建,执行一次,执行在构造方法之前 * 无论用哪个构造方法,构造代码块都执行静态代码块: * 随着类的加载(第一次使用),静态代码块执行 * 只执行一次同步代码块 运行顺序: 静态代码块----->构造带吗块----->同步代码块Main : 继承格式
同类的衍生Class 子类 extend 父类 class Student extend Person{ } java只有单继承 子类具有父类的super地址Super -> 访问父类的构造方法 * super调用父类的构造方法必须放在第一行
访问父类的属性 class Student extends Person{ public Student(){ super("test1",1); super.sex = male; super.setName("小王") } }重写override • 参数列表必须相同 • 返回类型相同 • 访问权限不能更低 • 父类的成员方法只能被子类改写 • Static private不能重写
面试题:
重写重载的区别:Override and Overload
发生位置: * 重载:同一个类中 * 重写:子父类参数列表 * 重载:必须不同 * 重写:必须相同返回值 * 重载:无关 * 重写:必须相同访问权限 * 重载:无关 * 重写:子的方法权限必须不小于 父的方法权限异常处理 * 重载:无关 * 重写:异常范围可以更小,但不能抛出新的异常Final
修饰属性变量,变量变成常量 * 不能再进行赋值 * final修饰的局部变量,只能赋值一次(可以先声明后复制) * final赋值的属性变量,必须在声明时赋值 * 全局常量(publicstaticfinal)修饰类 * 不能被继承修饰方法 * 不能被重写抽象类 Abstract class
一个抽象类中可以没有抽象方法。抽象方法必须写在抽象类或接口中 public abstract class Person{ public abstract void say(); } 不能被实例化不能使用final说明,final的类不能有子类,而抽象类必须有子类才有意 义能有构造方法抽象类和普通类的区别
抽象类必须用public或procted 修饰(如果为private修饰,那么子类 则无法继承,也就无法实现其 抽象方法)。默认缺省为 public抽象类不可以使用new关键字创建对象, 但是在子类创建对象时,抽象父类也会被JVM实例化。如果一个子类继承抽象类,那么必须实现其所有的抽象方法。如果 有未实现的抽象方法,那么子类也必 须定义为 abstract类接口:
面向接口这种思想是接口是定义(规范,约束)与实现(名实分离的原则)的分离。优点: 降低程序的耦合性易于程序的扩展有利于程序的维护 public interface Person { }多态
父类引用指向子类Object类
可以用于接收任何类型的数据很多的已编写方法Instanceof 辨别类的类型API 帮助文档
ctrl+左键 查看源码toString 重写
更好的了解一个类的信息Equals
== 比较的是内存的地址 public boolean equals(Object o){ if(this == 0){ return true; } if(o == null){ return false; } if(o instanceof Person){ Person p2 = (Person) o; if(this.name.equals(p2.name) && this.age == p2.page){ //相同 return true; } } }内部类
定义在一个类内部的类 成员内部类局部内部类 - 不能有修饰符匿名内部类 - 不能有修饰符 只能访问final局部变量静态内部类 多了static只能使用外部类的静态变量和方法 包装类 public class Demo3__2{ public static void main(String[] args){ Person p = new Person(){ public void say(){ System.out.println("test!!!!"); } }; haha(p); public static void haha(Person p){ } }原因: 内部类会被单独存储,需要存储变量(局部,匿名),为了保 证变量值一致,所以只能访问final变量
装箱 拆箱
//手动装箱1.5之前 已过时 Integer i = new Integer(200); //手动拆箱 int a = i.intValue(); //自动装箱 Integer j = 200; //自动拆箱 int b = j;字符串转换 parseInt()
方法的可变参数 Int… nums
可变参数以数组的形式体现只能出现在参数列表的最后 //可变参数在方法内部以数组为载体体现 public static int sum(int... nums){ int n = 0; for(int i=0;i<nums.length;i++){ n+=nums[i}; } return n; }递归
在方法定义中使用方法自身,进行循环缺点:容易造成内存溢出Reference:本文所出现截图,均来自开课吧