JavaSE:面向对象

1、面向对象

面向对象是基于面向过程的编程思想。
面向对象的思想特点:

  • 是一种更符合我们思考习惯的思想
  • 把复杂的事情简单化
  • 让我们从执行者变成了指挥者

Java程序的开发,设计和特征

  • 开发:就是不断的创建对象,通过对象调用功能
  • 设计:就是管理和维护对象间的关系
  • 特征:封装,继承,多态

2、类定义

Java语言中最基本的单位是类。所以,我们要用类来体现事物,事物由属性(事物的描述)、行为(事物功能)组成
类:是一组相关的属性和行为的集合
类是一个不存在的,虚拟的,对象是是实实在在存在的

如何定义类

[修饰符] class 类名{
}
成员变量(事物属性):在类中,方法外
成员方法(事物行为)

对象:是该类事物的具体存在,是一个具体的实例。比如 学生:类 ;班长:具体对象
创建对象并使用格式:

类名 对象名 =  new 类名();
public class Phone {
	String brand;
	int price;
	String color;
	//打电话的方法
	public void call(String name) {
		System.out.println("给"+name+"打电话");
	}
}

public class PhoneDemo {
	public static void main(String[] args) {
		//创建手机对象
		//类名 对象名 = new 类名();
		Phone p=new Phone();
		p.call("张三"); //给张三打电话

		p.brand="huawei";
		p.price=3000;
		p.color="白色";
		System.out.println(p.brand+"---"+p.price+"---"+p.color);//huawei---3000---白色
	}
}	

3、成员变量和局部变量

区别:

  • 作用域 局部变量只能在类的方法中定义
  • 成员变量可以没有初始值,局部变量必须有
  • 变量同名,局部变量优先级更高
A:在类中的位置不同
	成员变量:在类中,方法外
	局部变量:在方法定义中或者方法声明上
B:在内存中的位置不同
	成员变量:在堆内存
	局部变量:在栈内存
C:生命周期不同
	成员变量:随着对象的创建而存在,随着对象的消失而消失
	局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
D:初始化值不同
	成员变量:有默认初始化值
	局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
	
注意事项:
	局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
	为了解决这一问题,引用了this关键字

this关键字:
代表当前类的引用对象
哪个对象调用方法,该方法内部的this就代表那个对象
解决了局部变量隐藏成员变量的问题
	
定义一个类
public static class Var{
    int num=10;
    public void  show(int num){
        System.out.println(num);
        System.out.println(this.num);
        this.num=num;
        System.out.println(num);
    }
}

main方法中:
Var v = new Var();
System.out.println(v.num);	//10,调用对象成员变量
v.show(20);		
输出结果:
System.out.println(num); //20,就近原则,取局部变量值
System.out.println(this.num); //10,this指明调用的是成员变量
System.out.println(num); //20,this.num=num;局部变量的值重新赋值给了成员变量
	

3.1static 成员变量

变量   静态成员变量 是类所有的,不是某一个对象所有的 
方法    普通方法可以调用静态方法,反过来是不行的
代码块   比构造方法还要早,在类加载的时候执行,而且执行一次,就是在类加载的时候

4、形参和匿名

如果你看到一个方法需要的参数是一个类名,就应该知道这里实际需要的是一个具体的对象。

class Student{
	public void show(){
		System.out.println("我爱学习");
	}
}
class StudentDemo{
	public void method(Student s){ //形参是类名,其实是需要的一个具体对象
		s.show();
	}
}

public class NoNameDemo {
	public static void main(String[] args) {
		Student s=new Student();
		StudentDemo sd=new StudentDemo();
		sd.method(s);
		sd.method(new Student());
		
		//匿名对象调用
		new StudentDemo().method(new Student());
		
	}
}

注意:
匿名对象调用:没有名字的对象;仅仅只调用一次的时候;可以作为实际参数传递

5、构造

作用:用于对对象的数据进行初始化
格式:

A:方法名和类名相同
B:没有返回值类型,连void都不能有
C:没有返回值
D.可以有多个构造方法,重载

注意事项:
如果我们没写构造方法,系统将提供一个默认的无参构造方法
如果我们给出了构造方法,系统将不再提供默认构造方法,这个时候,我们要使用无参构造方法,就必须自己给出。
推荐:永远手动自己给出无参构造方法。

标准案例,get,set


public class Student {
    private String name;
    private  int  age;
    public Student(){  //无参构造
        super();
    }

