1.类的继承
语法:
class 子类 extends 父类{
子类的属性
子类的方法
}
继承的特点:子类会把父类所有的属性和方法继承下来
代码:
/**
* 父类
*/
class Teacher{
String name;
int age;
public void sleep(){
System.out.println("老师在睡觉");
}
}
/**
* 子类的定义
*/
//class 子类 extends 父类{
class JavaTeacher extends Teacher{
public void teachJava(){
System.out.println(name+"老师正在教java"+" 年龄:"+age);
}
}
class PHPTeacher extends Teacher{
public void teachPHP(){
System.out.println(name+"老师在教PHP"+" 年龄:"+age);
}
}
class ExtendsDemo2{
public static void main(String[] args){
JavaTeacher jt = new JavaTeacher();
jt.name = "张三";
jt.age = 30;
jt.teachJava();
PHPTeacher pt = new PHPTeacher();
pt.name = "李四";
pt.age = 40;
pt.teachPHP();
}
}
2.继承 内存图
3.Super的特点:
1.子类实例化的过程中父类的构造器先被调用,然后再调用子类的构造器。
2.子类的被调用的时候父类的默认构造器就会被调用(父类如果存在着有参数的构造器,一定要把默认构造器显式的定义出来)。
3.子类在调用父类的有参数的构造器的时候使用super(参数列表…),这时父类的默认的构造器就不会再被调用了。
代码1:
class Teacher{
String name;
int age;
//默认的构造器
public Teacher(){
System.out.println("父类默认构造器被调用");
}
//带参数的构造器,如果默认的构造器没显示出来,会被带参数的构造器覆盖掉
public Teacher(String name){
this.name = name;
System.out.println("父类有参数构造器被调用");
}
public void sleep(){
System.out.println("老师正在睡觉");
}
}
/**
*子类继承父类语法:class 子类 extends 父类
*/
class JavaTeacher extends Teacher{
public JavaTeacher(String name){
/**在子类的构造器中隐藏了调用super,这个super是无参数的
*无论子类的构造器带不带参数,都会调用父类的构造器
*/
//super();
//调用父类有参数的构造器,那么父类默认的构造器不会被调用,会被覆盖
super(name);//super一定要在第一行
this.name = name;
System.out.println("子类的默认构造器被调用");
}
public void teachJava(){
System.out.println(name+"老师正在教java");
}
}
class ExtendsDemo4{
public static void main(String[] args){
JavaTeacher jt = new JavaTeacher("张三");
}
}
代码2:
class Teacher{
String name = "任亮";
int age;
public void sleep(){
System.out.println("老师在睡觉");
}
}
/**
*子类继承父类语法:class 子类 extends 父类
*/
class JavaTeacher extends Teacher{
String name = "亮哥";
public void teachJava(){
//默认情况下单独的使用对象的熟悉时都隐藏了this.
System.out.println(this.name+"老师正在教java");
//加上super.,调用的是父类的属性
System.out.println(super.name+"老师正在教java");
}
/**父类和子类有同名的方法,在调用的时候会输出子类的方法
*如果要区分,在子类中使用this.sleep();super.sleep()
*/
public void sleep(){
System.out.println("Java老师在睡觉");
}
}
class ExtendsDemo5{
public static void main(String[] args){
JavaTeacher jt = new JavaTeacher();
jt.teachJava();
jt.sleep();
}
}
4.final:
1.修饰在属性上
class User{
//fianl修饰在属性上,属性的值不能再改变
final int username;
int password;
//fianl修饰在属性上,属性的值不能再改变
public static final float PI = 3.14f;
}
class FinalDemo1{
public static void main(String[] args){
User e = new User();
e.username = 123;//已经无法改变值
User.PI = 6.28f;//已经无法改变值
}
}
2.修饰在方法上
代码1:
class User{
int username;
int password;
//final修饰在方法上,子类继承父类无法对final方法进行重写
public final void login(int username,int password){
if(username == 123&&password == 123){
System.out.println("登陆成功");
}
}
}
class Emp extends User{
int empNo;
//子类对父类方法进行重写
public void login(int username,int password){
System.out.println("登陆成功");
}
}
class FinalDemo{
public static void main(String[] args){
Emp e = new Emp();
e.login(1,1);
}
}
3.修饰在类上
//使用final来修饰的类是不可以被继承的
final class User{
}
class Emp extends User{
int empNo;
}
class FinalDemo2{
public static void main(String[] args){
Emp e = new Emp();
}
}