day02
类与对象
什么是对象?
一切皆对象,具体的事物
一个人(张三),一只狗(旺财),一只猫(花花)...
什么是类?
具有相同特征和行为的对象的集合,类是抽象的概念
没有实体
人类
狗类
猫类...
类 --- 月饼模子
对象 --- 月饼
类的基本结构(javaBean)
私有的成员变量
空参的构造方法
有参的构造方法
set get方法
其他的业务方法
练习:
创建一个员工类
属性:员工编号 姓名 性别 年龄 薪资 部门
行为:展示员工信息
加薪
写测试类
创建对象 ,调用方法
创建对象的过程,对象的内存结构图
方法
方法的基本结构
public static void main(String[] args) {
方法体
}
a.访问修饰符
public --公有的--只要不出工程都可以访问
protected --保护类型 -- 子类和同一个包内可以访问
默认 -- 同一个包内可以访问
private --私有的 --只有本类可以访问
b.可选修饰符 staitc final native
c.返回值类型
d.方法名
e.形参列表
f.方法体
方法的作用:封装重用的代码,完成特定业务逻辑功能
实参与形参
实参--实际参数---调用环境中的参数
形参--形式参数---方法原型中声明的参数
java中调用方法就是实参向形参赋值过程
继承
什么是继承?
public class Father{ } //父类 超类 基类
public class Child extends Father{//子类 派生类
}
子类继承父类所有的非私有成员,构造方法也不能继承,static修饰的方法不能继承
继承中的构造方法
在调用子类构造方法时,必须首先调用父类的构造方法(编译器强制的)
,目的是初始化父类的成员变量
构造方法
一类特殊的方法
public Dog(...){
}
构造方法与类同名,没返回值,但也不用void修饰
构造方法的作用
Dog dog = new Dog(...);// new 构造方法(...)
创建对象,开辟对象的内存空间,初始化成员变量
多态(同名方法,完成不同的业务功能,展现出多种形态)
(重载与重写)
静态多态
方法的重载
在同一个类中,方法名相同,形参列表不同的两个方法
所谓形参列表不同:
a.参数的个数不同
b.参数类型不同
c.参数类型的顺序不同
在程序的编译器通过参数列表就可以确定要调用那个方法
动态多态
方法的重写
前提条件:继承关系
在子类中创建一个与父类方法同名的方法
这两个方法应该有如下特点:
方法名相同,形参列表相同,返回值类型相同(兼容)
子类方法的访问修饰访问>=父类方法的访问修饰范围
向上造型
父类的引用指向子类的实例
Aniaml dog = new Dog();
Animal cat = new Cat();
dog.eat(); cat.eat();
dog cat 称为上转型对象,上转型对象调用的子类重写父类的方法
而且这种调用时程序运行的时候决定的,所以称为动态多态
static 与 final
static称为静态的,用static修饰的成员属于类,而不是对象
静态成员变量
静态方法
static修饰的方法只能调用本类静态的成员(编译器强制检查)
案例:统计小狗个数
内存结构图
final 修饰变量,变量一旦初始化就不可修改
基本类型:值不可改变
引用类型:对象不可改变,但对象的内容可以修改
final修饰方法,这个方法不能被重写
final修饰类,这个类不能被继承
抽象类与接口
什么是抽象类?
有一些类没有必要实例化,实例化没有意义,它可以封装通用
的业务代码
Animal -- 没有必要实例化
Dog
Cat
Fish ...
抽象类用abstract修饰
抽象方法:用abstract修饰的方法,只有方法的声明,没有方法的实现
在子类中实现抽象方法
一个子类继承抽象类,就必须实现抽象中中声明的所有抽象方法,否则
这个子类也必须声明为抽象类
案例:写Cat类,继承Animal,测试
侧重点在代码重用
什么是接口?
更加纯粹的抽象类,将抽象类中非抽象的因素都剥离了,专注于
顶层设计
接口中只能由两种成员
a. public abstract 修饰的方法
b. public static final 修饰的变量 -->常量
侧重点在设计对象
一个类只能继承一个一般类或者抽象类
但是一个类可以实现多个接口(变相的实现了多继承)
接口可以继承接口,而且是多继承
package demo02;
public class Employee {
//私有的成员变量
private int id;
private String name;
private String sex;
private int age;
private float salary;
private String dept;
//空参的构造方法
public Employee() {
super();
// TODO Auto-generated constructor stub
}
//有参的构造方法
public Employee(int id, String name, String sex, int age, float salary, String dept) {
super();
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
this.salary = salary;
this.dept = dept;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
//展示员工信息
public void printInfo(){
System.out.println(id+","+name+","+sex+","+age+","+salary+","+dept);
}
//加薪
public void addSalary(float salary){
this.salary += salary;
}
}
package demo02;
public class TestEmp {
public static void main(String[] args) {
//创建员工对象
Employee e = new Employee(1, "jack", "男", 23, 12000, "系统开发部");
e.printInfo();
//加薪
e.addSalary(500);
e.printInfo();
}
}
package demo02;
public class Student {
//类的成员
//成员变量 -- 对象的特征
private int id;//学生编号
private String name;//姓名
private String sex;//性别
private int age;//年龄
//空参的构造方法
public Student() {
}
//有参的构造方法
public Student(int id, String name, String sex, int age) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
//set get 方法
//get -- 读方法
public int getId(){ // id属性
return this.id;
}
//set --写方法
public void setId(int id){
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//成员方法 -- 对象的行为
//打印学生的基本信息
public void printInfo(){
System.out.println(id+","+name+","+sex+","+age);
}
}
package demo02;
public class TestStudent {
public static void main(String[] args) {
//创建学生对象
// Student stu = new Student();
Student stu = new Student(1, "tom", "男", 22);
stu.setName("张三");
System.out.println(stu.getName());
stu.printInfo();
}
}
package demo02;
public class Demo01 {
public static void main(String[] args) {
//主方法是调用环境
String msg = "hello world";
printInfo(msg);//实际参数
}
public static void printInfo(String msg){//形式参数
System.out.println(msg);
}
}
package demo02;
public class Demo02 {
/**
* 方法的重载
* @param args
*/
public static void main(String[] args) {
int num = add(1,2);
System.out.println(num);
num = add(1,2,3);
System.out.println(num);
float fnum = add(1.2f,3.6f);
}
//加法
//两个整数相加
public static int add(int a,int b){
return a + b;
}
public static int add(int a,int b,int c){
return a + b +c;
}
public static float add(float a,float b){
return a + b;
}
public static String add(int a,String b){
return a + b;
}
public static String add(String a,int b){
return a + b;
}
}
package demo02;
public class Animal {
private String name;
private int age;
public Animal() {
super();
// TODO Auto-generated constructor stub
}
public Animal(String name, int age) {
super();
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;
}
public void eat() {
System.out.println(this.name + "ÔÚ³Ô¶«Î÷");
}
}
package demo02;
public class Cat extends Animal{
@Override
public void eat() {
System.out.println(getName()+"正在喝鱼汤");
}
}
package demo02;
public class Dog extends Animal{
private static int count;
public Dog() {
count++;
}
@Override
public void eat() {
System.out.println("µÚ"+count+"Ìõ¹·"+getName()+"ÔڿйÇÍ·");
}
}
package demo02;
public class TestDog {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("旺财");
dog.setAge(1);
dog.eat();
Cat cat = new Cat();
cat.setName("花花");
cat.setAge(2);
cat.eat();
System.out.println("---------------------");
//向上造型
Animal dog2 = new Dog();
dog2.setName("小黑");
dog2.setAge(3);
//dog2.eat();
Animal cat2 = new Cat();
cat2.setName("小花花");
cat2.setAge(1);
//cat2.eat();
eat(cat2);
}
//设计一个方法适合所有的调用环境
public static void eat(Animal an){
an.eat();
}
}
package demo02;
public class CountDog {
public static void main(String[] args) {
//统计创建的小狗的数量
Dog dog1 = new Dog();
dog1.setName("旺财");
dog1.setAge(1);
dog1.eat();
Dog dog2 = new Dog();
dog2.setName("小黑");
dog2.setAge(2);
dog2.eat();
}
}