    public  Student(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 String toString(){
        return "Student [name=" + name + ", age=" + age + "]";
    }
}
public class StudentDemo {
	public static void main(String[] args) {
		Student s=new Student("feifei",23);  //初始化时,使用带参构造方法
		String s1=s.toString();
		System.out.println(s1);
		
		System.out.println(s.getName()+"--"+s.getAge());
	}
}

6、关键字

this关键字

当前对象,谁调用,this(对象)就是谁.

main关键字

 main方法的格式讲解:
	public static void main(String[] args) {}
	
	public:公共的,访问权限是最大的。由于main方法是被jvm调用,所以权限要够大。
	static:静态的,不需要创建对象,通过类名就可以。方便jvm的调用。
	void:方法的返回值是返回给调用者
	main:是一个常见的方法入口。
	String[] args:这是一个字符串数组。默认参数
			这个东西早期是为了接收键盘录入的数据的。
			格式是:java MainDemo hello world java		
					
static特点:
	静态的,不需要创建对象,通过类名就可以。就是说不需要new,直接调用类中的方法。
	随着类的加载而加载,优先于对象存在
	静态方法只能访问静态的成员变量和静态的成员方法
如:	
class Teacher{
	public int num=10;
	public static int num2=20;
	
	public void show(){
		System.out.println(num);
	}
	
	public static void method(){
		System.out.println(num2);//无法访问num,静态只能被静态调用
	}
}
public class MainDemo {
	public static void main(String[] args) {
		//创建对象
		Teacher t = new Teacher();
		t.show();
		System.out.println("------------");
		Teacher.method(); //这里是直接调用类中的方法,没有new对象
	}
}

final关键字

 final可以修饰类,方法,变量
	特点:
		final可以修饰类,该类不能被继承。
		final可以修饰方法,该方法不能被重写。(覆盖,复写)
		final可以修饰变量,该变量不能被重新赋值,值无法再改变。因为这个变量其实常量。
		
	常量:
		A:字面值常量
			"hello",10,true
		B:自定义常量
			final int x = 10;

super关键字

7、封装

把不想让外界知道的实现细节给隐藏起来,提供公共的访问方式
提高代码的安全性
提高代码的复用性
使用private关键字修饰

private关键字:
私有的意义,可以修饰成员变量和成员方法
被private修饰的后的成员只能在本类中被访问

class Demo{
	private int num=10;
	public void show(){
		System.out.println(num);
	}
}

public class PrivateDemo {
	public static void main(String[] args) {
		Demo d=new Demo();
		d.show();
		//System.out.println(d.num); //这里就无法调用成员变量num
	}
}

8、继承

继承概述:
		把多个类中相同的内容给提取出来定义到一个类中。
		Java提供了关键字:extends
		格式:class 子类名 extends 父类名 {}
	
好处:
		A:提高了代码的复用性
		B:提高了代码的维护性
		C:让类与类之间产生了关系,是多态的前提
	
类与类产生了关系,其实也是继承的一个弊端:
		类的耦合性增强了。
		开发的原则:低耦合,高内聚。
		耦合:类与类的关系
		内聚:就是自己完成某件事情的能力
		
Java中继承的特点:
		A:Java只支持单继承,不支持多继承。
			有些语言是支持多继承,格式:extends 类1,类2,...
		B:Java支持多层继承(继承体系)
		
继承的注意事项:
		A:子类只能继承父类所有非私有的成员(成员方法和成员变量)
		B:子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。
		
继承中成员变量的关系:
		A:子类中的成员变量和父类中的成员变量名称不一样,这个没啥好说的。
		B:子类中的成员变量和父类中的成员变量名称一样
			在子类方法中访问一个变量的查找顺序:
				a:在子类方法的局部范围找,有就使用
				b:在子类的成员范围找,有就使用
				c:在父类的成员范围找,有就使用
				d:如果还找不到,就报错。
				
this和super的区别:
		this代表本类对应的引用。
		super代表父类存储空间的标识(可以理解为父类引用,可以操作父类的成员)
			A:调用成员变量
				this.成员变量 调用本类的成员变量
				super.成员变量 调用父类的成员变量
			B:调用构造方法
				this(...)	调用本类的构造方法
				super(...)	调用父类的构造方法
			C:调用成员方法
				this.成员方法 调用本类的成员方法
				super.成员方法 调用父类的成员方法
	
继承中构造方法的关系:
		子类中所有的构造方法默认都会访问父类中空参数的构造方法
		子类初始化之前,一定要先完成父类数据的初始化。
		子类每一个构造方法的第一条语句默认都是:super();
		
方法重写Override:子类中出现了和父类中方法声明一模一样的方法。
方法重写的应用:
		当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。
		这样,即沿袭了父类的功能,又定义了子类特有的内容。
		注意:子类重写父类方法时,访问权限不能更低
			父类静态方法,子类也必须通过静态方法进行重写

方法重载Overload:(前面的知识)		
在同一个类中,方法名相同,参数列表不同。与返回值无关,可以改变返回值的类型
//多层继承
class GrandFather {
	public void show() {
		System.out.println("我是爷爷");
	}
}
class Father extends GrandFather {
	private int num=10;
	private void showf(){
		System.out.println(num);
	}
	public void method(){
		System.out.println("我是老子");
		showf();  
	}
}
class Son extends Father {
	public int num2=30;
	public Son(){
		super();
		System.out.println("Son无参构造");
	}
	public Son(String name){
		super();
		System.out.println("Son的带参构造"+name);
	}
	
