Java SE学习笔记(二)——面向对象程序设计

本文介绍了Java SE的面向对象编程,包括类与对象的概念,封装的定义与方法,成员变量,命名约定,引用类型与方法参数传递,构造方法,方法重载,继承及其特点,多态的原理与应用。详细探讨了Java中类、对象、继承、多态等核心概念。
摘要由CSDN通过智能技术生成

本章节学习Java SE面向对象编程

1、面向对象程序设计(Object Oriented Programming,OOP;Object Oriented Design,OOD)。在面向对象设计的程序中有两个非常重要的概念:类(class)与对象(Object)。

A、类:类是一种抽象的概念,类包含数据(通常用名词来表示,比如属性Property、Attribute或者成员变量Member Variable)与对数据的操作(通常用动词来表示,比如方法method)。

B、对象:是一种具体的概念,是类的一种具体表示方式;比如人是一个类,张三、王五就是人这个类具体的对象。

C、面向程序设计三大基本特征:继承(Inheritence)、封装(Encapsulation)、多态(Polymorphism)

2、面向对象之——封装(Inside Object Oriented Programming)

A、什么是封装:类包含了数据与方法,将数据与方法放在一个类中就构成了封装。

B、类的定义:修饰符 class 类名 {   //类的内容,包含类的方法与属性 };实例化:类名 变量=new 类名() ;

C、方法的定义:修饰符 返回类型 方法名([参数1],[参数2]....){   //方法体};main方法是整个java程序的入口点,如果没有main方法,则程序无法执行的;方法只能定义在类中,不能嵌套;C++可以在类外单独定义方法;如果方法不返回值用void或者return(后面没有任何值);

D、成员变量:类中的属性又叫成员变量(member variable),属性用英文property或者attribute表示;定义在类里面的属性叫成员变量,定义在方法里面的变量叫局部变量。二者区别如下:局部变量与局部变量使用前都必须声明,前者还必须赋予初值,后者不必须赋予初值,默认会有一个值byte、short、long=0,float、double=0.0,char='\u0000',boolean=false;

F、命名约定

     类命名:首字母大写,如果多个字母单词构成那么首字母都大写,即驼峰法,同时要求不使用任何连接符。

     方法命名:首字吧母小写,多个单词组成,首字母单词小写,第二个单词开始首字母大写,eg:addThreeInt()

     属性命名:与方法命名约定完全一样;eg:ageOfPerson。

3、引用类型(reference type)与方法参数传递

A、引用类型(reference type):引用类型是用在对象上的。一个对象可以被多个引用所指向,但同一时刻,每个引用只能指向一个对象。如果一个对象对多个引用所指向,那么无论哪个引用对象的属性进行了修改,都会反映到其他的引用当中。

  举例:Class People{   public age=20; ....    public change(People p){  p.age=30;}    ...} 

   People p1=new People();//new People()在堆heap上生成一个对象people,People p1在内存栈stack上生成一个变量p1,通过“等于号”,将栈中的引用类型p1,指向heap中的对象people,因此说p1是一个引用类型,他引用的是栈中的值。

   p.1change(p1)//change方法接受一个指向堆heap对象people的引用类型p1,change方法中的p作为引用类型,也被指向了stack栈中的对象;此时存在两个引用类型:p1与change方法中的p,p1与p同时指向stack中一个对象,无论谁改变了age都会改变stack中的对象,而所有指向stack的引用对象都会改变,即p与p1都被改变了。

B、关于方法传递参数的总结:对于java中方法参数的传递,无论传递的是原生数据类型还是引用类型,统一是传值。如果是引用类型,传递的是引用对象的地址(也是一个值)的值。

4、构造方法

构造方法(Constructor):构造方法用于完成对象属性的初始化工作;构造方法的名字必须与类名一致,没有返回值;没有定义构造方法的类,java编译器会添加一个默认方法体为空的构造方法;new关键字完成三件事:为对象开辟内存空间,调用类的构造方法,将生成对象的地址返回。

5、方法重载(Overload)

A、在一个类中有两个或者多个方法名字相同,但方法的参数不同(个数或者类型不同),这种形式叫做重载。注意:不能用返回值作为重载的定义,java编译器会通不过。

B、构造方法重载,可以定义多个参数不一样的构造方法,构造方法使用时只需要看参数即可;在一个构造方法中调用另外一个构造方法用this即可,eg:this(参数1,参数2,...) //参数为目标构造方法的参数。注意:在构造方法中使用this时,必须要放在第一行可执行代码,this之前不能有任何可执行的代码。

6、继承(Inheritence)

A、java是单继承的,意味着一个类只能从另一个类继承(被继承的类称为父类或者基类base class,继承的类叫子类),java中的继承使用关键字extends关键字。

B、构造方法重载:

1)先调用父类不带参数的构造方法(如果没有会报错),生成父类对象,再调用子类的构造方法,生成子类对象,即想要生成子类对象,首先要生成父类对象,没有父类就没有子类;

2)如果想要改变默认调用不带参数的构造方法,用super; super表示对父类对象的引用,调用父类对应构造参数的方法;

