目录
面向对象
this关键字的用法
this关键字,表示当前类的引用
引用:引用指向哪个类 那么当前的引用指向的就是哪个类的对象
用法如下:
1.初始化时,调用构造方法,可以使用this关键字去访问属性
this.length = length;
this.width = width;
2.可以在构造方法中调用构造方法
public Rect() {
System.out.println("无参的构造方法被调用");
}
public Rect(int length,int width) {
this();
this.length = length;
this.width = width;
}
3.可以作为返回值使用
public Rect getRect(){
return this;
}
初识面向对象在编程时容易遇到的问题
1.NullpointException
指的是空指针异常,指代对象为null
2.对象创建递归问题
3.搞不清局部变量和成员变量
局部变量和成员变量的作用域是不同的。成员变量的作用域在类中,局部变量的作用域在方法中,方法结束而消亡,通常垃圾回收器GC进行回收
内存
变量主要是存储在内存中,从变量存储的角度去区分可以把内存分成几个部分:
1.寄存器,最快的存储区域 由编译器根据需求进行分配,程序员无法控制(类似CPU)存储空间很小
2.栈空间,运行速度也很快,仅次于寄存器 用于存储基本数据类型的局部变量和引用数据类型的引用,对象本身不存放在栈中(new 出来的东西具体指的是对象),例如字符串就存放在常量池中,由此可见栈空间的变量需要一个生命周期,存储内容的灵活性不强
3.堆空间,存放所有new出来的对象、成员变量、常量等,里面存放内容不需要生命周期存储的内容更灵活
4.静态域:通常用于存储静态变量
5.常量池:用于存放常量
6.非RAM存储 本地或者是将数据存储在磁盘空间中
堆空间的地址 可以把它看成hashcode();
如果是基本数据类型用 ==
比较类型的内容是否相同,引用数据类型==
比较的是地址,所以我们一般选择使用equals
来比较两个引用数据类型是否相同
Overload重载
重载的定义:
在一个类中,出现同名的方法,访问修饰符相同,返回类型相同,参数列表不同(参数的个数和类型的不同)
注意:在设计重载方法时,参数类型的区分一定要足够,不能是统一简单类型的参数,比如 int 型和 long 型
public void sing(){
System.out.println("唱一首断了的弦");
}
public void sing(String song){
}
适用场景:
根据现有的不同参数,为了要完成同样的功能时,可以使用重载,重载的过程中可以去使用不同的业务逻辑
面向对象特征之继承
继承:类与类之间的关系,父子关系
可以作为父亲的那个类叫做父类 ,被继承者;可以作为孩子的那个类叫做子类 ,继承者。子类更具体,父类更抽象
在Java中不支持多重继承
单继承:
1.一个子类只能有一个父类,一个父类可以有多个子类
2.如果想实现继承关系,两个类通过extends关键字来进行实现
3.子类可以使用父类的(非私有)属性和方法,父类不能使用子类独有的属性和方法
4.创建子类对象时,先调用父类的构造方法,然后再调用子类的构造方法,如果在构造方法中加入参数的话 也要遵循这个原则(构造方法的角度)
// 父类
public class Animal {
}
//子类
public class Dog extends Animal{
}
super关键字
super关键字用来实现对父类成员的访问,super用来引用当前对象的父类
super的使用有三种情况:
1.访问父类被隐藏的成员变量或方法
例如
super.variable;
2.调用父类中被重写的方法
例如
super.Method([paramlist]);
3.调用父类的构造方法
由于子类不能继承父类的构造方法,当要在子类中使用父类的构造方法时,则可以通过super来表示,并且super必须是子类构造方法中的第一条语句
super([paramlist]);
重写Override
一般发生在两个或两个以上的类中,类的关系是继承关系,返回类型、方法的名称参数列表都一样,方法体不同,子类的访问修饰符不能比父类的更严格 。
使用场景:子类对父类的方法 具有更具体(业务逻辑 )的描述。
重写和重载的区别?
1.定义区别:
①重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。
②覆盖(也叫重写)是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数名和参数都一样,只是函数的实现体不一样。
2.类的关系区别
覆盖是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。
3.产生方法区别
覆盖只能由一个方法或只能由一对方法产生关系;重载是多个方法之间的关系。
4.参数列表要求区别
覆盖要求参数列表相同;重载要求参数列表不同。
5.调用方法区别
覆盖关系中,调用方法体是根据对象的类型来决定;而重载关系是根据调用时的实参表与形参表来选择方法体的。
面向对象特征之多态
多态指对象的多种形态
多态的表现形式有两种:
1.重写
2.父类引用指向子类对象
Animal aaa = new Dog("小黑");
Dog ddd = (Dog) aaa;// 向下转型
String str = ddd.enjoy();
System.out.println(str);
String result = aaa.enjoy();
System.out.println(result);
父类引用指向子类对象时,因为new Dog,所以调用的enjoy的方法应该是Dog里面的enjoy方法,父类引用还是不能够访问子类独有的属性和方法
引用数据类型的类型转换(向上转型,向下转型)
类型转换异常错误提示:ClassCaseException
1.自动转换
小类型转大类型
Dog d = new Dog();
Animal a = d;
2.强制转换
大类型转小类型
Animal a = new Animal();
Dog d = (Dog) a;
instanceof
用于判断对象是否属于后面的类型 ,如果属于返回true,如果不属于返回false
if (aaa instanceof Cat) {
System.out.println(true);
}else{
System.out.println(false);
}
访问修饰符
1.公共的pubic
程序的任何地方都可以访问
2.缺省的 默认的default
在一个类中不加任何访问权限的成员属于缺省的访问状态,可以被这个类本身和同包中的类访问
3.受保护的 protected
可以被这个类本身、它的子类和同包中的类所访问
4.私有的private
在一个类中被限定为prvate的成员,只能在本类中访问
Object 对象
类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。它是所用引用数据类型的基类、父类、超类,定义的类是默认继承Object的,Object表示的意思就是对象
来自于java.lang包
该类下包括的方法有:
1.clone()
创建并返回此对象的一个副本。
2.equals(Object obj)
指示某个其他对象是否与此对象“相等”。
3.finalize()
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
4.getClass()
返回一个对象的运行时类。
5.hashCode()
返回该对象的哈希码值。
6.notify()
唤醒在此对象监视器上等待的单个线程。
7.notifyAll()
唤醒在此对象监视器上等待的所有线程。
8.toString()
返回该对象的字符串表示。
9.wait()
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
wait(long timeout)
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。
wait(long timeout, int nanos)
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。
来源:CSDN
作者:wz1997123
链接:https://blog.csdn.net/wz1997123/article/details/103519788