super
实例
//父类代码
public class Person {
public Person() {
System.out.println("Person的无参构造执行了");
}
protected String name = "yangxin";
//private私有的东西不能被继承
public void print(){
System.out.println("Person");
}
}
//子类代码
public class Student extends Person {
public Student() {
super();//隐藏代码,调用父类的构造器,必须要在子类构造器的第一行
System.out.println("Student的无参构造执行了");
}
private String name ="yangxin1";
public void print(){
System.out.println("Student");
}
public void test1(){
print();
this.print();
super.print();
}
public void test(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
//主函数代码
public class Application {
public static void main(String[] args) {
Student student = new Student();
//student.test("杨鑫");
//student.test1();
}
}
注意点
1.super调用父类的构造方法,必须在构造方法的第一个
2.super 必须只能出现在子类的方法或者构造方法中!
3.super 和this不能同时调用构造方法!
Vs this:
代表的对象不同:
this:本身调用者这个对象
super:代表父类对象的引用
前提:
this:没有继承也可以使用
super:只能在继承条件下才可以使用
构造方法
this():本类的构造
super():父类的构造
方法重写
注意点
需要有继承关系,子类重写父类的方法!
1.方法名必须相同
2.参数列表必须相同
3.修饰符范围可扩大但不能缩小: public>protected>default>private
4.抛出的异常 范围可以缩小但不能扩大。
重写,子类的方法和父类必须一致,方法体不同!
为什么需要重写?
1.父类的功能,子类不一定需要或不一定满足。
实例
//父类代码
public class B {
//重写都是方法的重写与属性无关
public void test(){
System.out.println("B=>test");
}
}
//子类代码
public class A extends B{
@Override//注解
public void test() {
System.out.println("A=>test");
}
}
//main方法
public static void main(String[] args) {
//静态方法和非静态方法有很大的区别,静态一般不使用!
//非静态:重写
//静态方法的调用只和左边定义的数据类型有关
A a = new A();
a.test();//A
//父类的引用会指向子类
B b =new A();//子类重写了父类的方法
b.test();//B
}
//结果
A=>test
A=>test
多态
自我总结
如果子类没有重写,继承的是父类的方法
如果子类重写,父类引用子类方法,子类也用自己的方法
父类可以指向子类但是不能引用子类独有的方法
实例
//父类代码
public class Person {
public void run(){
System.out.println("run");
}
}
//子类代码
public class Student extends Person {
@Override
public void run() {
System.out.println("make");
}
public void eat(){
System.out.println("eat");
}
}
//main方法
public static void main(String[] args) {
//对象能执行哪些方法,主要看对象左边的类型,和右边关系不大
Student s1 = new Student();
Person s2 = new Student();
Student s3 = new Student();
s1.run();
s2.run();//子类重写的方法,父类可调用
s1.eat();
//s2.eat();子类独有的方法父类不可调用
}
instance of 和类型转换
实例
//父类person
public class Person {
public void run(){
System.out.println("run");
}
}
//子类student
public class Student extends Person{
public void go(){
System.out.println("go");
}
}
//子类teacher
public class Teacher extends Person{
}
//main方法
public static void main(String[] args) {
//类型之间的转化 父 子
// 高 低
Person student = new Student();
//原本是Person类型,用Student将这个对象转化为Student类型,我们就可以使用Student类型的方法了
((Student)student).go();
//子类转换为父类可能会丢失一些方法
Person person = student;
}
}
注意点
1.父类引用指向子类对象
2.把子类转换为父类,向上转型
3.把父类转换为子类,向下转型,强制转换
4.方便方法的调用,减少重复的代码,简洁
static关键字
非静态变量与静态变量的区别
public class Student {
private static int age;//静态变量
private double score;//非静态变量
public static void main(String[] args) {
Student s1 = new Student();
System.out.println(Student.age);//静态变量可以通过类名来调用
System.out.println(s1.age);//非静态变量不可以通过类名来调用
System.out.println(s1.score);
go();//静态变量可以直接调用
//run();非静态变量不可以直接调用
}
public void run(){
go();//非静态变量可以调用静态变量
}
public static void go(){
}
}
静态代码块、匿名代码块、构造方法执行顺序
public class Person {
//2.第二执行
{
System.out.println("匿名代码块");
}
//1.首先执行,只执行一次
static{
System.out.println("静态代码块");
}
//3.最后执行
public Person(){
System.out.println("构造方法");
}
public static void main(String[] args) {
Person person1 = new Person();
System.out.println("=====================");
Person person2 = new Person();
}
}
/*
//结果:
静态代码块
匿名代码块
构造方法
=====================
匿名代码块
构造方法
*/
静态导入包
//静态导入包
import static java.lang.Math.random;
import static java.lang.Math.PI;
public class Test {
public static void main(String[] args) {
System.out.println(Math.random());
}
}
//final 修饰的类无法进行继承,断子绝孙
抽象类(abstract)
public abstract class Action {
//约束,有人帮我们实现
//抽象方法,只有方法名字没有方法的实现!,要想实现只能通过子类的方法来实现,子类也是抽象方法就通过子子类来实现
public abstract void doSomething();
}
//抽象类中可以写普通的方法
//抽象方法只能在抽象类中
//提高开发效率