Java中面向对象的一些基本知识

面向对象三大特性:
封装,为了解决程序数据的安全性
继承,为了解决程序代码的重复性
多态,为了解决程序代码的扩展性

private 可以用来修饰类的成员变量/成员方法
作用:
如果成员变量被private修饰了,那么该成员变量只能类的内部访问,外部无法访问!!!
接着:
我们还需要暴露一种访问该成员变量的方式,称为获取器和设置器(getter And setter)

this关键字就是用于区别成员变量和局部变量重名的这种情况的
Java根据就近原则,所以优先使用局部变量
如果我们想使用成员变量,只需要加上this.变量名
this: 当前对象,this只能用于成员方法中,哪个对象调用成员方法,方法中的this就代表该对象
this关键字的作用
this的作用是区别同名的成员变量和局部变量
在默认情况,如果成员变量和局部变量同名,JVM只会使用局部变量(就近原则)
可以使用this.成员变量名,来指定就使用成员变量,不使用局部变量!

构造方法的注意事项:
a.一个类中如果我们不写任何构造,那么系统会自动生成一个无参构造,如果我们写了构造,系统不再自动生成无参构造
b.构造方法也可以重载(一样的方法名,不一样的方法参数),如果我们写了一个构造,那么必须手动提供无参构造
c.无论我们是否有有参构造,无参构造都建议动手添加
d.我们使用无参构造时,为成员变量初始化的是默认值,使用有参构造,为成员变量初始化我们指定的值

继承:
a.如果子父类成员变量不同名,子类中写哪个成员变量就访问哪个成员变量
b.如果子父类成员变量同名,子类中访问成员变量时,Java根据就近原则优先访问子类的这个成员变量
c.如果就想要访问同名变量中的父类的那个,使用super.成员变量名即可
super的作用: 区分子类成员变量和父类成员变量同名的情况
this的作用: 区分局部变量和成员变量同名的情况
this:
this.变量名 优先访问本类的成员变量
this.方法名() 优先调用本类的成员方法
this(参数) 调用本类的其他构造
super:
super.变量名 只访问父类的成员变量
super.方法名() 只调用父类的成员方法
super(参数) 调用父类的其他构造
总结:
继承后子类访问成员变量时,子类有访问子类自己的,子类没有访问父类的

继承(extend)特点:
a.如果子父类成员方法不同名,使用子类对象调用方法时,该调用哪个就调用哪个
b.如果子父类成员方法同名,使用子类对象调用成员方法时,Java根据就近原则优先调用子类的这个成员方法
c.如果想调用父类的同名方法,必须在子类中去调用,使用super.方法名()调用
d.Java只支持单继承,不支持多继承。(一个类只有一个爸爸)
e.一个类可以有多个子类。(一个爸爸可以有多个孩子)
f.可以多层继承.(一个类只有一个爸爸,但是爸爸也可以有自己的爸爸)

方法的重载(overload): 在同一个类,方法名一样,参数列表不一样,这些方法称为方法重载
方法的重写/覆盖/覆写(override): 在父类和子类中,子类中出现一个除了方法体其他和父类一模一样的方法,子类中这个方法称为方法的重写

方法重写的注意事项
a.方法重写前提是必须有继承关系(实现关系)
b.子类方法覆盖父类方法,必须要保证权限大于等于父类权限。(一般来说父类方法是啥权限,子类重写时也写啥权限)
Java中有四大权限,从小到大分别为: public protected 不写(default) private
c.重写方法时除了方法体,其他的(返回值类型、函数名和参数列表)都要一模一样

构造方法的特点:a.子类能否继承父类的构造方法?? 不能!!!
b.子类的所有构造第一行会调用父类的无参构造,通过语法super()调用!!!
子类构造器执行的时候,都会在第一行默认隐含了一个super(),去调用父类无参数构造器,super()可以省略不写。

抽象类的使用:
1.抽象类是无法创建对象的(Java规定的)
2.抽象类天生就是做爹的!!(给子类继承用的)
3.当子类继承抽象类后,必须重写抽象类中所有的抽象方法,子类才能创建对象,否则子类还是一个抽象类
4.只有子类完成以上重写之后子类才能创建对象并使用!

抽象类的特征和注意事项
a.抽象类不能创建对象
b.抽象类中,可以有构造器
c.抽象类中不一定含有抽象方法,但是含有抽象方法的类一定是抽象类
d.抽象类的子类要么重写所有抽象方法,要么也定义成抽象类,否则编译报错
e.抽象类存在的意义是为了被子类继承,抽象类体现的是模板思想。

抽象类存在的意义就是为了被子类继承,抽象类体现的是模板思想。

final关键字:
final: 中文意思:最终的,不可变的
作用:可以修饰类,变量(局部,成员,基本类型,引用类型),方法
(太监类,不能被继承!!!)
一旦用final修饰,里面方法,变量都不能够改变了

