java面向对象语法大全_Java学习笔记05:Java基本语法面向对象

目录:

初识面向对象

方法回顾和加深

对象的创建和分析

面向对象的三大特性

抽象类和接口

内部类及OOP实战

初识面向对象

面向对象思想

物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考,最后,才对某个分类下的细节进行面向过程的思索

面向对象适合出力复杂的问题,适合处理多人协作的问题

对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。

面向对象

面向对象编程(Object Oriented Programming, OOP)

面向对象编程的本质就是:以类的方式组织代码,以对象的组织封装数据

三大特性:

封装

继承

多态

从认识伦的角度考虑是现有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象

从代码运行角度考虑是先有类然后才有对象,类是对象的模板

方法回顾和加深

静态方法和非静态方法的区别:

//静态方法 static

public static xxx

//非静态方法

public xxx

静态方法可以通过类名.方法名直接调用

public class Demo{

public static void main(String[]args){

Demo.student();

//或者是直接方法名:student();

}

public static String student(){

return "Hello World";

}

}

/*

*参数类型一定要和返回值类型一样,如果是void,返回值是return;

* 类名.方法名();

*/

非静态方法需要实例化一个类

Demo demo = new Demo();

demo.emptyMethods();

static与非static的区别:出现这个的原因是static是和类一起加载的,所以可以一起调用.如果不加static是在类实例化以后才会存在,所以需要实现创建实例(xx name =new xx());

值传递与引用传递

/*值传递*/

public class demo {

public static void main(String[] args) {

int a = 1;

change(a);

System.out.println(a);

}

public static void change(int a){

a=10;

}

}

//result: a=>1

/*引用传递*/

public class demo {

public static void main(String[] args) {

int[] a = {1,2,3};

change(a);

System.out.println(Arrays.toString(a));

}

public static void change(int[] a){

a[1]=10;

}

}

/*

* a {1,10,3}

*/

类与对象的关系

类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物

动物、植物、手机、电脑

Person类,Pet类,Car类

对象是抽象改变的具体实例

张三是人的一个具体的实例,张三家里的旺财就是🐶也是一个具体的实例

能够表现出特定,展现出功能的是具体的实例,而不是一个抽象的概念

主方法:

public class Application {

public static void main(String[] args) {

Student student = new Student();

student.name="张三";

student.Study();

}

}

类:

public class Student {

String name;

String age;

public void Study(){

System.out.println(this.name+"在学习");

}

}

//类实例化后会返回一个自己的对象

使用new关键字创建的时候,除了分配内存空间以外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用

类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的,并且构造器有以下两个特点:

必须和类的名字相同

必须没有返回类型,也不能写void

使用new 关键字实例化一个对象,实际是一个无参构造器,可以实例化一些对象

构造器作用:

使用new 关键字必须要有构造器

有参构造:一旦定义了有参构造,无参构造就必须显示定义

构造

public Person(){

}

public Person(String name){

this.name = name;

}

/*

* 使用new 关键字构造的时候也是需要传参

*/

Person person = new Person("xiaoming");

//自动根据你传参来选择是有参构造器还是无参构造器

new 关键字本质就是在调用构造方法

定义了有参构造之后,如果想使用无参构造,应该显式的定义一个无参的构造器

简结类与对象:

类是一个模板,对象式一个具体的实例

方法

定义、调用

对应的引用

对象是通过引用来操作的: 栈====>堆

属性:字段field成员变量

默认初始化:

数字:0 0.0

char: u0000

boolean: false

引用: null

对象的创建和使用

必须使用new 关键字创建对象,构造器; Person person = new Person();

对象的属性 person.name

对象的方法 person.sleep()

类:

静态的属性

动态的行为

面向对象的三大特性

封装

继承

多态

我们程序设计要追求"高内聚,低耦合",高内聚就是类的内部数据操作细节完成,不允许外部干涉,低耦合:仅暴露少量的方法给外部使用

封装:

通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏

属性私有,get/set

public class Application(){

public static void main(String[]args){

Student st = new Student();

st.setName("xxx")

System.out.println(st.getName());

// xxx

}

}

public Student(){

private String name;

public void setName(String paramsName){

this.name = paramsName;

}

public String getName(){

return this.name;

}

}

/*快捷键:control+return*/

封装的好处:

提高程序的安全性,保护数据

隐藏代码的实现细节

统一接口

系统维护性增加了

继承

继承的本质是对某一批类的抽象,从而实现对现实hi世界的更好建模

extends的意思是『拓展』,子类是父类的扩展

Java中只有单继承,没有多继承

继承是类和类之间的一种关系,除此以外,类与类之间的关系还有依赖,组合,聚合等

继承关系的两个类,一个为子类(派生类),一个为父类(基类),子类继承父类,使用extends表示

Object类、super、方法重写

/*父类*/

package com.Extends;

public class Person {

public void say(){

System.out.println("我具备了说话的功能;")

}

}

/*派生类,子类*/

public class Student extends Person{}

public class Teacher exntends Person{}

public class Application {

public static void main(String[] args) {

Student student = new Student();

student.say();

}

}

/*我具备了说话的功能;*/

生成student实例的条件下,继承了父类Person的功能

在Java中,所有的类都默认继承Object类

super关键字

public Application{

public static void main(){

Student student = new Stundet();

student.test1();

}

}

public class Student extends Person{

private String name = "huang";

public void test(String name){

System.out.println(name); //形参属性

System.out.println(this.name); //当前类的属性

System.out.println(super name); //继承得到父类的属性值

}

public void test1(){

print();

this.print();

super.print(); //error,对于派生类来说,私有的方法无法被继承

}

public void print(){

System.out.println("This is form Stundent");

}

}