	public void function(){
		int num2=40;
		//System.out.println(num); //子类不能继承父类的私有成员变量
		System.out.println(num2);//40,优先使用局部变量
		System.out.println(this.num2);//20,this调用本类成员变量
		System.out.println(super.num2);//10,super调用父类成员变量	
	}
	
	public void method(){
		super.method(); //father的方法
		System.out.println("son特有功能");
	}
}
public class ExtendsDemo {
	public static void main(String[] args) {
		Son son=new Son();
		new Son("name");//匿名带参构造
		son.method();
		son.show();
		son.function();
	}
}

9、多态

多态:同一个对象(事物),在不同时刻体现出来的不同状态。例如:水(液体,固体,气态)。
多态就是父类使用子类的重写方法,如要使用父类本身的方法,就必须要新建一个父类对象;如果要使用子类特有的成员变量和方法,就必须向下转型。

多态的前提:
	A:要有继承关系。
	B:要有方法重写。
			动物 d = new 猫();
			d.show();
			动物 d = new 狗();
			d.show();
	C:要有父类引用指向子类对象。
		父 f =  new 子();
			
多态中的成员访问特点:
	A:成员变量
		编译看左边,运行看左边。
	B:构造方法
		创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
	C:成员方法
		编译看左边,运行看右边
	D:静态方法
		编译看左边,运行看左边。
		(静态和类相关,算不上重写,可以直接通过类名访问成员方法,所以,访问还是左边的)
	由于成员方法存在方法重写,所以它运行看右边。
	
对象间的转型问题:(从右往左念)
	向上转型:(子类的对象赋值给父类)
		Fu f = new Zi();
	向下转型:(父类强制转换成子类并且把对象赋值给子类)
		Fu f = new Zi();
		Zi z = (Zi)f; //要求该f必须是能够转换为Zi的。
class Fu {
	public int num = 100;
	public void show() {
		System.out.println("show Fu");
	}
	public static void function() {
		System.out.println("function Fu");
	}
}
class Zi extends Fu {
	public int num = 1000;
	public int num2 = 200;
	public void showfu(){
		super.show();
	}
	public void show() {
		System.out.println("show Zi");
	}
	public void method() {
		System.out.println("method zi");
	}
	public static void function() {
		System.out.println("function Zi");
	}
}
public class DuoTaiDemo {
	public static void main(String[] args) {
		//要有父类引用指向子类对象。
		Fu f = new Zi();
		System.out.println(f.num);//100,访问成员变量,看左边,左边是父;编译看左边,运行看左边
		//子类重写了父类的show方法,相当于有多种形态,符合多态特征
		f.show(); //访问成员方法,编译看左边,运行看右边,所以这里的结果是子的show()
		f.function();//静态方法 编译和运行看左边
		//多态弊端:不能访问子类特有得成员变量和成员方法
		//找不到符号
		//System.out.println(f.num2);
		//找不到符号
		//f.method();
		
		Zi z=(Zi)f;//所以只能向下转型,才能使用子类的特有成员
		System.out.println(z.num2);
		z.method();
		
		//子要使用父类被重写的方法,可以在子类super父类被重写的方法
		z.showfu();	
	}
}

10、抽象类

抽象类的概述:
		动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的。
		我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须是抽象类。
		
抽象类的特点:
		A:抽象类和抽象方法必须用abstract关键字修饰
		B:抽象类中不一定有抽象方法,但是有抽象方法的类必须定义为抽象类
		C:抽象类不能实例化,因为它不是具体的。
			抽象类有构造方法,但是不能实例化,用于子类访问父类数据的初始化
		D:抽象的子类
			a:如果不想重写抽象方法,该子类是一个抽象类。
			b:重写所有的抽象方法,这个时候子类是一个具体的类。
			
抽象类的实例化其实是靠具体的子类实现的。是多态的方式。
			Animal a = new Cat();
abstract class Animal{
	public abstract void eat(); //抽象类不能被实力化,没有方法体
	public Animal(){
		//抽象类中不一定都是抽象类
	}
	public void method(){
		System.out.println("method");
	}
}
class Cat extends Animal{
	public void eat(){
		System.out.println("猫吃鱼");
	}
}
public class AbstractDemo {
	public static void main(String[] args) {
		Animal a=new Cat();
		a.eat();
		a.method();
	}
}

11、接口

他定义了一批类必须遵循的规范.他也不关心实现细节

[修饰符] interface 接口名 [extends 父接口1,父接口2]
{
	[常量定义]
	[方法定义]
}
接口的特点:
		A:接口用关键字interface表示	
			interface 接口名 {}
		B:类实现接口用implements表示
			class 类名 implements 接口名 {}
		C:接口不能实例化
			按照多态的方式来实例化。
		D:接口的子类
			a:可以是抽象类。但是意义不大。
			b:可以是具体类。要重写接口中的所有抽象方法。(推荐方案)
			强制具体类实现接口所有方法,子类方法可以是继承关系,父子类分担接口中的方法
	