static关键字:静态关键字
用于修饰成员变量和成员方法,被static修饰的成员变量或者成员方法,称为静态变量或者静态方法(共享成员)
特点:a.该变量不再属于某个对象,属于整个类,被所有对象共享!!
b.该变量也可以不通过对象调用,直接通过类名.静态变量名!

静态和非静态之间的相互调用
静态的东西,跟随类的加载而加载,此时对象不一定存在
非静态的东西,跟随对象的创建而存在
结论:静态在内存中早于非静态出现的
a.静态可以访问静态,非静态可以访问非静态
b.静态不不不可以直接访问非静态,但是非静态可以直接访问静态

接口(interfact):是一种引用类型(和类,数组一样)
接口我们可以把它看成一个极端的抽象类,其中所有的方法都只能是抽象的(JDK7)
接口中又添加了默认方法和静态方法(JDK8)
接口中又又添加了私有方法(JDK9)
接口的使用:
a.接口与抽象类一样不能创建对象
b.接口也是用于被其他类"实现"
格式:
public class 实现类 implements 接口名{

}

实现和继承的优先级问题
Java中允许继承和实现同时存在
格式:
public class 子类/实现类 extends 父类 implements 接口1,接口2,…{
//1.重写父类和所有接口中的所有抽象方法
//注意:如果有抽象方法同名,实现类只需要重写一次
//2.选择性重写父类中的正常方法和所有接口中默认方法
//注意:如果父类中的正常方法和接口中默认方法相同了,不需要重写,
//实现类对象调用该方法时,优先调用父类中这个方法
//3.无论父类和接口中是否有静态方法,静态方法是否重名,实现类都不需要重写
}
注意: 继承和实现同时存在时,继承的优先级高于实现!!
接口的多继承:
a.类和类之间是继承关系,单继承!
b.类和接口之间是实现关系,多实现!
c.接口和接口之间继承关系,而且是多继承

多态:同一种方法,不同的表现形式(一种事物的不同的表现形式)
前提:a.必须有方法的重写
b.必须有继承关系或者实现关系
体现:父类类型的变量名 指向了 子类类型的对象
代码表述:父类类型 对象名 =new 子类类型();
特点:编译看父类,运行看子类
好处:扩展性
缺点:子类的特有方法,多态时不能够使用
多态缺点的解决方案-向下转型
基础数据类型转换:
自动转换:double d=1;
强制转换:int a=int(3.14);
引用类型数据转型:
向上转型:Animal an=new Dog();也是多态
向下转型:Dog dd=(Dog)an;
注意:一定有多态才能够使用向下转型
转型可能出现的异常:
Person p2 = new Teacher();//多态p2指向了Teacher类型的对象
p2.eat();//OK 子父类共有的方法
//p2.teach();//无法调用,因为teach方法是子类特有的

Student tt = (Student) p2;//不小心向下转型时,转成了Student类型
//那么就会出现类型转异常
//ClassCastException 类型转换异常(向下转型异常)
//Teacher cannot be cast to Student

instanceof关键字:是一个Java提供的运算符
格式:
boolean b=对象名 instanceof 类名
判断 对象名所指向的对象是否为指定类的对象
向下转型时,先使用instanceof进行判断

内部类:在一个类A的内部再定义一个类B,此时类B称为内部类,类A称为外部类
Java中根据类B的位置不同,内部类可以分为两种:
成员内部类: 定义在外部类的类中但是方法名的内部类
局部内部类: 定义在外部类的类中方法内的内部类

匿名内部类:其实就是一种定义内部类的简便格式, 用于快速创建一个类的子类对象或者一个接口的实现类对象
匿名内部类格式:
new 类名(){重写方法} new 接口名(){重写方法}
举例:
new Inter(){
@Override
public void method(){}
}
匿名内部类的本质:是一个继承了该类后者实现了该接口的子类匿名对象
匿名内部类在开发中的使用
理解匿名内部类的编写格式:[重点]
父类 变量名 = new 父类(){
重写必要的方法
};

接口 变量名 = new 接口(){
    重写必要的方法
};
  • 当发现某个方法需要,接口或抽象类的子类对象,我们就可以传递一个匿名内部类过去,来简化传统的代码

权限修饰符:Java中有四种权限修饰符,从权限大到小分别为:
public(公共的) protected(受保护的) 不写(默认/default) private(私有的)
a.如果一个类的成员是public修饰的,那么基本上其他的任何中类都可以访问该成员变量(通过对象)
b.如果一个类的成员是private修饰的,那么除了本类其他类中都是无法直接访问该成员变量的

代码块:在Java中由一堆大括号起来的我们成为代码块
构造代码块:特点:每次创建该类对象时,构造代码块都会自动执行一次
静态代码块格式:
static{
System.out.println(“我是静态代码块…”);
}
特点:a.随着字节码文件被加载到内存就会立刻执行,且执行一次
b.优先于本类的任何构造方法之前执行的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值