继承
继承概述
继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法
继承的格式:
public class 子类名 extends 父类名{}
父类也被称为基类和超类
子类也被称为派生类
继承中子类的特点:
子类可以有父类的内容
子类还可以有自己特有的内容
继承的好处和弊端
好处:
提高了代码的复用性(多个类相同的成员可以放在一个类中)
提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
弊端
继承让类和类之间产生了关系,类的耦合性增强了,当父类发生变化时子类也不得不发生变化,削弱了子类的独立性
什么时候使用继承
继承体现的关系:is a
假设法 假如我有两个类A和B,如果他们满足A的一种或者是B的一种,就说明它们存在继承关系,这个时候就可以考虑继承来实现否则就不能滥用继承
继承中变量的访问特点
在子类方法中访问一个变量
首先在子类局部范围找(方法内部)
然后在子类成员范围内找
父类范围找
如果没有就报错(不考虑父亲的父亲)
super
super关键字用法和this关键字用法类似
this代表本类对象的引用
super代表父类存储空间的标识
继承中构造方法的访问特点
子类中所有的构造方法都会默认访问父类中无参的构造方法
因为子类汇集成父类中的数据,有可能还会使用父类中的数据, 所以子类初始化前,一定要先完成父类数据的初始化
每一个子类构造方法的第一条语句默认都是super
如果父类中没有无参构造方法,只有带参构造方法应该怎么办
通过super()去显示的代用父类的带参构造方法
在父类中自己提供一个无参构造方法
继承中成员方法的访问特点
通过子类访问一个对象
子类范围内查找
父类范围内查找
如果都没有就报错
super内存
内存调用
方法重写
指的是子类中出现了和父类中一模一样的方法声明
当子类需要父类的功能而功能主体子类有自己的特有内容时,可以重写父类的方法,这样既沿袭了父类的功能,有定义了子类特有的内容
package jicheng;
public class NewPhoto extends Photo{
public void call (String name){
System.out.println("开启视频");
//System.out.println("给"+name+"打电话");
super.call(name);
}
}
package jicheng;
public class Photo {
public Photo() {
}
public void call (String name){
System.out.println("给"+name+"打电话");
}
}
package jicheng;
public class Demo {
public static void main(String[] args) {
Photo p =new Photo();
p.call("林青霞");
System.out.println("-------");
NewPhoto nb = new NewPhoto();
nb.call("杨帅");
}
}
@ovverride 检查重写方法之后方法声明的正确性
方法重写的注意事项
父类中的私有内容子类是不能继承的 (私有方法不能被重写)
子类方法访问权限不能更低(public>默认>私有)
Java中继承的注意事项
Java中只支持单继承,不支持多继承
Java中类支持多层继承
案例:老师和学生
package tas;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package tas;
public class Teacher extends Person{
public Teacher() {
}
public Teacher(String name, int age){
super(name,age);
}
public void teach(){
System.out.println("用爱成就每一位学生");
}
}package tas;
public class Demo {
public static void main(String[] args) {
Teacher t = new Teacher();
t.setAge(30);
t.setName("jkl");
System.out.println(t.getName()+","+t.getAge());
t.teach();
Teacher t1 = new Teacher("yangshuai",20);
System.out.println(t1.getName()+","+t1.getAge());
t1.teach();
}
}
注意事项:自己补充带参和不带参数的构造函数子类里边没有变量所以要用super传递
案例:猫和狗
package CAD;
public class Demo {
public static void main(String[] args) {
Cat x = new Cat();
x.setAge(10);
x.setName("asdasd");
System.out.println(x.getAge()+x.getName());
}
}
package CAD;
public class Cat extends animal{
public Cat() {
}
public Cat(String name,int age) {
super(name,age);
}
public void zeren(){
System.out.println("抓老鼠");
}
}
package CAD;
public class animal {
private String name;
private int age;
public animal() {
}
public animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
修饰符
包的概念和使用
其实就是文件夹
作用:对类进行管理
定义格式
package 包名;(多级包用.分开)
javac -d.Hello (自动建包)
java com.it.hello (执行)
导包的概述
使用不同的包下的类时候要写类的全路径,太麻烦了
为了简化带包操作,Java就提供了导包功能
格式
import 包名.类名
权限修饰符
状态修饰符
static 静态
final 最终态:
关键字是最终的意思 可以修饰成员方法,成员变量,类
修饰方法表明该方法是最终方法,不能被重写
修饰变量表明该变量是常量,不能被再次赋值
修饰类表明该类是最终类,不能被继承
final修饰局部变量
变量是基本变量:
final指的是基本变量的数据值不能发生改变
变量是引用类型:
final指的是引用类型的地址值不能发生改变,但地址里的内容是可以发生改变的
static
是静态的意思,他可以修饰成员方法成员变量
修饰特点:被类的所有对象共享
也是我们判断是否使用静态关键字的条件
可以通过类名调用,也可以通过对象名调用
推荐使用类名调用
static访问特点
非静态的成员变量:
能访问静态的成员变量
能访问非静态的成员变量
能访问静态的成员方法
能访问非静态的成员方法
静态的成员方法:
能访问静态的成员变量
能访问静态的成员方法
静态成员方法只能访问静态成员
是基本变量:
final指的是基本变量的数据值不能发生改变
变量是引用类型:
final指的是引用类型的地址值不能发生改变,但地址里的内容是可以发生改变的
static
是静态的意思,他可以修饰成员方法成员变量
修饰特点:被类的所有对象共享
也是我们判断是否使用静态关键字的条件
可以通过类名调用,也可以通过对象名调用
推荐使用类名调用
static访问特点
非静态的成员变量:
能访问静态的成员变量
能访问非静态的成员变量
能访问静态的成员方法
能访问非静态的成员方法
静态的成员方法:
能访问静态的成员变量
能访问静态的成员方法
静态成员方法只能访问静态成员