一、代码块
1.final
final
修饰方法:表明该方法是最终方法,不能被重写
修饰类:表明该类是最终类,不能被继承
修饰变量:常量,只能被赋值一次
修饰基本数据类型:记录的值不能发生改变(常量)
修饰引用数据类型:记录的地址值不能发生改变,内部的属性值可以改变好处:增加代码可读性
private static final String ADD_STUDENR = "1";
2.局部代码块
局部代码块:变量只能在所属大括号内存在,节省空间(常规)
3.构造代码块
构造代码块:{(不用)
1.写在成员位置的代码块
2.作用:可以把多个构造方法中重复的代码块抽取出来
3.执行时机:创建本类对象的时候会先执行构造代码块再执行构造方法
}
形式:{}
public class CodeBlockDemo {
// 构造代码块
{
System.out.println("实例初始化代码块在每次创建对象时执行。");
}
// 构造方法
public CodeBlockDemo() {
System.out.println("这是构造方法。");
}
// 局部代码块
public void display() {
// 方法中的代码块
{
System.out.println("这是方法中的代码块。");
}
System.out.println("这是方法中的其他代码。");
}
public static void main(String[] args) {
// 创建对象
CodeBlockDemo demo = new CodeBlockDemo();
// 调用方法
demo.display();
}
}
4.静态代码块
静态代码块:(重点)
随着类的加载而加载,并且自动触发,只执行一次
使用场景:类加载,数据初始化如果想要做数据初始化,就用静态代码块
例如:学生管理系统的信息录入
import java.util.*;
class User
{
String name;
String id;
int age;
public User(String name,String id,int age)
{
this.name=name;
this.id=id;
this.age=age;
}
}
public class App {
//静态代码块录入信息,更安全,不会被反复调用
static ArrayList<User> list=new ArrayList<>();
static{
list.add(new User("张三","123",12));
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
}
}
//public class App{
// public static void main(String[] args) {
// Scanner in=new Scanner(System.in);
// ArrayList<User> list=new ArrayList<>();
// list.add(new User("张三","123",12));
//
// }
//}
二、抽象类
概念
使用场景:
1.父类不能确定具体的方法体,子类可能会出现很多用法
例如:
//class Person{ // public void Eat() // { // } //} abstract class Person{ public abstract void Eat(); } class Student extends Person{ @Override public void Eat() { System.out.println("吃米饭"); } } class Teacher extends Person{ @Override public void Eat() { System.out.println("吃面条"); } } public class Main{ public static void main(String[] args) { Student a=new Student(); Teacher b=new Teacher(); a.Eat(); b.Eat(); } }
为防止空的父类被调用,使其变为abstract抽象类
2.子类必须重写抽象方法
使用注意:
1.抽象类不能实例化
2.抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
3.可以有构造方法
4.抽象类的子类
要么重写抽象类中的所有抽象方法,
要么是抽象类构造方法:创建子类对象的时候,给属性进行赋值
抽取共性的意义:统一所有子类的相关方法的名称和调用方法
方便查看,方便调用,方便修改
三、接口
1.概念
接口的使用:
一个方法类(interface)implements
子类无法继承父类的某个或多个方法
比如:动物类里的“游泳”方法,只有兔子不会游泳,其它动物子类自定义游泳太麻烦
接口中成员的特点:
接口中成员的特点:
1.成员变量:1、只能是常量 2. 默认修饰符:public static final
2.构造方法:没有
3.成员方法:1、只能是抽象方法 2、默认修饰符:public abstract
面向对象各种关系:
类和类的关系:
继承关系,只能单继承,但可以多层继承
类和接口的关系:
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
接口和接口的关系:
继承关系,可以单继承,也可以多继承(实现类实现了最底层的子接口,就必须重写接口体系里所有的抽象方法)
接口与抽象类的不同:
抽象类是对象类的抽象,可以有构造方法
接口是对行为的规则定义,不可以有可变成员变量(有也只能定义常量)
jdk8,jdk9新方法:
1.default关键字(默认方法)
jdk8 默认方法:default ...
1.默认方法不是抽象方法,不会强制重写,若重写,去掉default关键字
2.public可省略 default不可省略
3.如果实现了多个接口,多个接口中有相同名字的默认方法,子类必须 对该方法进行重写
(在接口升级之后,原子类接口不需要实现接口里的新方法,但也可以实现,(兼容性))
2.static关键字(静态方法)
jdk8 静态方法:static
1.静态方法只能用接口名引用
2.静态方法不能被重写
3. private关键字(私有方法)
jdk9 私有方法:private
1.适用于接口里的默认方法
2.static private 适用于接口里的静态方法
4.接口多态
接口类型 j = new 实现类对象()
理解:谁实现了接口j 谁就是接口j的儿子,接口j相当于实现类的父类
可以调用所有实现类对象的方法当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态
这么理解吧:我现在想要实现一个搬家的方法:传递的参数是一个可以帮我搬家的工具:比如搬家公司,或者一辆汽车,或者一个人 但是这些东西我没办法找到一个统一的可以替代的东西当作参数传入,
所以我定义一个 叫做“运输”的接口 ,将这个接口传入, 然后呢 我可以让 人,汽车,搬家公司这些东西都作为这个接口的实现类,这样他们就具有了搬家这一功能,而且我可以将 他们作为参数传入
5.适配器
创建一个抽象类,实现接口的所有方法
原理:接口中所有抽象方法都必须被全部实现,但抽象类里的默认方法不需要被全部实现
定义一个中间类,当作中转站,其它类继承抽象类,需要用哪个方法,就重写哪个方法
2.动物会游泳(但不全会)
A.动物类(父类)
public abstract class Animal{
private String name;
private int age;
public Animal(String name,int age)
{
this.name=name;
this.age=age;
}
public abstract void eat();
public void drink()
{
System.out.println(this.name+"正在喝水");
}
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;
}
}
B.青蛙类(会游泳)
class Frog extends Animal implements Swim{
public Frog(String name,int age)
{
super(name,age);
}
@Override
public void eat()
{
System.out.println(this.getName()+"正在吃虫子");
}
@Override
public void swim()
{
System.out.println(this.getName()+"正在蛙泳");
}
}
C.狗类(会游泳)
class Dog extends Animal implements Swim{
public Dog(String name,int age)
{
super(name,age);
}
@Override
public void eat()
{
System.out.println(this.getName()+"正在吃骨头");
}
@Override
public void swim()
{
System.out.println(this.getName()+"正在狗刨");
}
}
D.羊类(不会游泳)
class Sheep extends Animal{
public Sheep(String name,int age)
{
super(name,age);
}
@Override
public void eat()
{
System.out.println(this.getName()+"正在吃草");
}
}
E.主函数
public class Main {
public static void main(String[] args) {
Frog a=new Frog("小青蛙",40);
Dog b=new Dog("大黄",20);
Sheep c=new Sheep("喜羊羊",10);
a.eat();
b.eat();
c.eat();
a.drink();
a.swim();
b.swim();
}
}
F.接口
public interface Swim {
public void swim();
}
3.运动队
概述:
A.人员类
public abstract class Person {
String name;
int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Person{name = " + name + ", age = " + age + "}";
}
}
B.乒乓人员
public abstract class PingPongPerson extends Person{
public PingPongPerson(String name,int age)
{
super(name,age);
}
public void SpeakE()
{
System.out.println(this.getName()+"说英语");
}
}
C.篮球人员
public abstract class BasketballPerson extends Person {
public BasketballPerson(String name,int age)
{
super(name,age);
}
}
D.接口:教
public interface Teach{
void teach();
}
E.接口:学
public interface Learn{
void learn();
}
F.乒乓运动员
class PpAthlete extends PingPongPerson implements Learn{
public PpAthlete(String name,int age)
{
super(name,age);
}
@Override
public void learn()
{
System.out.println(this.getName()+"学乒乓");
}
}
G.乒乓教练
class PpCoach extends PingPongPerson implements Teach{
public PpCoach(String name,int age)
{
super(name,age);
}
@Override
public void teach() {
System.out.println(this.getName()+"教乒乓");
}
}
H.篮球运动员
class BbAthlete extends BasketballPerson implements Learn{
public BbAthlete (String name,int age)
{
super(name, age);
}
@Override
public void learn() {
System.out.println(this.getName()+"学篮球");
}
}
I.篮球教练
class BbCoach extends BasketballPerson implements Teach{
public BbCoach(String name,int age)
{
super(name,age);
}
@Override
public void teach() {
System.out.println(this.getName()+"教篮球");
}
}
J.主函数
public class Main {
public static void main(String[] args) {
PpAthlete a=new PpAthlete("张继科",21);
PpCoach b=new PpCoach("刘国梁",50);
BbAthlete c=new BbAthlete("姚明",30);
BbCoach d=new BbCoach("篮球教练",50);
a.learn();
a.SpeakE();
b.teach();
b.SpeakE();
c.learn();
d.teach();
}
}