二、类——自己定义的类型,用于实现某个功能
2.1、类的定义:类名一般开头字母大写,中间大小写混合
/**//*
**类的定义
*/
class MyDate...{
//类名通常首字母大写,中间大小写混合
int year, month, day;
}
/**//*
**类的定义
*/
class MyDate...{
//类名通常首字母大写,中间大小写混合
int year, month, day;
}
**类的定义
*/
class MyDate...{
//类名通常首字母大写,中间大小写混合
int year, month, day;
}
2.2、方法——把类中一些频繁使用的语句起个名字,方便直接调用
方法的定义: 方法名一般开头字母小写,中间大小写混合
2.3.1构造器的重载
根据不同的参数来区分;同一类中使用多个构造器来代表不同的初始化过程
/**//*
**通过this参考传入对象
*/
class MyPoint...{
int x, y;
double getDistance(MyLine line)...{//计算点到线的垂直距离
// double x = ..... 计算点(x, y)到线line的距离
return(x);
}
}
class MyLine...{
Point p1, p2;
public void pass(Point p)...{//计算该线是否近似穿过点
double h = p.getDistance(this);
if(h < 0.2)...{
System.out.println("该线近似穿过点")
}
}
}
//主程序片段
MyPoint p1 = new MyPoint();
MyLine l = new MyLine();
......
l.pass(p1);//这时会执行getDistance(this)语句,此时this表示l
**通过this参考传入对象
*/
class MyPoint...{
int x, y;
double getDistance(MyLine line)...{//计算点到线的垂直距离
// double x = ..... 计算点(x, y)到线line的距离
return(x);
}
}
class MyLine...{
Point p1, p2;
public void pass(Point p)...{//计算该线是否近似穿过点
double h = p.getDistance(this);
if(h < 0.2)...{
System.out.println("该线近似穿过点")
}
}
}
//主程序片段
MyPoint p1 = new MyPoint();
MyLine l = new MyLine();
......
l.pass(p1);//这时会执行getDistance(this)语句,此时this表示l
2.5、继承
2.5.1、使用:class 子类 extends 父类
父类中的方法和成员变量在子类中都不需要重复定义就可以直接使用
2.5.4变量的多态
一个类型为X的变量,其指向对象的类型即可以是X也可以是X的子类
但是访问成员变量还是由变量类型指定的,如父类类型的对象不能访问子类的成员变量
2.5.4.1用于异类搜索
2.5.4.3类型判断——instanceof操作符
/**//*
**变量多态--类型判断--instanceof操作符
*/
class Show...{
void showinfo(Employee e)...{
System.out.println(e.name);
if(e instanceof Manager)...{
System.out.println("It is Manager");
}
}
public static void main(String ejing[])...{
Show s = new Show();
Employee e = new Employee();
Manager m = new Manager();
e.name = "bob";
m.name = "Smith";
s.showinfo(e);//只显示name
s.showinfo(m);//显示name和It is Manager
}
}
**变量多态--类型判断--instanceof操作符
*/
class Show...{
void showinfo(Employee e)...{
System.out.println(e.name);
if(e instanceof Manager)...{
System.out.println("It is Manager");
}
}
public static void main(String ejing[])...{
Show s = new Show();
Employee e = new Employee();
Manager m = new Manager();
e.name = "bob";
m.name = "Smith";
s.showinfo(e);//只显示name
s.showinfo(m);//显示name和It is Manager
}
}
2.5.4.4类型转换——Cast
语法:(转换后的类型) 转换前的类型
如:当父类对象要使用子类的成员变量时,把父类对象转换为子类对象
子类转换为父类自动进行
只有当父类创建了个子类类型的对象时,把父类显示转换为子类对象编译和运行才正确,否则编译通过,运行也同样出现异常
/**//*
**变量多态--类型转换--Cast
*/
Manager m;
Employee e = new Manager();//父类创建子类类型的对象
m = (Manager)e;//把父类显示转换为子类
**变量多态--类型转换--Cast
*/
Manager m;
Employee e = new Manager();//父类创建子类类型的对象
m = (Manager)e;//把父类显示转换为子类
2.5.4.5变量多态和方法的执行
Employee x[] = new Employee[3];
x[0] = new Employee();
x[1] = new Employee();
x[2] = new Manager();//数组中存放的对象既可以是Employee类型,也可以是它的子类Manager类型
x[0] = new Employee();
x[1] = new Employee();
x[2] = new Manager();//数组中存放的对象既可以是Employee类型,也可以是它的子类Manager类型
2.5.4.2用于方法参数
/**//*
**继承
*/
class Employee...{//雇员类,每个雇员都有一个姓名
String name;
void showinfo()...{
System.out.println(name);
}
}
/**//*
class Manager{//管理者类,管理者也是雇员,同时还新增一个部门属性
String name;
String department;
//但是这样定义,代码冗余,而且维护不方便,如:还需要增加编号,就得2个类都去更改
}
*/
//因此,我们用继承来定义
class Manager extends Employee...{
String department;
}
//尽管Manger类没有定义name属性,但是通过继承,实际上有name属性
Manager x= new Manager();
x.name = "Smith";
x.showinfo();
**继承
*/
class Employee...{//雇员类,每个雇员都有一个姓名
String name;
void showinfo()...{
System.out.println(name);
}
}
/**//*
class Manager{//管理者类,管理者也是雇员,同时还新增一个部门属性
String name;
String department;
//但是这样定义,代码冗余,而且维护不方便,如:还需要增加编号,就得2个类都去更改
}
*/
//因此,我们用继承来定义
class Manager extends Employee...{
String department;
}
//尽管Manger类没有定义name属性,但是通过继承,实际上有name属性
Manager x= new Manager();
x.name = "Smith";
x.showinfo();
2.5.2、方法的覆盖(也叫方法的重写)
在子类中将父类的方法重新写一遍,在子类中,父类的方法就好象不存在一样(被覆盖了)
方法覆盖规则:子类的方法必须和父类的名称、参数(参数不同就不是覆盖)、返回值都相同;子类方法不能比父类方法更难访问(如:父类方法是public,子类方法就不能是private);子类方法不能声明抛出更多的异常(子类方法不抛出异常,或者抛出的异常是父类方法异常的子类,或者和父类方法异常一样)。
/**//*
**继承中的方法的覆盖
**在子类中将父类的方法重新写一遍,子类中,父类的方法就好象不存在了(被覆盖了)
*/
class Employee...{
String name;
void showinfo()...{
System.out.println(name);
}
void tt()...{
showinfo();
}
}
class Manager extends Employee...{
String department;
void showinfo()...{
System.out.println(name);
System.out.println(department);
}
**继承中的方法的覆盖
**在子类中将父类的方法重新写一遍,子类中,父类的方法就好象不存在了(被覆盖了)
*/
class Employee...{
String name;
void showinfo()...{
System.out.println(name);
}
void tt()...{
showinfo();
}
}
class Manager extends Employee...{
String department;
void showinfo()...{
System.out.println(name);
System.out.println(department);
}