类与对象
一、 面向对象学习的三条主线:
1.类及类的成员 : 属性,方法,构造器,代码块,内部类
2.面向对象的三大特性 : 封装性,继承性,多态性
3.其它关键字 :this,super,interface,final,static…
二、面向对象与面向过程(理解
面向过程:强调的是功能行为
面向对象 :强调具备了功能的对象
三、面向对象中两个重要的概念:
类 :类是抽象的概念上的定义,是对一类事物的描述。(类似于汽车设计图)
对象 :是一个实实在在的个体。是由类派生出来的(new 出来的)
四、面向对象思想落地实现的规则一
1.先创建一个类并提供必要的属性和方法
2.通过类创建对象
3.通过对象调用属性和方法。(对象名.属性名,对象名.方法名)
五 属性和方法
Field = 属性 = 成员变量
Method = 方法 = 函数
七 注意:
通过一个类创建的多个对象,每个对象独自拥有一份属性。当某一个对象对属性进行修改后,
并不会影响其它对象中的属性。
匿名对象
匿名对象:没有名字的对象 (new Person())
特点:只能调用一次
使用场景:往往将匿名对象作为实参进行传递
对象数组
一 说明 :该数组中存储的元素是对象
二 数组中存放的是同一个对象
Person[] ps = new Person[3];
Person p = new Person();
for(int i = 0; i < ps.length; i++){
ps[i] = p;
}
三 数组中存放的是不同的对象
Person[] ps = new Person[3];
for(int i = 0; i < ps.length; i++){
Person p = new Person();
ps[i] = p;
}
对象的关联
代码:
class Teacher{
String name;
Dog dog;
}
class Dog{
String name;
int age;
}
//创建一个老师的对象
Teacher teacher = new Teacher();
//给老师的属性赋值
teacher.name = "苍老师";
//创建一只狗
Dog dog = new Dog();
//给狗的属性赋值
dog.name = "泰迪";
dog.age = 2;
//让老师的对象和狗的对象关联起来
teacher.dog = dog;
单例设计模式
一 设计模式 :设计模式是在大量的实践中总结和理论化之后的代码结构、
编程风格、以及解决问题的思考方式
二 常见的设计模式:常见的有23种设计模式 -
单例设计模式,代理设计模式,工厂设计模式,观察者设计模式,装饰设计模式…
三 单例设计模式的作用 : 某个类的对象在当前工程中只有一个
四 单例设计模式实现的方式 :懒汉式 vs 饿汉式
四 饿汉式和懒汉式的区别?
饿汉式 :1.线程安全的
懒汉式 :1.线程不安全的 2.延迟了对象的创建时机一定上程度上节省了内存的开销。(懒加载)
五 代码
//饿汉式
class Bank{
//1.私有化构造器
private Bank(){}
//2.创建一个该类的对象,并使用static修饰
private static Bank bank = new Bank();
//3.提供一个公共的方法,用来返回对象。该方法必须是静态方法(可以通过类名调用该方法)。
public static Bank getInstance(){
return bank;
}
}
//懒汉式
class Computer{
//1.私有化构造器
private Computer(){}
//2.提供一个该类的对象的声明
private static Computer computer = null;
//3.提供一个公共的方法,并返回对象
public static Computer getInstance(){
//4.创建对象
if(computer == null){
computer = new Computer();
}
return computer;
}
}
main方法
说明:
1.main方法是程序的入口
2.main方法的形参名可以改,其它都不允许修改
3.一个程序只有一个main方法。
如何给main方法传参 :
1.通过eclipse传数据 :
①先运行该程序 ②右键 -> RunAs -> RunConfigurations -> 左边类名,右边Arguments
->program Arguments中写需要传的数据 (默认都是String
2.通过命令行的方式传数据 : java 字节码文件名 参数1 参数2 参数3 …
接口
一 接口的声明格式 :
权限修饰符(public/缺省的) interface 接口名{
}
二 说明 :
1.接口和类是并列存在的关系。
2.接口不能被实例化
3.接口中只能常量和抽象方法(JDK1.8之前
4.接口和接口之间是继承关系而且是多继承。 接口1 extends 接口2,接口3…
5.类和接口的关系是实现关系而且是多实现。 类 implments 接口1 ,接口2…
6.类实现接口后必须重写接口中的所抽象方法,如果不想重写那么该类可以变成抽象类
7.接口和类之间的多态性
三 接口和类的多态性 :
1.接口的类型指向实现类的对象
USB usb = new Mouse();
注意 :①必须有实现关系 ②必须有重写方法的重写 ③接口的类型指向实现类的对象
2.判断类型
if(usb instanceof Mouse){
}
3.向下转型
Mouse m = (Mouse)usb;
四 1.8新特性
在JDK1.8开始接口中可以有 抽象方法,常量,静态方法,默认方法
说明:
1.如何调用接口中的静态方法:接口名.静态方法名
2.如何调用接口中的默认方法 :实现类的对象.默认方法名
3.类优先原则 :一个类继承的父类和实现的接口(默认方法)中有同名同参的方法,
那么调用的是父类中的。
4.接口冲突 : 一个类实现多个接口,多个接口(默认方法)中有同名同参的方法,
这时就会发生接口冲突。
5.解决接口冲突 : 实现类只需要去重写该方法即可。
再通过该类的对象调用此方法时调用的是重写的方法。
6.实现类重写接口中的默认方法后调用接口中的默认方法:接口名.super.默认方法名
Object类
1.Object类是所类的父类
2.如果一个类没有显示继承其它类那么默认继承Object类
3.Obejct只一个空参的构造器
4.Object中11个方法,其中个wait方法是重载方法
equals方法:
一 Object中的equals方法:
public boolean equals(Object obj) {
return (this == obj);
}
二 像String,Date等核心类库基本上都重写了equals方法,用来比较内容。
三 自定义类如果没重写equals方法那么调用的是Object中的equals方法用来比较内容。
但是我们自定义类的时候通常都会重写equals方法,用来比较内容.
toString方法
toString方法 :
一 Object中的toString方法
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
二 像String,Date等核心类库基本上都重写了toString方法,用来输出对象中的内容。
三 自定义类如果没重写toString方法那么调用的是Object中的toString方法用来输出对象的地址值。
但是我们自定义类的时候通常都会重写toString方法,用来输出对象的内容.
注意 :当我们输出对象的名字时,默认调用的是当前对象的toString方法
[面试题] == 和 equals的区别是什么?
== :
基本数据类型,比较的是具体的内容是否相等。
引用数据类型,比较的是地址值是否相等。(两个变量指向的是否是同一个对象)
equals :
如果没重写Object中的方法比的是地址值
如果重写了equals方法那么通常比较的是内容
单元测试
单元测试:
1.导包 -
①直接在方法上写一个@Test鼠标放上去就会提示
②在package视图中 - 鼠标在项目上右键 -> BuildPath -> AddLibraries ->JUnit ->JUnit4
2.使用 :
① 在方法上添加一个@Test
② 右键 - RunAs -> JUnitTest
3.注意 :
①单元测试的方法必须是public修饰,没返回值,没形参
②单元测试方法所在的类必须是public修饰
③执行的时候如果是绿条说明成功,红条说明失败
④运行哪个方法就把光标放在那个方法的名字上,然后右键运行
⑤不要在项目中随意使用单元测试方法 - 单元测试方法用来测试类中,测试类在测试的包中。
包装类
String类、基本数据类型、包装类之间的转换