JAVASE学习九——面向对象(2)
四.this关键字
this即“自己”,代表对象本身,谁调用代表谁。在成员方法中或构造器中隐式的传递。作用如下:
1.this.属性 避免属性和形参,局部变量同名,发生就近原则
2.this([实参列表]):构造器的首行调用其他构造器。
class Web{
//网址
public String url;
public Web(){
System.out.println("构造器");
}
public Web(String url){
this(); //this()构造器的调用
this.url =url;//this.属性 区分同名问题
}
//赋值
public void setUrl(String url){
this.url =url;
}
/**
属性与形参 同名,发生就近原则
public Web(String url){
url =url;
}
//二者不同名
public Web(String u){
url =u;
}*/
}
ps:静态方法中无this
五.成员方法分析与应用场景
成员的是属于对象的,根据一系列对象分析抽取的共性定义在模板类中的成员位置。
class Person{
String name; //成员变量
//成员方法
void eat(){
}
}
在外部想要使用类中的成员,必须跟随这个类的对象使用。
如果是根据对象分析出的功能,把它定义在类中的成员方法中。
如果不想跟随对象使用,那就定义成静态方法,非成员方法。
六.static关键字
凡是静态的都是属于类的,与对象无关的,先于对象存在的。可用于修饰属性,方法,块。
在类中,用static声明的成员变量为静态成员变量,或者叫做:类属性,类变量。
它为该类的公用变量,属于类,被该类所有实例共享,类被载入的时候就会初始化。
对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享。
可以使用“对象.属性”或者“类.属性”调用,推荐后者
static变量置于方法区中。
用static声明的方法为静态方法:
不需要对象,就可以调用。
在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可以直接方法非static的成员。但是 可以通过对象调用。
静态方法不能以任何方法引用this和super关键字。
ps:静态内容中只能直接使用静态内容,通过对象使用成员内容
成员内容中可以直接使用静态内容,可以直接使用成员内容,可以用通过对象使用。
七.block
块{},在java中自成作用域,可以分为
| 静态代码块 | 构造方法块 | 普通语句块 | 同步代码块 | |
|---|---|---|---|---|
| 声明位置 | 类中,方法外 | 类中,方法外 | 方法中 | synchronized{} |
| 作用 | 整个类进行某些初始化操作(静态属性赋值) | 构造代码块是为对象初始化操作(为静态或非静态成员属性赋值) | 声明一些临时变量等。。 | 控制并发 |
| 执行时机 | 类第一次加载的时候执行,只执行一次,如果有多个静态代码块,则依次从上到下执行 | 创建对象时,执行构造器代码之前执行,如果有多个,从上往下依次执行。 | 跟随方法执行 | 跟对方法执行 |
ps: 类第一次被载入时先执行static代码块;类多次载入时,static代码块只执行一次;static块经常用来进行 static变量的初始化。
是在类初始化时执行,不是在创建对象时执行。
静态初始化块中不能访问非static成员。
构造块被编译到将要执行的构造器之前执行。
静态块:仅在类的第一次使用时加载。
构造块:先于构造器执行,每创建一个对象执行一次。
八.继承(面向对象三大特性之一)
1.继承
继承的本质:是对某一批类的抽象,从而实现对现实世界更好的建模
继承的作用:使用继承可以提高代码的复用性。
如何使用继承:使用extends关键字即可。
java中使用extends关键字实现类的继承机制,语法规则:
<modifier> class <name> [extends <superclass>]{}
//父类
class Person{
public String name;
public int age;
public void sleep(){
System.out.println("休息");
}
}
//子类
//教师类
class Teacher extends Person{
public String subject;
public Teacher() {
}
public void teach(){
System.out.println("传授知识");
}
}
//学生类
class Student extends Person{
public String school;
public Student() {
}
public void study(){
System.out.println("在知识的海洋畅游!");
}
}
注意:
子类继承父类的成员变量和成员方法,但不继承父类的构造方法。
java中只有单继承,没有像c++那样的多继承。
所有类的默认父类是object
2.特点
优点:通过继承可以简化类的定义,实现代码的重用性。
可以更好的扩展程序
子类一旦继承父类,可以有权使用父类中的成员,也可以扩展定义子类独有内容
java是单继承实现,实现简单
缺点:子类与子类之间紧密耦合(耦合度高),子类依赖于父类的实现,子类缺乏独立性。
不便于后期维护。
单继承一个子类只能有一个父类,不够灵活,不便于后期维护。
九.权限修饰符
| 关键字 | 同一个类 | 同一个包中 | 不同包下子类 | 所有类 |
|---|---|---|---|---|
| private | * | |||
| default | * | * | ||
| protected | * | * | * | |
| public | * | * | * | * |
十. 重写Override
父类的功能实现不满足子类的要求,可以在子类中按需改写,这就是方法的重写。
实现父类重写的三个条件:
不同的两个类
继承关系|实现关系
方法签名相同
注意:子类重写的方法会对父类的方法进行屏蔽。
当子类对象调用时,会调用子类中重写的方法,子类没有找父类。
重写的三个“=”:
“==”:方法名,形参列表相同。
“<=“:抛出的异常类型与返回值类型,返回值类型如果为基本类型必须相同,引用数据类型子类小于等于父类。
”>=“:访问权限,子类大于等于父类。
以下修饰符,修饰的内容不能重写:
1.private修饰的方法不能被重写。
2.final修饰的方法不能被重写。
3.static修饰的方法不能被重写(子类如果出现和父类静态方法同名情况,那么子类中的方法也必须为静态 的)
十一.super关键字
1.super
super是指向父类的引用。
super可以在子类构造器中调用父类某个构造器。
如果构造方法没有显示地调用父类的构造方法,那么编译器会自动为它加上一个默认的super()方法调用,如果父类没有默认的无参构造方法,编译器就会报错,super()语句必须是构造方法的第一个子句。
super可以用来区分子父类中同名成员。
如果不存在同名问题,可以直接在子类中调用父类内容,super默认略。
如果存在同名问题,在子类中调用同名成员,默认this.成员 调用当前子类同名成员,调用父类同名成员使用super.成员。
2.this和super之间的区别
相同点:
1.this和super都能用来调用其他构造器,都要在首行出现。
2.this和super都可以用来区分同名问题,不区分同名时候可以省略。
3.this和super都指的是对象,所以,均不可以在static环境中使用。包括static变量,static方法,static语句。
不同点:
1.this(参数)构造器第一行调用本类中其他构造器,super(参数)构造器第一行调用父类中某个构造器。
2.this用来区分成员和局部同名问题,super用来区分父类中同名问题。
注意:
1.this和super不能同时出现在一个构造函数里面,因为this必然会调用其他的构造函数,其他的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会过。
2.从本质上讲,this是指向本对象的指针,然而super是一个JAVA关键字。
十二.final关键字
final可以用来修饰变量,方法,类。
修饰变量:变量一旦被初始化便不可改变,相当于定义了一个常量。
修饰方法:被final修饰的方法,子类不可以覆盖。
修饰类:被final修饰的类,不可以被继承。
十三.Object类
Object类是所有java类的根基类
如果在类的声明中未使用extends关键字指明其基类,则默认基类位Object类。
Object下常用方法
| 方法名 | 返回类型 | 说明 |
|---|---|---|
| toString | String | 返回对象信息 |
| equals | boolean | 比较两个对象是否相等 |
十三.多态(面向对象三大特性之一)
1.概述
多态用一句话概括就是一种事物的多种表现形式。程序的行为在编译的时候并没有确定,只在执行的过程中确定。这对于大型系统来说可以提高灵活性和扩展性。ps:多态是方法的多态,不是属性的多态。
2.实现方式
实现多态一般要满足三个条件:继承 方法重写 父类引用指向子类对象
3.调用
如果子类中存在重写方法,会调用子类中的重写方法,如果没有重写,调用从父类中继承的方法。
多态调用成员特点:
成员变量:编译运行都看父类|左边|类型
成员方法:编译看父类|左边|类型,运行找子类|右边|对象
ps:为了让多态有意义,需要搭配方法的重写。
4.引用数据类型的类型转换
对应类型的数据赋值给对应类型的变量
基本数据类型 :
数据类型转换
自动类型提升 : 从小---> 到大
强制类型转换 : 从大---> 到小
小范围类型 变量 = (小范围类型)大范围类型数据;
引用数据类型 :
转型 : 父类-->大类型 子类-->小类型
向上转型 : 从小---> 到大
多态 : Person p = new Student();
多态引用想要调用子类新增的独有内容,不能直接调用,可以向下转型
向下转型 :
小范围类型 变量 = (小范围类型)大范围类型数据;
Student s = (Student)p; //Student s = new Student();
向下转型时候经常可能遇到java.lang.ClassCastException 类型转换异常
引用 instanceOf 类型 : 判断前面的引用是否是指向后面类型的对象或者后面类型的子类对象,是返回true,不是返回false
十四.abstract关键字
抽象方法:被abstract关键字修饰的方法没有方法体,必须定义在抽象类中
抽象类:被abstract关键字修饰的类
通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。
抽象类使用特点:
有抽象方法的类必须定义为抽象类
抽象类不能实例化,即不能用new来实例化抽象类。
抽象类可以包含属性,方法,构造方法。但构造方法不能通过new关键字来调用,只能通过子类 调用。
抽象类只能用来继承。
抽象方法必须被子类实现。
抽象类和普通父类的区别:是否包含抽象方法,抽象类不可以被实例化。
十五.接口
普通类:具体实现
抽象类:具体实现,规范(抽象方法)
接口:规范
特点:
引用数据类型
特殊的抽象类
功能的集合(抽象)
定义开发规范
类只能单继承,接口可以多实现
实现解耦,降低耦合度
定义:interface 接口
使用:
1.接口不能实例化
2.接口需要被实现类实现implements,继承父类通过extends关键字
3.接口中内容的使用:通过实现类对象调用
具体实现类:重写所有的抽象方法+按需新增
抽象实现类:按需重写抽象方法+按需新增
需要通过具体子类对象调用
实现与继承:
子类继承父类,有权使用父类中的成员,可以拿过来直接使用,对功能不满意,根据需求进行重写
**实现类实现接口,具有接口带来的功能,但是接口中的方法都是抽象的,只有功能没有实现,需要对所有 抽象方法进行实现**
ps:
jdk1.7及之前:公共的静态的常量 public static final ->可以任意省略
公共的抽象的方法 public abstract ->可以任意省略
jdk1.8及之前:1.静态方法
通过接口名.静态方法名(参数)调用
注意:不能通过实现类对象调用
2.默认方法
通过default关键字修饰
通过实现类对象调用
注意 :
1.接口可以多实现
2.类同时继承父类实现接口,需要先继承后实现
3.类与类之间只能继承,并且只能单继承
接口与接口之间只能继承,可以多继承
类与接口之间,只能类实现接口,可以多实现
383

被折叠的 条评论
为什么被折叠?



