this:理解什么是this代词
类变量/类方法:什么是类变量和类方法
面向对象编程的四大特征:初步理解抽象、封装、继承和多态
this为什么会存在?
java虚拟机给每个对象分配一个this,代表当前对象
注意:this不能在类定义的外部使用 只能在类定义的方法中使用
类变量???静态成员变量???
提出问题:有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在又多少小孩在玩,请用面向对象的思想编程
static int total=0;total是静态成员变量,可以被任何一个对象访问
类变量是该类的所有对象共享的变量,任何一个该类的对象去访问它时取到的都是相同的值,同样任何一个该类的对象去修改它时修改的也是同一个变量
如何定义类变量:访问修饰符 static 数据类型 变量名;
如何访问类变量:类名.类变量名 或者 对象名.类变量名
实例:
public class Demo3_2
{
static int i=1;
//静态区域块 只被执行一次
static
{
i++;
}
public Demo3_2()
{
i++;
}
public static void main(String []args)
{
Demo3_2 test1=new Demo3_2();
System.out.println(test1.i);
Demo3_2 test2=new Demo3_2();
System.out.println(test2.i);
}
}
打印结果:3
4
类方法: 类方法是属于所有对象实例的,其形式如下:
访问修饰符 static 数据返回类型 方法名() {}
注意:类方法中不能访问非静态变量(类变量)
使用:类名.方法名 或者 对象名.方法名
java中的规则:类变量原则上用类方法去访问和操作
若某方法需要所有对象共享的时候 可使用类方法
抽象:我们在定义一个类的时候,实际上是把一类事物共有的属性和行为提取出来,形成一个物理模型(模板),这种研究问题的方法称为抽象
封装:封装就是抽象出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法),才能对数据操作。
---访问控制修饰符:public private和protected。
java提供了四种级别的访问修饰符来控制变量和方法的访问权限
(1)公开级别的:用public修饰,对外公开
(2)受保护级别的:用protected修饰,对子类和同一个包中的类公开
(3)默认级别的:没有修饰符号,向同一个包中的类公开
(4)私有级别的:用private修饰,只有类本身可以访问,不对外公开
包的概念:
包的必要性:
包的三大作用:1.可以区分相同名字的类
2.当类很多时,可以很好的管理类
3.控制访问范围
打包命令: package com.shunping 一般放在类定义的最前面
包名一般要小写
如何引入包?
import 包;引入一个包的目的主要就是使用这个包下面的类
继承:为什么要继承?
解决之道:
继承可以解决代码复用,让我们的编程更加靠近人类的思维,当多个存在相同的属性和方式,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法
所有的子类不需要定义这些相同的属性和方法,只需要extends语句来声明继承父类
class 子类 extends 父类
这样子类就会自动拥有父类的属性和方法
继承:深入讨论
1、父类的那些属性和方法被子类在继承了?并不是父类的所有属性和方法都可以被继承
结论:父类的public属性和方法,protected属性和方法,默认修饰符的属性和方法都可以被子类继承,
而只有private属性修饰的属性和方法不能被子类继承
编程中如果希望子类不继承某个属性或方法就将其声明为private
注意事项:
1、子类最多只能继承一个父类
2、java所有的类都是Object类的子类
3、JDK6中有202个包,3777个类、接口、异常、枚举、注释和错误。
4、在做开发的时候强烈建议大家多查JDK的帮助文档
5、在使用类的时候,是在不知道怎么用就goole
方法重载:
简单的说方法重载就是类的同一种功能的多种实现方式,到底采用哪种实现方式取决于调用者给出的具体参数
注意事项:
1、方法名称相同
2、方法的参数类型、个数、顺序至少有一个不同
3、方法的返回类型也可以不同
4、方法的访问修饰符可以不同
思考:如果只是方法的返回类型不一样能否构成方法重载? 答案:不可以
同理如果只是访问修饰符不同也不可以构成方法重载。
方法覆盖:如何解决子类和父类的方法的异同的问题?
子类的方法重定义覆盖父类中的方法。
概念:方法覆盖就是子类有一个方法和父类的某个方法的名称、返回类型、参数一样,那么我们就说子类的这个方法
覆盖了父类中的那个方法
注意事项:
1、子类的方法的返回类型、参数和方法名称要和父类的方法的返回类型、参数和方法名称必须相同,否则就不是方法覆盖
2、子类的方法不能缩小父类的方法的访问权限
多态:就是指一个引用在不同情况下的多种状态。也可以这样理解:多态是通过指向父类的指针,来调用在不同的子类中所实现的方法
注意事项:
1、java中允许父类引用变量引用它的子类的实例
2、类型转换还有一些具体的细节,稍后介绍
抽象类:用abstract关键字修饰的类就是抽象类
为什么需要抽象类?
父类方法的不确定性
当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法【抽象方法】,用abstract来修饰该类【抽象类】.
abstract class Animal
{
int age;
String name;
abstract public void cry();
}
抽象类依然可以被继承,当一个类继承的类是抽象类时,需要程序员将抽象类中的所有抽象方法实现出来。
class Cat extends Animal
{
int age;
String name;
//实现父类的cry方法
public void cry()
{
System.out.println("旺旺叫!");
}
}
抽象方法在实际编程中用的不是很多,但是面试时问的会比较多
注意事项:
1、抽象类不能被实例化
2、抽象类不一定要包含抽象方法,也就是说抽象类可以没有抽象方法。
3、一旦一个类包含了抽象方法,那么这个类就必须声明为抽象类。
4、抽象方法不能有主体。
5、抽象类中可以存在已经实现的方法。
接口:为什么会有接口?
接口就是给出一些没有内容的方法,封装到一起,到某个类要使用的时候再根据具体的情况把这些方法再写出来。
class 类名 implements 接口
{
变量;
方法;
}
思考:举例说明接口如何实现了多态?
interface Usb
{
int a=1;
//声明了两个方法
public void start();
public void stop();
}
//编写了一个照相机类 实现usb接口
//一个重要的原则:当一个类实现了一个接口,该类需要显示那个接口的所有方法,不能只实现其中的一部分方法
class Camera implements Usb
{
public void start()
{
System.out.println("我是相机,我开始工作了!")
}
public void stop()
{
System.out.println("我是相机,我停止工作了!")
}
}
//编写了一个电话类,也实现了Usb接口
class Phone implements Usb
{
public void start()
{
System.out.println("我是电话,我开始工作了!")
}
public void stop()
{
System.out.println("我是电话,我停止工作了!")
}
}
class Computer
{
//开始使用Usb接口
public void useUsb(Usb usb)
{
usb.start();
usb.stop();
}
}
public class Demo4_2
{
public static void main(String[] args)
{
Computer computer1 =new Computer();
Camera camera1 =new Camera();
Phone phone1 =new Phone();
computer.useUsb(Camera1);
computer.useUsb(phone1);
}
}
接口注意事项:
1、接口不能被实例化
2、接口中所有的方法都不能有主体,接口中不能存在已经实现的方法。
3、一个类可以实现多个接口
4、接口中可以有变量,但是变量不能用private或者protected修饰
---接口中的变量本质上都是static的,而且是final的,不管你加不加static修饰
---在java开发中,我们经常把经常使用的定义在接口中,作为全局变量使用。访问方法:接口名.变量名
5、一个接口并不能继承其他的类,但是可以继承其他的接口
小结:接口是更加抽象的类,抽象类里的方法可以有方法体,接口里的所有方法都没有方法体。
接口体现了程序设计的多态和高内聚低耦合的设计思想。