3)与this一样,也必须要作为构造方法的第一条语句,具体用法如下:

public class Child extends Parent
 {
    public Child(){
        super(1);   //通过super改变java默认调用父类不带参数构造函数;如果没有本句会报错
        System.out.println("child");
    }

    public static void main(String[] args) 
    {
        Child c= new Child();
        System.out.println("Hello World!");
    }
}

class  Parent
{
    public Parent(int a){
        System.out.println("parent");
    } 
}

C、继承的三个特点:1)父类有的,子类也有;2)父类没有的,子类可以增加属性;3)父类有的,子类可以改变它;

D、继承注意事项总结:

1)构造方法不能被继承;方法和属性可以被继承;

2)子类构造方法隐式的调用父类的不带参数的方法;子类需要用super来显式的调用父类的构造方法,super指的是对父类的引用;super必须第一行。

F、方法重写(override):在继承中,子类有和父类返回类型、方法名称、参数完全一样,子类与父类的关系叫重写。如果此时一定要调用父类的方法,同样利用super.方法名;这里是普通方法,不必像构造方法调用放在第一行。

E、java中定义一个类的时候,如果没有显式的指定父类,那么该类会继承于java.lang.Object(是所有类的根类)

7、多态(Polymorphism)

A、多态指父类型的引用可以执行子类的对象,比如:Parent p=new Child();// Parent对象p指向一个Child对象,因此会执行子类的方法(这个方法可以是子类自己独有的方法或者继承来的方法);

B、注意:对于子类方法把父类方法重写时,同样指向谁,调用谁的方法;而且如果此时执行一个p不存在的方法编译会报错。易错点:这里调用方法会执行Child的方法(以为对象指向Child),但是这个方法Parent必须存在(因为p的确又是一个Parent,不可能执行一个Parent不存在的方法)。

class PolyTest
{
	public static void main(String[] args) 
	{
	
		Parent p=new Child();
		p.sing(); //输出结果Child sing,指向谁输出谁,这里p指向一个Child
	}
}
 public class Child extends Parent
{
    
	public void sing(){ 
		System.out.println("Child sing");
	}
}
class  Parent
{
    /*注意非常易错点
       注意,虽然最终输出的是Child sing,但是如果注释次方法编译会报错: 找不到p.sing();
       从逻辑上也容易理解,虽然p指向Child,但毕竟是个Parent,如果parent没有sing()方法,而自己p却    
       可以sing,从逻辑上也是说不通的。
    */
	public void sing(){
		System.out.println("Parent sging");
	}
}

C、强制类型转换一共分两种(这里假设Animal会父类,Cat为子类,Cat继承自Animal):

1)向上类型转换(upcast):将Cat类型转换为Animal类型,即将子类型转换为父类型。对于向上类型,不需要显式指定。eg:Animal a= cat;//直接将一个cat赋值给Animal即可;

2)向下类型转换(downcast):将Animal转换为Cat类型,即将父类型转换为子类型。对于向下类型转换,必须要强制类型转换。eg: Cat cat=(Cat) a;//同时这里要求a必须指向一个Cat,即 a=new Cat();这种方式。如果a=new Animal();编译可以通过,执行会报错“不能报Animal强制转换成一个Cat”,这里也容易理解Animal也可能是其他动物,并不一定是Cat。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值