	由此可见:
		A:具体类多态(几乎没有)
		B:抽象类多态(常用)
		C:接口多态(最常用)
		
	接口成员特点
		成员变量;只能是常量,并且是静态的。
				默认修饰符:public static final
				建议:自己手动给出。
		构造方法:接口没有构造方法。
		成员方法:只能是抽象方法。
				默认修饰符:public abstract
				建议:自己手动给出。
		
	所有的类都默认继承自一个类:Object。
	类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。
	
	类与类:
		继承关系,只能单继承,可以多层继承。
	类与接口:
		实现关系,可以单实现,也可以多实现。
		并且还可以在继承一个类的同时实现多个接口。
	接口与接口:
		继承关系,可以单继承,也可以多继承。
		
	抽象类和接口的区别:
		A:成员区别
			抽象类:
				成员变量:可以变量,也可以常量
				构造方法:有
				成员方法:可以抽象,也可以非抽象
			接口:
				成员变量:只可以常量
				成员方法:只可以抽象
				
		B:关系区别
			类与类
				继承,单继承
			类与接口
				实现,单实现,多实现
			接口与接口
				继承,单继承,多继承
				
		C:设计理念区别
			抽象类 被继承体现的是:”is a”的关系。抽象类中定义的是该继承体系的共性功能。
			接口 被实现体现的是:”like a”的关系。接口中定义的是该继承体系的扩展功能。
interface AnimalTrain{
	//成员变量只能是常量,且默认是静态的
	int num=10;
	//省略的部分
	public static final int num1=20;
	//成员方法只能是抽象方法
	public  void jump(); //默认修饰符public abstract
	public abstract void sleep();
	public abstract void eat();
}
class Animal{
	public void eat() { 
		System.out.println("eat");
	}
	public void sleep() {
		System.out.println("sleep");
	}
}
class Cat extends Animal implements AnimalTrain{
	public void jump(){//重写接口中的方法
		System.out.println("猫可以跳高"); 
	}
}

public class InterfaceDemo {
	public static void main(String[] args) {
		Cat c=new Cat();
		c.jump();  //调用的是接口被重写的方法
		c.sleep(); //继承Animal的方法
		c.eat();  //继承Animal的方法
		
//多态实现,强制具体类实现接口所有方法,子类方法可以是继承关系,父和子类可以分担,重写接口中的方法
		AnimalTrain at =new Cat();
			at.jump();
			at.sleep();
			at.eat();
	}
}

12、包

其实就是文件夹
不同文件下是可以创建相同的类名的 a/b/c/d a.b.c.d 规范:公司网站 倒过来写
区分同名的类
对类进行分类管理
包的定义:package 包名; 多级包用.分开
导包:import 包名…类名;

13、权限修饰符

权限修饰符
			本类	同包不同类		同包子类		不同包下类	不同包下子类
private		Y						
默认		Y			Y			Y
protected	Y			Y			Y						Y
public		Y			Y			Y			 Y		    Y
分类:
		权限修饰符:private,默认,protected,public
		状态修饰符:static,final
		抽象修饰符:abstract
常见的类及其组成的修饰
类:
	默认,public,final,abstract
	常用的:public
成员变量:
	private,默认,protected,public,static,final
	常用的:private
构造方法:
	private,默认,protected,public
	常用的:public
成员方法:
	private,默认,protected,public,static,final,abstract
	常用的:public                               
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值