public class Person{

protected String name = "Wallen";

private void print(){

System.out.println("This is from Person");

}

}

对于继承来说,私有的方法无法被继承;

调用父类的构造器,必须要在(super)子类的第一行,也就是说先是父类先执行,然后子类才会执行;

super注意点:

super调用父类的构造方法,必须在构造方法第一个

super必须只能出现在子类方法或者构造方法中

super和this不能同时调用构造方法

方法重写

public class Application{

public static void main(String[]args){

A a = new A();

a.test() // "A=>test()"

//父类的引用指向了子类

B b = new A();

b.test(); // "B=>test()"

}

}

public class A extends B{

public static void test(){

System.out.println("A=>test()")

}

}

public class B{

public static void test(){

System.out.println("B=>test()")

}

}

这种方法的调用只和左边定义的数据类型有关系

静态的方法和非静态的方法有很大区别:

有了static的静态方法,调用和左边定义的数据类型有关系

没有了static的方法,调用子类相当于子类重写 了父类的方法 A=>test()

多态

同一个方法可以根据发送对象不同而采用多种不同的行为方式

一个对象的实际类型确定的,但可以指向对象的引用的类型有很多

多态存在条件

继承关系

子类重写父类方法

父类引用指向子类对象

(多态是方法的多态,属性没有多态性 )

instanceof

Student s1 = new Student();

/*

* 可以指向的引用类型就不确定了:父类型的引用指向子类

*/

//父类的引用指向子类

public class Person{

public void run{

System.out.println("run")

}

}

Person s2 = new Student();

s2.run() //走的是父类的方法,子类继承了父类所有的方法

//如果子类重写了父类的方法,那么就会执行子类的方法

//

Object s3 = new Student();

对于s2来说是无法调用student的方法的,对于是否具备调用的条件取决于s2前面的类型,取决于Person的类型,Person里面没有就没法调用。

static关键字

package com.Static;

public class Student {

//static关键字表示静态变量

private static int age;

private double score;

public static void main(String[] args) {

Student student = new Student();

//类变量

System.out.println(Student.age);

}

public void run(){

//非静态的方法可以访问静态方法

//可以调用的原因是方法在初始化实例的实例就已经运行了static方法

go();

}

public static void go(){

//静态的方法可以调用静态方法,但是不能不进行初始化实例就调用非静态方法

new Student().run();

}

}

static执行顺序:

package com.Static;

public class Application {

public Application() {

System.out.println("构造方法");

}

{

System.out.println("匿名代码块");

}

static {

System.out.println("静态方法");

}

public static void main(String[] args) {

Application application = new Application();

/*

* result: 静态方法、匿名代码块、构造方法

* 1.首先得到结果静态方法,类实例初始化的时候就已经创建好了(静态方法只会被执行一次)

* 2.得到代码块结果,按照执行顺序

* 3.得到构造方法,只有创建实例的时候才会被执行

*/

}

}

静态导入包:

import java.lang.Math.random;

//error: 不被允许直接导入Math的随机数方法

如果想静态导入:

import static java.lang.Math.random;

//true 完美实现

两种写法:

import java.lang.Math;

public static void main(String[]args){

System.out.println("=======");

System.out.println(Math.random());

}

第二种写法:

import static java.lang.Math.random;

public static void main(String[]args){

System.out.println(random());

}

如果一个类被final定义了,那么就不能被继承

抽象类

abstract修饰符可以用来修饰方法,也可以修饰类,如果修饰方法,那么该方法就是抽象方法,如果修饰类,那么就是修饰类

抽象类中可以没有抽象方法,但是有抽象方法的类,一定要声明为抽象类

抽象类不能使用new关键字来创建对象,它是用来让子类继承的

抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的

子类继承抽象类,那么必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类

public abstract class Action{

//只有抽象的类名,没有抽象的实体

public abstract void doSomeThing();

}

//如果说这个类是抽象的,那么就没有必要让子类来实现这个方法,可以让孙子类来实现

public class A extends Action{

//抽象类的所有方法必须要有继承的子类来实现

@override

public void doSomeThing(){}

}

Java的类是单继承的,但是接口是多继承的

接口

声明类的关键字是class,声明接口的关键字是interface

接口的本质是契约.

//定义一个接口

public interface UserService{

public abstract void add(String name);

public abstract void delete(String name);

public abstract void updated(String name);

public abstract void query(String name);

}

public interface TimeService{

void Timer(String Time)

}

//实现一个接口里面所有的定义

public class UserServiceImpl implements UserService,TimeService{

@override

public void add(String name){

}

@override

public void delete(String name){

}

@override

public void updated(String name){

}

@override

public void query(String name){

}

@Override

public void Timer(String Time){

}

}

内部类

内部类就是在一个类的内部定义一个类,比如A类中定义了B类,那么B类相对A类来说就称之为内部类,而A类相对于B类来说就是外部类

成员内部类

静态内部类

局部内部类

匿名内部类

public class demo {

private int id;

public void out(){

System.out.println("这是外部类的方法");

}

/*静态类 class static Inner*/

class Inner{

public void in(){

System.out.println("这是内部类的方法");

}

}

}

public class Application {

public static void main(String[] args) {

demo demo = new demo();

demo.out();

//通过外部类来实例化内部类

demo.Inner inner = demo.new Inner();

inner.in();

}

}

一个java文件中可以有多个class类,但是只能有一个public class类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值